テック技報最新号へ →
インフラ

CloudFront: キャッシュキーは Cache Policy、オリジンに渡す値は Origin Request Policy で分けて決める

オリジンが必要とするヘッダー・クエリ・Cookie を全部キャッシュキーに入れるとヒット率が落ちる。キーに入れるのは「レスポンスが変わる値」だけにし、オリジンが見たいだけの値は Origin Request Policy で転送する。

@dkfj · 2026-10-21
#infra#aws#cloudfront#cdn#cache

どんなときに使う?

  • CloudFront のヒット率が思ったより低い
  • オリジンが分析やログのために User-Agent や追跡用クエリ、Cookie を見たいが、それでキャッシュが細切れになっている
  • レガシーのキャッシュ設定(「ヘッダーを転送」)から移行するとき

考え方

  • Cache Policy: キャッシュキーに含めるヘッダー・Cookie・クエリ文字列と TTL、圧縮の扱いを決める。キーに入れた値は自動的にオリジンへのリクエストにも含まれる
  • Origin Request Policy: キャッシュミス時のオリジンへのリクエストに 追加で 含める値を決める。ここに入れた値はキャッシュキーには影響しない
  • どちらもキャッシュビヘイビアに付ける。パスごとに組み合わせを変えられる

やり方

  1. 値ごとに「これが違うとレスポンスの中身が変わるか」を判定する
    • 変わる(例: 言語切り替えの Accept-Language、ページ番号のクエリ)→ Cache Policy に入れる
    • 変わらないがオリジンが見たい(例: 計測用クエリ、ログ用ヘッダー、CloudFront が付けるビューワー国ヘッダー)→ Origin Request Policy に入れる
    • どちらも不要 → 何も入れない(デフォルトではパス・ボディ・Host など最低限しか渡らない)
  2. Header / Query / Cookie はそれぞれ「なし/許可リスト/全部(Cookie・クエリは除外リストも可)」で指定できる。全部入れるのはヒット率を最も下げるので、許可リストを基本にする
  3. まずマネージドポリシー(例: キャッシュ用の CachingOptimized、オリジン用の AllViewer 系)で足りるか確認し、足りなければカスタムを作る
  4. 変更後はヒット率(CloudFront のレポートやログの x-edge-result-type)を見て効果を確かめる

注意点

  • レガシーのキャッシュ設定ではヘッダーを転送するとそのままキャッシュキーにも入る。ポリシー方式に移すと分けて扱える
  • 認証が必要なコンテンツで Authorization などをキーから外すと、別ユーザーのレスポンスが返る事故につながる。外してよいのは中身が変わらない値だけ
  • gRPC のリクエストはキャッシュされないので、キャッシュ設定は効かない

出典

X の元の投稿を開く