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

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

キャッシュポリシーを使用して、キャッシュキーに含まれる値 (URL クエリ文字列、HTTP ヘッダー、Cookie) を管理することで、キャッシュヒット率を改善できます。CloudFront には、一般的なユースケース用にマネージドポリシーと呼ばれる事前定義されたオリジンリクエストポリシーがいくつか用意されています。これらのマネージドポリシーを使用することも、ユーザーのニーズ別に独自のキャッシュポリシーを作成することもできます。マネージドポリシーの詳細については、「マネージドキャッシュポリシーを使用する」を参照してください。

キャッシュポリシーには以下の設定が含まれます。設定は、ポリシー情報Time to live (TTL) 設定、およびキャッシュキー設定に分類されます。

ポリシー情報

名前

キャッシュポリシーを特定する名前。コンソールでは、名前を使用して、キャッシュポリシーをキャッシュ動作にアタッチします。

説明

キャッシュポリシーを説明するコメント。これはオプションですが、キャッシュポリシーの目的を特定するのに役立ちます。

Time to live (TTL) 設定

Time to live (TTL) 設定は、Cache-Control および Expires HTTP ヘッダー (オリジンレスポンス内にある場合) と連動して、CloudFront キャッシュ内のオブジェクトの有効期間を決定します。

最小 TTL

CloudFront がオリジンをチェックしてオブジェクトが更新されているかどうかを確認するまでに、オブジェクトが CloudFront キャッシュに保持される最小期間 (秒単位)。詳細については、「コンテンツをキャッシュに保持する期間 (有効期限) を管理する」を参照してください。

最大 TTL

CloudFront がオリジンをチェックしてオブジェクトが更新されているかどうかを確認するまでに、オブジェクトが CloudFront キャッシュに保持される最大期間 (秒単位)。CloudFront は、オリジンがオブジェクトと共に Cache-Control または Expires ヘッダーを送信する場合のみ、この設定を使用します。詳細については、「コンテンツをキャッシュに保持する期間 (有効期限) を管理する」を参照してください。

デフォルト TTL

CloudFront がオリジンをチェックしてオブジェクトが更新されているかどうかを確認するまでに、オブジェクトを CloudFront キャッシュに保持するデフォルトの時間 (秒単位)。CloudFront は、オリジンがオブジェクトと共に Cache-Control ヘッダーまたは Expires ヘッダーを送信しない場合にのみ、この設定の値をオブジェクトの TTL として使用します。詳細については、「コンテンツをキャッシュに保持する期間 (有効期限) を管理する」を参照してください。

注記

[最小 TTL][最大 TTL][デフォルト TTL] の設定がすべて 0 に設定されている場合、CloudFront のキャッシュは無効になります。

キャッシュキー設定

キャッシュキーの設定では、CloudFront によりキャッシュキーに含まれるビューワーリクエストの値を指定します。値には、URL クエリ文字列、HTTP ヘッダー、および Cookie を含めることができます。キャッシュキーに含める値は、CloudFront がオリジンに送信するリクエスト (オリジンリクエストと呼ばれる) に自動的に含まれます。キャッシュキーに影響を与えずにオリジンリクエストを管理する方法については、「ポリシーを使用してオリジンリクエストを制御する」を参照してください。

キャッシュキーには次のような設定があります。

ヘッダー

CloudFront によりキャッシュキーおよびオリジンリクエストに含まれる、ビューワーリクエストの HTTP ヘッダー。ヘッダーには、以下のいずれかの設定を選択できます。

  • [None (なし)] - ビューワーリクエストの HTTP ヘッダーはキャッシュキーに含まれず、オリジンリクエストに自動的に含まれません

  • [次のヘッダーを含める] - ビューワーリクエストのどの HTTP ヘッダーをキャッシュキーに含め、オリジンリクエストに自動的に含めるかを指定します。

[次のヘッダーを含める] 設定を使用する場合、HTTP ヘッダーは値ではなく名前で指定します。たとえば、次の HTTP ヘッダーを考えてみます。

