Dev Study
AWSサービスの内部原理 コース

101. CloudFrontは多段のキャッシュでオリジンを守る — POP・リージョナルエッジキャッシュ・Origin Shieldの三段構え

世界中に散らばったキャッシュが、ユーザーとオリジンのあいだにどう「木」を作るのか——1台のキャッシュではなく階層で守るしくみを、3枚の図で追っていきます。

① 最寄りのPOPで返す

ユーザー画像やHTMLを要求
キャッシュを確認
POPエッジロケーション
典型的には最寄りのPOP
ヒット: 即返すここで旅は終わり
ミス: ②へオリジンへ取りに行く
  • "DNS routes the request to the CloudFront POP (edge location) that can best serve the request, typically the nearest CloudFront POP in terms of latency."(公式)
  • POP = point of presence = edge location。同じものの別名。
  • ヒットすればオリジンまで旅する必要はない。

CDNの第一原理は「ユーザーの近くにコピーを置き、近いキャッシュで返す」こと。ヒットすればオリジンには一切触れない——これがキャッシュ階層の一番外側の枝。

② first byteから流し始める

POPキャッシュミス
オブジェクトを返送
オリジンS3バケット / HTTPサーバー
first byteが届いた瞬間から同時に2方向へ
POPが受信開始
全体の到着を待たない
ユーザーへ転送届いた端から流す
キャッシュへ保存次回はヒットに変わる
  • "As soon as the first byte arrives from the origin, CloudFront begins to forward the object to the user. CloudFront also adds the object to the cache for the next time someone requests it."(公式)
  • CloudFrontはオリジンとの持続的接続(persistent connections)を保ち、できるだけ速く取りに行く。

ミスのコストは「取りに行く時間」だが、ストリーミングでその体感を薄め、保存で次回をヒットに変える。持続的接続の維持は、API Gateway編のリバースプロキシがバックエンドへ張りっぱなしの接続を保つのと同じ発想——毎回つなぎ直さない。

③ 中間層リージョナルエッジキャッシュ

ユーザー
ミスならRECへ
POP小・最速・最寄り
ヒットなら即返す
それでもミスならオリジンへ(返送後RECとPOPに保存)
RECPOPより大きな容量
同リージョンの全POPが共有
オリジン真実の源
  • "Regional edge caches have a larger cache than an individual POP, so objects remain in the cache longer at the nearest regional edge cache location."(公式)——POPから追い出された(人気が落ちた)オブジェクトもRECにはまだ残る。
  • "This makes sure that all of the POPs in a region share a local cache, eliminating multiple requests to origin servers."(公式)
  • RECはPOPとオリジンのあいだに位置する(between your origin server and the POPs)。
  • RECヒット時もfirst byteが届き次第ユーザーへ転送を開始し、POPにも保存する。
  • 人気の階層=キャッシュの階層: 熱いものはPOP(小・最速)、追い出されたものはREC(大・リージョン共有の落ち穂拾い)、冷たい真実の源はオリジン。

RECを経由することで、同リージョンの全POPがひとつのキャッシュを共有し、同じオブジェクトを求めるオリジンへの重複リクエストが消える。これはレッスン1のメモリ階層(L1/L2/L3キャッシュ)のインターネット規模版——L1(POP)に無ければL2(REC)、それでも無ければ主記憶(オリジン)、という段構えが地理的な階層として再登場する。

④ 階層を素通りする例外

POPでミスさてどこへ転送?
左の3つはRECを通らない
書き込み系PUT/POST/PATCH/OPTIONS/DELETE
動的リクエストリクエスト時に判定
S3が同リージョン最適なRECがS3と同リージョン
通常のGET/HEAD③の流れでRECを経由
オリジンへ直行中間層を素通り
  • "Proxy HTTP methods (PUT, POST, PATCH, OPTIONS, and DELETE) go directly to the origin from the POPs and do not proxy through the regional edge caches."(公式)——キャッシュしない書き込みに中間層は不要。
  • "Dynamic requests, as determined at request time, do not flow through regional edge caches, but go directly to the origin."(公式)
  • "When the origin is an Amazon S3 bucket and the request's optimal regional edge cache is in the same AWS Region as the S3 bucket, the POP skips the regional edge cache and goes directly to the S3 bucket."(公式)
  • RECはPOPとfeature parity(キャッシュ無効化なども両方に効く)。

キャッシュに価値がある読み取りだけを階層に通し、書き込み・動的・近道は素通りさせる。「何をどの層まで運ぶか」の判断が、無駄な往復を削る。

⑤ Origin Shieldに集約

POP世界中のエッジ
POP
POP
複数のRECが別々にオリジンを叩きうる→手前で集約
RECリージョンごとの中間層
REC
キャッシュに無いときだけ
Origin ShieldRECの上に構築された追加の1層
全階層のオリジン向けリクエストが通る
オリジン届く重複が最小化
  • "When you use Origin Shield, all requests from all of CloudFront's caching layers to your origin go through Origin Shield, increasing the likelihood of a cache hit."(公式)
  • "all other layers of the CloudFront cache (edge locations and regional edge caches) can retrieve the object from Origin Shield."(公式)
  • Origin Shieldはregional edge cacheの上に構築され、少なくとも3つのAvailability Zoneを使う。primaryが落ちればsecondaryへ自動ルーティング。
  • 注意: オリジンと同じリージョンで発生したリクエストはOrigin Shieldをバイパスする("Requests that are made in the same region as your origin will bypass Origin Shield.")。
  • 有効化リージョンはオリジンへのレイテンシが最も低いリージョンを選ぶ。オリジンが提供リージョン内にあるなら、同じリージョンで有効化する(公式)。

木の枝(POP)と幹の途中(REC)を、根元でひとつの節点(Origin Shield)に束ねる構造。層が増えるほど、オリジンに届く前にヒットする確率が上がる。

⑥ リクエスト合流でstampedeを防ぐ

時刻Tあるオブジェクトのキャッシュが切れる
同一オブジェクトへの同時要求を合流(consolidate)
reqmiss
reqmiss
reqmiss
reqmiss
as few as one request
Origin Shieldrequest collapsing
オリジン殺到しても届くのは最少1本
  • "Requests for content that is not in Origin Shield's cache are consolidated with other requests for the same object, resulting in as few as one request going to your origin."(公式)
  • cache stampede = キャッシュ切れの瞬間に全員がオリジンへ殺到する事故。TTLが切れた直後に起きる。
  • ログでの現れ方: Origin Shieldからのキャッシュヒットはx-edge-detailed-result-typeフィールドにOriginShieldHitとして出る(RECがOrigin Shieldとして振る舞い、そこでヒットした場合はHitと記録)。
  • 提供リージョン(執筆時に現行ドキュメントで確認・全13リージョン): us-east-1 / us-east-2 / us-west-2 / ap-south-1 / ap-northeast-1 / ap-northeast-2 / ap-southeast-1 / ap-southeast-2 / eu-central-1 / eu-west-1 / eu-west-2 / sa-east-1 / me-central-1(UAE)。
  • 特に効く場面: JITパッケージング(ライブ配信の都度生成)/ オンザフライ画像変換・画像処理 / キャパシティや帯域に制約のあるオンプレのオリジン / マルチCDN構成(CloudFrontを他CDNのオリジンに)。

「同一リソースへの同時リクエストを1つに束ねる」リクエスト合流は、Step Functions編のジッター(thundering herdを時間でバラす)に対する空間側の答え——時間で散らすか、空間で束ねるか。1台のキャッシュではなく『木』を作る。枝が太くなるほどオリジンは静かになる。

公式ドキュメントで詳しく ↗