🔑

CloudFrontのキャッシュキーってなに?

に公開

はじめに

CloudFrontを設定するとき、キャッシュキーをあまり理解できていないなと感じたので、キャッシュキーについてまとめました。

キャッシュキーとは?

ユーザーのリクエストに含まれる特定の情報を使って、「どのキャッシュを返すか」を判断するための条件セットです。

CloudFrontは、ユーザーのリクエストからキャッシュキーを作り、キャッシュ内のキーと照合します。

  • 一致すればキャッシュを返す(キャッシュヒット)
  • 一致しなければオリジンにリクエストを転送して取得(キャッシュミス)
  • ミスの場合でも、取得したレスポンスはキャッシュされ、次回以降はヒットする可能性があります

キャッシュキーの構成要素

構成要素 必須/選択
ディストリビューションのドメイン名 必須 d111111abcdef8.cloudfront.net
URLパス 必須 /index.html
クエリ文字列 選択 ?lang=ja
HTTPヘッダ 選択 Accept-Language
Cookie 選択 session_id=01234abcd

上記の構成要素は、キャッシュキーに含められる情報です。
デフォルトではディストリビューションのドメイン名URLパスのみがキャッシュキーとして使われます。
「選択」として示した要素(クエリ文字列,HTTPヘッダ,Cookie)は、キャッシュポリシーで追加指定することでキャッシュキーに含めることができます。

デフォルトキャッシュキーの挙動例

ディストリビューションのドメイン名URLパスだけのデフォルトキャッシュキーの場合を考えてみます

# リクエスト例1
GET /index.html?lang=ja
# リクエスト例2
GET /index.html?lang=en

上記の2つのリクエストの場合、デフォルトキャッシュキーにはクエリ文字列がキャッシュキーに含まれないため、同じキャッシュが返されます。
違うキャッシュを返したい場合は、クエリ文字列をキャッシュキーに含める必要があります。

必要に応じてクエリ文字列HTTPヘッダCookieをキャッシュキーに追加すると、オリジンレスポンスに応じた適切なキャッシュ制御が可能です。

キャッシュキー設計の注意点

キャッシュキーには、オリジンのレスポンスを変える要素だけを含めることが原則です。

キャッシュキーに影響しない要素を含めると、同じ内容でも別キャッシュとして扱われ、ヒット率が下がります。
例えば User-Agent をキーにすると、iPhone・Android・PCで同じページでも別キャッシュ扱いになり、効率が悪くなります。

まとめ

  • キャッシュキーは「どのキャッシュを返すか」を判断するための条件セット
  • デフォルトではディストリビューション名+URLパスのみ
  • クエリ文字列、ヘッダー、Cookieは必要に応じて追加可能
  • 設計の基本原則:オリジンのレスポンスを変える要素だけを含める
  • 不要な要素を含めるとヒット率低下や重複キャッシュの原因になる

参考

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/understanding-the-cache-key.html

Discussion