Accept-Language: en-US,en;q=0.5

この場合、ヘッダーを Accept-Language: en-US,en;q=0.5 としてではなく、Accept-Language として指定します。ただし、CloudFront では、キャッシュキーおよびオリジンリクエストに、その値を含む完全なヘッダーが含まれます。

CloudFront によって生成された特定のヘッダーをキャッシュキーに含めることもできます。詳細については、「CloudFront のリクエストヘッダーを追加する」を参照してください。

Cookie

CloudFront によりキャッシュキーおよびオリジンリクエストに含まれる、ビューワーリクエストの Cookie。Cookie には、以下のいずれかの設定を選択できます。

  • [None (なし)] - ビューワーリクエストの Cookie はキャッシュキーに含まれず、オリジンリクエストに自動的に含まれません

  • [All (すべて)] - ビューワーリクエストのすべての Cookie は、キャッシュキーに含まれ、オリジンリクエストに自動的に含まれます。

  • [指定した Cookie を含める] - ビューワーリクエストのどの Cookie をキャッシュキーに含め、オリジンリクエストに自動的に含めるかを指定します。

  • [次を除くすべての Cookie を含める] - ビューワーリクエストのどの Cookie をキャッシュキーに含めず、オリジンリクエストに自動的に含めないかを指定します。指定した Cookie 以外の他のすべての Cookie は、キャッシュキーに含まれ、自動的にオリジンリクエストに含まれます。

[指定した Cookie を含める] または [次を除くすべての Cookie を含める] 設定を使用する場合、Cookie は値ではなく名前で指定します。たとえば、次の Cookie ヘッダーを考えてみます。

Cookie: session_ID=abcd1234

この場合、Cookie を session_ID=abcd1234 としてではなく、session_ID として指定します。ただし、CloudFront では、キャッシュキーおよびオリジンリクエストに、その値を含む完全な Cookie が含まれます。

クエリ文字列

CloudFront によりキャッシュキーおよびオリジンリクエストに含まれる、ビューワーリクエストの URL クエリ文字列。クエリ文字列には、以下のいずれかの設定を選択できます。

  • [None (なし)] - ビューワーリクエストのクエリ文字列はキャッシュキーに含まれず、オリジンリクエストに自動的に含まれません

  • [All (すべて)] - ビューワーリクエストのすべてのクエリ文字列は、キャッシュキーに含まれ、オリジンリクエストにも自動的に含まれます。

  • [指定したクエリ文字列を含める] - ビューワーリクエストのどのクエリ文字列をキャッシュキーに含め、オリジンリクエストに自動的に含めるかを指定します。

  • [次を除くすべてのクエリ文字列を含める] - ビューワーリクエストのどのクエリ文字列をキャッシュキーに含めず、オリジンリクエストに自動的に含めないかを指定します。指定したクエリ文字列以外の他のすべてのクエリ文字列は、キャッシュキーに含まれ、自動的にオリジンリクエストに含まれます。

[指定したクエリ文字列を含める] または [次を除くすべてのクエリ文字列を含める] 設定を使用する場合、クエリ文字列は値ではなく名前で指定します。たとえば、次の URL パスを考えてみます。

/content/stories/example-story.html?split-pages=false

この場合、クエリ文字列を split-pages=false としてではなく、split-pages として指定します。ただし、CloudFront では、キャッシュキーおよびオリジンリクエストに、その値を含む完全なクエリ文字列が含まれます。

圧縮のサポート

これらの設定により、Gzip または Brotli 圧縮形式で圧縮されたオブジェクトを CloudFront がリクエストおよびキャッシュできるようになります (ビューワーでサポートされている場合)。これらの設定により、CloudFront 圧縮も有効になります。ビューワーは Accept-Encoding HTTP ヘッダーを使用して、これらの圧縮形式のサポートの可否を示します。

注記

ウェブブラウザ Chrome および Firefox では、HTTPS を使用してリクエストを送信する場合のみ、Brotli 圧縮がサポートされます。これらのブラウザでは、HTTP リクエストで Brotli がサポートされません。

