キャッシュキーを理解する - Amazon CloudFront

キャッシュキーを理解する

キャッシュキーは、CloudFront エッジロケーションへのビューワーリクエストによってキャッシュヒットが発生するかどうかを決定します。キャッシュキーは、キャッシュ内のオブジェクトの固有の識別子です。キャッシュ内の各オブジェクトには、固有のキャッシュキーがあります。

キャッシュヒットは、ビューワーリクエストが以前のリクエストと同じキャッシュキーを生成し、そのキャッシュキーのオブジェクトがエッジロケーションのキャッシュにあり、有効な場合に発生します。キャッシュヒットが発生すると、リクエストされたオブジェクトが CloudFront エッジロケーションからビューワーに提供されます。これには以下のような利点があります。

  • オリジンサーバーの負荷を軽減

  • ビューワーのレイテンシーを低減

キャッシュヒット率が高い (キャッシュヒットにつながるビューワーリクエストの割合が高い) ほど、ウェブサイトやアプリケーションのパフォーマンスが高くなります。キャッシュヒット率を改善する 1 つの方法は、キャッシュキーに必要な最小値のみを含めることです。詳細については、次のセクションを参照してください。

キャッシュポリシーを使用して、キャッシュキーの値 (URL クエリ文字列、HTTP ヘッダー、および Cookie) を変更できます。(Lambda@Edge 関数を使用してキャッシュキーを変更することもできます)。キャッシュキーを変更する前に、アプリケーションの設計方法と、ビューワーリクエストの特性に基づいてさまざまなレスポンスをいつ、どのように処理するかを理解することが重要です。ビューワーリクエストの値によってオリジンが返すレスポンスが決定された場合は、その値をキャッシュキーに含める必要があります。しかし、オリジンが返すレスポンスに影響を与えない値をキャッシュキーに含めると、重複したオブジェクトをキャッシュしてしまう可能性があります。

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

デフォルトでは、CloudFront ディストリビューションのキャッシュキーには以下の情報が含まれます。

  • CloudFront ディストリビューションのドメイン名 (d111111abcdef8.cloudfront.net など)

  • リクエストされたオブジェクトの URL パス (例: /content/stories/example-story.html)

注記

この OPTIONS メソッドは、OPTIONS リクエストのキャッシュキーに含まれます。つまり、OPTIONS リクエストへのレスポンスは、GET リクエストおよび HEAD リクエストへのレスポンスとは別にキャッシュされます。

デフォルトでは、ビューワーリクエストのその他の値はキャッシュキーに含まれません。ウェブブラウザからの次の HTTP リクエストを考えてみましょう。

GET /content/stories/example-story.html?ref=0123abc&split-pages=false HTTP/1.1 Host: d111111abcdef8.cloudfront.net User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/68.0 Accept: text/html,*/* Accept-Language: en-US,en Cookie: session_id=01234abcd Referer: https://news.example.com/

この例のようなビューワーリクエストが CloudFront エッジロケーションに到達すると、CloudFront はキャッシュキーを使用してキャッシュヒットがあるかどうかを判断します。デフォルトでは、リクエストの /content/stories/example-story.html および d111111abcdef8.cloudfront.net コンポーネントのみがキャッシュキーに含まれます。リクエストされたオブジェクトがキャッシュにない場合 (キャッシュミス)、CloudFront は、オブジェクトを取得するためのリクエストをオリジンに送信します。オブジェクトを取得した後、CloudFront はビューワーに返し、エッジロケーションのキャッシュに保存します。

CloudFront が、キャッシュキーによって決定された同じオブジェクトに対する別のリクエストを受信すると、CloudFront はオリジンにリクエストを送信することなく、キャッシュされたオブジェクトをビューワーに即座に配信します。たとえば、前のリクエストの後に入ってくる次の HTTP リクエストを考えてみましょう。

GET /content/stories/example-story.html?ref=xyz987&split-pages=true HTTP/1.1 Host: d111111abcdef8.cloudfront.net User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/83.0.4103.116 Accept: text/html,*/* Accept-Language: en-US,en Cookie: session_id=wxyz9876 Referer: https://rss.news.example.net/

このリクエストは、前のリクエストと同じオブジェクトに対するものですが、前のリクエストとは異なります。これは、異なる URL クエリ文字列、異なる Referer ヘッダーと User-Agent ヘッダー、および異なる session_id Cookie を持っています。ただし、これらの値はデフォルトではキャッシュキーの一部ではないので、この 2 番目のリクエストはキャッシュヒットになります。

キャッシュキーをカスタマイズする

場合によっては、キャッシュキーにさらに多くの情報を含める必要がありますが、そうするとキャッシュのヒット数が少なくなることがあります。キャッシュポリシーを使用して、キャッシュキーに含める内容を指定します。

たとえば、オリジンサーバーがビューワーリクエストで Accept-Language HTTP ヘッダーを使用して、ビューワーの言語に基づいて異なるコンテンツを返す場合、このヘッダーをキャッシュキーに含めることができます。これを行うと、CloudFront はこのヘッダーを使用してキャッシュヒットを特定し、オリジンリクエスト (キャッシュミスが発生したときにオリジン CloudFront に送信するリクエスト) にヘッダーを含めます。

キャッシュキーに追加の値を含めると、ビューワーリクエストで発生する可能性のある変化により、CloudFront が重複したオブジェクトをキャッシュする可能性があります。たとえば、ビューワーは、Accept-Language ヘッダーに対して次の値のいずれかを送信できます。

  • en-US,en

  • en,en-US

  • en-US, en

  • en-US

これらの異なる値はすべて、ビューワーの言語が英語であることを示していますが、変化によって CloudFront が同じオブジェクトを複数回キャッシュする可能性があります。これにより、キャッシュヒットを減らし、オリジンリクエストの数を増やすことができます。キャッシュキーに Accept-Language ヘッダーを含めず、異なる言語のコンテンツに異なる URL を使用するようにウェブサイトまたはアプリケーションを設定することで、この重複を避けることができます (例: /en-US/content/stories/example-story.html)。

キャッシュキーに含める任意の値については、その値のバリエーションがビューワーリクエストに表示される可能性があることを理解しておく必要があります。特定のリクエスト値については、キャッシュキーに含めることはほとんど意味がありません。たとえば、User-Agent ヘッダーには何千もの固有のバリエーションがあるため、通常はキャッシュキーに含めるには適していません。ユーザー固有の値またはセッション固有の値を持ち、何千もの (または数百万) のリクエストで固有の Cookie も、キャッシュキーを含む候補には適していません。キャッシュキーにこれらの値を含めると、それぞれ固有のバリエーションによって、キャッシュ内のオブジェクトの別のコピーが作成されます。オブジェクトのこれらのコピーが固有でない場合、またはわずかに異なるオブジェクトが多数作成され、各オブジェクトが少数のキャッシュヒットのみを取得する場合は、別のアプローチを検討することをお勧めします。これらの非常に可変性の高い値をキャッシュキーから除外することも、オブジェクトをキャッシュ不可能としてマークすることもできます。

キャッシュキーをカスタマイズするときは注意が必要です。時には望ましいことがありますが、重複オブジェクトのキャッシュ、キャッシュヒット率の低下、オリジンリクエスト数の増加など、意図しない結果が生じる可能性があります。オリジンのウェブサイトまたはアプリケーションが、分析、テレメトリー、またはその他の用途に対するビューワーリクエストから特定の値を受け取る必要があるが、これらの値によってオリジンが返すオブジェクトが変更されない場合は、オリジンリクエストポリシーを使用してこれらの値をオリジンリクエストに含めますが、キャッシュキーには含めません