CDNを入れたのに遅い・更新されないのはなぜ?キャッシュキー・TTL・ETag・パージの設計
一部の利用者だけ古い画面になる原因を、ブラウザ・CDN・オリジンの経路から調べます。公開サイトを例に、キャッシュキー、max-ageとs-maxage、304、内容ハッシュ付きファイルの公開順序まで5件のTipsで解説します。
CDNを入れたのに遅い・更新されないのはなぜ?
まず、遅い要求がキャッシュから返ったのかを確認します。CDNは配信拠点であるエッジにコピーを保存します。ヒットならそのコピーを再利用でき、ミスなら上位キャッシュや取得元のオリジンへ進みます。ある地域のヒットが、別の地域でも同じ状態とは限りません。
ブラウザのコピー → CDNエッジのコピー → 上位キャッシュ(構成次第) → オリジンの現在の内容
調査はヒット・ミス・再検証を分ける
開発者ツールでURL・応答ヘッダー・待ち時間を確認します。利用製品のキャッシュ状態ヘッダーとオリジンログを突き合わせ、地域別にTTFB(最初のバイトまでの時間)を測ります。ブラウザのキャッシュを無効にした計測だけでは、既存利用者が古いコピーを使う症状を再現できません。
| 観測 | 考えられる経路 | 次の確認 |
|---|---|---|
| ミスだけ遅い | 上流の取得やオリジン処理を待つ | オリジンの時間、拠点、キーの分散 |
| 再検証が多い | 期限切れのコピーを上流へ確認 | 鮮度設定、検証子、変更判定の負荷 |
| 一部の利用者だけ旧版 | ブラウザや入口HTMLに旧版が残る | 実際のHTML参照先と取得したファイル名 |
キャッシュキー:同じ内容を返してよい要求だけまとめる
商品42の320px画像と640px画像は別物です。一方、utm_sourceだけが違っても本文が同じなら、追跡値をキーから外せます。オリジンへ転送する値とキャッシュキーへ含める値は別設定の場合があります。転送ヘッダーで言語や形式が変わるなら、その区別も保存側へ反映します。
/image?id=42&width=320&utm_source=mail -> key=(42,320)
/image?id=42&width=320&utm_source=ad -> key=(42,320)
/image?id=42&width=640&utm_source=mail -> key=(42,640)会員別の応答にpublicを付け、利用者IDをキーへ足すだけで安全と判断しません。このケースでは共有保存を避け、認可とキャッシュ方針を別に点検します。公開画像も、別サイズ・別言語の内容が混ざらないテストを先に通してからヒット率を調整します。
max-age・s-maxage・ETagを使い分ける
Cache-Control: public, max-age=0, s-maxage=300
ETag: "directory-v7"RFC 9111ではs-maxageが共有キャッシュの鮮度を上書きします。この例のブラウザは再利用時に確認し、CDNは新鮮なコピーで応答できます。Ageが240秒なら共有側の鮮度は約60秒残り、ブラウザの確認が毎回オリジンへ届くわけではありません。実際には最小TTL・上書きルール・キャッシュ対象の設定も照合します。
期限切れのコピーをIf-None-Matchで確認し、変更がなければ304で本文を再利用できます。2MBのJSONならオリジンからの本文の再転送は省けますが、確認の往復と変更判定は残ります。CloudFrontではCookie転送時の条件付き要求などに制約があるため、ETagが付いているだけで期待どおり動くとは決めつけません。
パージ後も古い:ファイル名とHTMLの公開順序を直す
同じ/app.jsを上書きしても、長い鮮度を持つブラウザのコピーはCDNのパージ対象ではありません。内容ハッシュ付きの/app.c3d4.jsを新URLで公開し、入口HTMLをそのURLへ更新します。入口HTMLが古ければ旧URLを参照し続けるため、HTML自体の再検証・共有側の許容遅延も設計します。
- 新しいJS・CSS・画像を公開し、取得できることを確認する。内容の変わらないURLとして扱う。
- 入口HTMLの参照を切り替え、必要ならHTMLのCDN無効化完了を確認する。
- 旧HTMLや開いたままの画面が参照する期間は旧ファイルを保持する。
- 新規・既存利用者と複数地域で、HTMLの参照先と実行中の版を確認する。
改善は速度・正しさ・更新反映で確認する
ヒットとミスを地域別に測り、オリジン要求数・本文転送量・エラーも比較します。再検証をヒットに数えるかは製品で違うため、指標の定義を揃えます。鮮度を300秒へ延ばした結果を「常に最新」と説明せず、許容した古さと実際の反映時間を利用者向け要件として確認します。
参考にした一次資料
以下の公式資料は2026年10月27日に確認しました。数値例とシナリオは独自の仮定です。設定例は説明用で、実サービスでの実行や性能測定は行っていません。
- CloudFront — Delivery path
- Cloudflare — Cache keys
- RFC 9111 — HTTP Caching
- CloudFront — Conditional GET
- Cloudflare — Browser Cache TTL
- CloudFront — Invalidation and versioned names