次のいずれかに該当する場合は、これらの設定を有効にします。

  • ビューワーによってサポートされている場合にオリジンが Gzip 圧縮オブジェクトを返す (リクエストには、HTTPヘッダー Accept-Encoding と値 gzip が含まれます)。この場合、Gzip が有効化された設定を使用します (CloudFront API、AWS SDK、AWS CLI、または AWS CloudFormation で EnableAcceptEncodingGziptrue に設定します)。

  • ビューワーによってサポートされている場合にオリジンが Brotli 圧縮オブジェクトを返す (リクエストには、HTTPヘッダー Accept-Encoding と値 br が含まれます)。この場合、Brotli が有効化された設定を使用します (CloudFront API、AWS SDK、AWS CLI、または AWS CloudFormation で EnableAcceptEncodingBrotlitrue に設定します)。

  • このキャッシュポリシーが適用されるキャッシュ動作は、CloudFront 圧縮によって設定されます。この場合、Gzip または Brotli のいずれか、またはその両方に対してキャッシュを有効にできます。CloudFront 圧縮が有効になっている場合、両方の形式でキャッシュを有効にすると、インターネットへのデータ転送のコストを軽減できます。

注記

これらの圧縮形式の一方または両方でキャッシュを有効にする場合は、同じキャッシュ動作に関連付けられているオリジンリクエストポリシーAccept-Encoding ヘッダーを含めないでください。CloudFront は、これらの形式のいずれかでキャッシュが有効になっている場合、常にこのヘッダーをオリジンリクエストに含めます。そのため、オリジンリクエストポリシーに Accept-Encoding を含めても効果はありません。

オリジンサーバーが Gzip または Brotli で圧縮されたオブジェクトを返さない場合、またはキャッシュ動作が CloudFront 圧縮で設定されていない場合は、圧縮オブジェクトのキャッシュを有効にしないでください。有効にすると、キャッシュヒット率が低下する可能性があります。

以下に、これらの設定が CloudFront ディストリビューションに与える影響について説明します。次のシナリオはすべて、ビューワーリクエストに Accept-Encoding ヘッダーが含まれていることを前提としています。ビューワーリクエストに Accept-Encoding ヘッダーが含まれていない場合、CloudFront はこのヘッダーをキャッシュキーに含めず、対応するオリジンリクエストにも含めません。

圧縮されたオブジェクトのキャッシュが両方の圧縮形式に対応している場合

ビューワーが Gzip と Brotli の両方をサポートしている場合、つまり、ビューワーリクエストの Accept-Encoding ヘッダーに gzip 値と br 値の両方が含まれている場合、CloudFront では以下の処理が行われます。

  • ヘッダーを Accept-Encoding: br,gzip の形式に正規化し、正規化されたヘッダーをキャッシュキーに含めます。キャッシュキーには、ビューワーから送信された Accept-Encoding ヘッダーに存在していた他の値は含まれません。

  • エッジロケーションのキャッシュに、リクエストに一致し有効期限が切れていない Brotli または Gzip 圧縮オブジェクトがある場合、エッジロケーションはそのオブジェクトをビューワーに返します。

  • エッジロケーションのキャッシュに、リクエストと一致し、有効期限が切れていない Brotli または Gzip 圧縮オブジェクトがない場合、CloudFront は対応するオリジンリクエストに正規化されたヘッダー (Accept-Encoding: br,gzip) を含めます。オリジンリクエストには、ビューワーから送信された Accept-Encoding ヘッダーに存在していた他の値は含まれません。

