第4章 — CDN キャッシュ: 世界を近づける
「物理法則には勝てない」
「どんなにサーバーを速くしても、東京のユーザーがニューヨークのサーバーにアクセスすれば、光の速さでも往復130ms かかる」
ケンジはそう言った。「物理法則には勝てない。でも、データをユーザーの近くに置くことはできる。それが CDN だ」
CDN の仕組み
CDN(Content Delivery Network)は、世界中に分散したエッジサーバーにコンテンツをキャッシュし、ユーザーに最も近いサーバーから配信する。AWS では CloudFront がこの役割を担う。
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 キャッシュの最大の課題は無効化だ。
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 Workers | V8 Isolate | API、A/Bテスト、認証 |
| AWS Lambda@Edge | Node.js | リクエスト/レスポンス変換 |
| Vercel Edge Functions | V8 | SSR、パーソナライゼーション |
AWS CloudFront の設計ポイント
FreshMarket は AWS 上で動いているため、CloudFront を CDN として採用した。
オリジンシールド
CloudFront のオリジンシールドは、エッジとオリジンの間に中間キャッシュ層を追加する。複数エッジからの同時ミスを1リクエストにまとめ、オリジンの負荷を軽減する。
CloudFront Functions vs Lambda@Edge
| 機能 | CloudFront Functions | Lambda@Edge |
|---|---|---|
| 実行タイミング | Viewer request/response | Origin request/response |
| 言語 | JavaScript | Node.js / Python |
| 最大実行時間 | 1ms | 30秒 |
| 用途 | ヘッダー操作、リダイレクト | SSR、A/Bテスト、認証 |
| 料金 | 安い | 高い |
キャッシュポリシーとオリジンリクエストポリシー
CloudFront ではキャッシュポリシーとオリジンリクエストポリシーを分離している。
キャッシュポリシー: キャッシュキーに何を含めるか
→ Accept-Encoding のみ(静的アセット)
→ Authorization は含めない
オリジンリクエストポリシー: オリジンに何を転送するか
→ Host, X-Forwarded-For 等
INFO
CloudFront のキャッシュポリシー分離は Cache Poisoning 対策に有効。キャッシュキーに含めるヘッダーと、オリジンに転送するヘッダーを独立に制御できる。
マナミの CDN 設計
FreshMarket は CloudFront を導入し、以下の戦略を適用した:
| コンテンツ | CDN キャッシュ | ブラウザキャッシュ | パージ方法 |
|---|---|---|---|
| 静的アセット | 1年 | 1年 | デプロイ時に全パージ |
| 商品画像 | 1ヶ月 | 1日 | 画像更新時にURL指定 |
| 商品一覧API | 5分 | 1分 | タグベース |
| 商品詳細API | 10分 | なし | タグベース |
| HTML | 1分 | なし(SWR 5分) | 全パージ |
導入後、世界中のユーザーの平均レスポンスタイムが 85% 改善した。
次の章では、サーバー内部のアプリケーションキャッシュを学ぶ。