mybook

第4章 — CDN キャッシュ: 世界を近づける

「物理法則には勝てない」

「どんなにサーバーを速くしても、東京のユーザーがニューヨークのサーバーにアクセスすれば、光の速さでも往復130ms かかる」

ケンジはそう言った。「物理法則には勝てない。でも、データをユーザーの近くに置くことはできる。それが CDN だ」

CDN の仕組み

CDN(Content Delivery Network)は、世界中に分散したエッジサーバーにコンテンツをキャッシュし、ユーザーに最も近いサーバーから配信する。AWS では CloudFront がこの役割を担う。

Loading diagram...
Loading chart...

CDN キャッシュの制御

Cache-Control との連携

CDN は s-maxage を優先的に使い、ブラウザは max-age を使う。

Cache-Control: public, max-age=60, s-maxage=3600
  • ブラウザ: 60秒間キャッシュ
  • CDN: 3600秒間(1時間)キャッシュ

Surrogate-Control

CDN 固有のキャッシュ制御。CDN が処理した後、クライアントには送られない。

Surrogate-Control: max-age=86400
Cache-Control: no-cache

CDN には1日キャッシュさせるが、ブラウザには毎回検証させる。

キャッシュパージ(無効化)

CDN キャッシュの最大の課題は無効化だ。

Loading diagram...

Cloudflare のキャッシュタグ

# レスポンスヘッダー
Cache-Tag: product-123, category-electronics, homepage

# パージ API
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone}/purge_cache" \
  -H "Authorization: Bearer {token}" \
  -d '{"tags": ["product-123"]}'

INFO

タグベースパージが最も柔軟。商品が更新されたら product-123 タグをパージするだけで、その商品を含むすべてのページのキャッシュが無効化される。

エッジコンピューティング

2025年以降、CDN は単なるキャッシュからエッジコンピューティングプラットフォームへ進化している。

サービス実行環境用途
Cloudflare WorkersV8 IsolateAPI、A/Bテスト、認証
AWS Lambda@EdgeNode.jsリクエスト/レスポンス変換
Vercel Edge FunctionsV8SSR、パーソナライゼーション
Loading diagram...

AWS CloudFront の設計ポイント

FreshMarket は AWS 上で動いているため、CloudFront を CDN として採用した。

オリジンシールド

CloudFront のオリジンシールドは、エッジとオリジンの間に中間キャッシュ層を追加する。複数エッジからの同時ミスを1リクエストにまとめ、オリジンの負荷を軽減する。

Loading diagram...

CloudFront Functions vs Lambda@Edge

機能CloudFront FunctionsLambda@Edge
実行タイミングViewer request/responseOrigin request/response
言語JavaScriptNode.js / Python
最大実行時間1ms30秒
用途ヘッダー操作、リダイレクトSSR、A/Bテスト、認証
料金安い高い

キャッシュポリシーとオリジンリクエストポリシー

CloudFront ではキャッシュポリシーオリジンリクエストポリシーを分離している。

キャッシュポリシー: キャッシュキーに何を含めるか
  → Accept-Encoding のみ(静的アセット)
  → Authorization は含めない

オリジンリクエストポリシー: オリジンに何を転送するか
  → Host, X-Forwarded-For 等

INFO

CloudFront のキャッシュポリシー分離は Cache Poisoning 対策に有効。キャッシュキーに含めるヘッダーと、オリジンに転送するヘッダーを独立に制御できる。

マナミの CDN 設計

FreshMarket は CloudFront を導入し、以下の戦略を適用した:

コンテンツCDN キャッシュブラウザキャッシュパージ方法
静的アセット1年1年デプロイ時に全パージ
商品画像1ヶ月1日画像更新時にURL指定
商品一覧API5分1分タグベース
商品詳細API10分なしタグベース
HTML1分なし(SWR 5分)全パージ

導入後、世界中のユーザーの平均レスポンスタイムが 85% 改善した。

次の章では、サーバー内部のアプリケーションキャッシュを学ぶ。