例えば、ビューワーが一方の圧縮形式をサポートし、他方の圧縮形式をサポートしていない場合、ビューワーリクエストの Accept-Encoding ヘッダーに値 gzip が指定され、br が指定されていない場合、CloudFront によって以下の処理が行われます。

  • ヘッダーを Accept-Encoding: gzip の形式に正規化し、正規化されたヘッダーをキャッシュキーに含めます。キャッシュキーには、ビューワーから送信された Accept-Encoding ヘッダーに存在していた他の値は含まれません。

  • エッジロケーションのキャッシュに、リクエストに一致し有効期限が切れていない Gzip 圧縮オブジェクトがある場合、エッジロケーションはそのオブジェクトをビューワーに返します。

  • エッジロケーションのキャッシュに、リクエストと一致し、有効期限が切れていない Gzip 圧縮オブジェクトがない場合、CloudFront は対応するオリジンリクエストに正規化されたヘッダー (Accept-Encoding: gzip) を含めます。オリジンリクエストには、ビューワーから送信された Accept-Encoding ヘッダーに存在していた他の値は含まれません。

ビューワーが Brotli をサポートし Gzip をサポートしていない場合の CloudFront の動作を理解するには、前の例で圧縮形式を他方に置き換えてください。

ビューワーが Brotli または Gzip をサポートしていない場合、つまりビューワーリクエストの Accept-Encoding ヘッダーに br または gzip の値が含まれていない場合、CloudFront の動作は以下のようになります。

  • キャッシュキーに Accept-Encoding ヘッダーを含めません。

  • 対応するオリジンリクエストに Accept-Encoding: identity を含めます。オリジンリクエストには、ビューワーから送信された Accept-Encoding ヘッダーに存在していた他の値は含まれません。

圧縮されたオブジェクトのキャッシュが 1 つの圧縮形式に対して有効で、もう 1 つの圧縮形式に対して有効でない場合

キャッシュが対応している形式をビューワーがサポートしている場合、例えば、圧縮されたオブジェクトのキャッシュが Gzip に対応していて、ビューワーが Gzip をサポートしている (ビューワーリクエストの Accept-Encoding ヘッダー内の値の 1 つが gzip である) 場合、CloudFront によって以下の処理が行われます。

  • ヘッダーを Accept-Encoding: gzip の形式に正規化し、正規化されたヘッダーをキャッシュキーに含めます。

  • エッジロケーションのキャッシュに、リクエストに一致し有効期限が切れていない Gzip 圧縮オブジェクトがある場合、エッジロケーションはそのオブジェクトをビューワーに返します。

  • エッジロケーションのキャッシュに、リクエストと一致し、有効期限が切れていない Gzip 圧縮オブジェクトがない場合、CloudFront は対応するオリジンリクエストに正規化されたヘッダー (Accept-Encoding: gzip) を含めます。オリジンリクエストには、ビューワーから送信された Accept-Encoding ヘッダーに存在していた他の値は含まれません。

この動作は、ビューワーが Gzip と Brotli の両方をサポートしている場合と同じです (ビューワーリクエストの Accept-Encoding ヘッダーには gzip br の両方の値が含まれます)。このシナリオでは、圧縮オブジェクトのキャッシュが Brotli に対応していないためです。

圧縮オブジェクトのキャッシュが Brotli に対応し Gzip に対応していない場合の CloudFront の動作を理解するには、前の例で圧縮形式を他方に置き換えてください。

キャッシュが対応している圧縮形式をビューワーがサポートしていない (ビューワーリクエストの Accept-Encoding ヘッダーに、その形式の値が含まれていない) 場合、CloudFront の動作は以下のようになります。

  • キャッシュキーに Accept-Encoding ヘッダーを含めません。

  • 対応するオリジンリクエストに Accept-Encoding: identity を含めます。オリジンリクエストには、ビューワーから送信された Accept-Encoding ヘッダーに存在していた他の値は含まれません。

圧縮されたオブジェクトのキャッシュが両方の圧縮形式に対応していない場合

圧縮オブジェクトのキャッシュが両方の圧縮形式に対応していない場合、CloudFront は、Accept-Encoding ヘッダーをビューワーリクエストの他の HTTP ヘッダーと同じように扱います。デフォルトでは、キャッシュキーには含まれず、オリジンリクエストにも含まれません。他の HTTP ヘッダーと同一のキャッシュポリシーまたはオリジンリクエストポリシーのヘッダーリストに含めることができます。