

# キャッシュポリシーを理解する
<a name="cache-key-understand-cache-policy"></a>

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

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

## ポリシー情報
<a name="cache-key-understand-cache-policy-info"></a>

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

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

## Time to live (TTL) 設定
<a name="cache-key-understand-cache-policy-ttl"></a>

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

**最小 TTL**  
CloudFront がオリジンをチェックしてオブジェクトが更新されているかどうかを確認するまでに、オブジェクトが CloudFront キャッシュに保持される最小期間 (秒単位)。詳細については、「[コンテンツをキャッシュに保持する期間 (有効期限) を管理する](Expiration.md)」を参照してください。  
最小 TTL が 0 より大きい場合は、オリジンヘッダーに `Cache-Control: no-cache`、`no-store`、`private` ディレクティブが含まれていても、CloudFront はキャッシュポリシーの最小 TTL で指定された期間以上コンテンツをキャッシュします。

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

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

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

## キャッシュキー設定
<a name="cache-key-understand-cache-policy-settings"></a>

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

キャッシュキーには次のような設定があります。
+ [ヘッダー](#cache-policy-headers)
+ [Cookie](#cache-policy-cookies)
+ [クエリ文字列](#cache-policy-query-strings)
+ [圧縮のサポート](#cache-policy-compressed-objects)

**ヘッダー**  
CloudFront によりキャッシュキーおよびオリジンリクエストに含まれる、ビューワーリクエストの HTTP ヘッダー。ヘッダーには、以下のいずれかの設定を選択できます。  
+ [**None (なし)**] - ビューワーリクエストの HTTP ヘッダーはキャッシュキーに*含まれず*、オリジンリクエストに自動的に*含まれません*。
+ [**次のヘッダーを含める**] - ビューワーリクエストのどの HTTP ヘッダーをキャッシュキーに含め、オリジンリクエストに自動的に含めるかを指定します。
[**次のヘッダーを含める**] 設定を使用する場合、HTTP ヘッダーは値ではなく名前で指定します。たとえば、次の HTTP ヘッダーを考えてみます。  

```
Accept-Language: en-US,en;q=0.5
```
この場合、ヘッダーを `Accept-Language` としてではなく、`Accept-Language: en-US,en;q=0.5` として指定します。ただし、CloudFront では、キャッシュキーおよびオリジンリクエストに、その値を含む完全なヘッダーが含まれます。  
CloudFront によって生成された特定のヘッダーをキャッシュキーに含めることもできます。詳細については、「[CloudFront のリクエストヘッダーを追加する](adding-cloudfront-headers.md)」を参照してください。

**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` としてではなく、`session_ID=abcd1234` として指定します。ただし、CloudFront では、キャッシュキーおよびオリジンリクエストに、その値を含む完全な Cookie が含まれます。

**クエリ文字列**  
CloudFront によりキャッシュキーおよびオリジンリクエストに含まれる、ビューワーリクエストの URL クエリ文字列。クエリ文字列には、以下のいずれかの設定を選択できます。  
+ [**None (なし)**] - ビューワーリクエストのクエリ文字列はキャッシュキーに*含まれず*、オリジンリクエストに自動的に*含まれません*。
+ [**All (すべて)**] - ビューワーリクエストのすべてのクエリ文字列は、キャッシュキーに含まれ、オリジンリクエストにも自動的に含まれます。
+ [**指定したクエリ文字列を含める**] - ビューワーリクエストのどのクエリ文字列をキャッシュキーに含め、オリジンリクエストに自動的に含めるかを指定します。
+ [**次を除くすべてのクエリ文字列を含める**] - ビューワーリクエストのどのクエリ文字列をキャッシュキーに*含めず*、オリジンリクエストに自動的に*含めない*かを指定します。指定したクエリ文字列以外の他のすべてのクエリ文字列は、キャッシュキーに*含まれ*、自動的にオリジンリクエストに含まれます。
[**指定したクエリ文字列を含める**] または [**次を除くすべてのクエリ文字列を含める**] 設定を使用する場合、クエリ文字列は値ではなく名前で指定します。たとえば、次の URL パスを考えてみます。  

```
/content/stories/example-story.html?split-pages=false
```
この場合、クエリ文字列を `split-pages` としてではなく、`split-pages=false` として指定します。ただし、CloudFront では、キャッシュキーおよびオリジンリクエストに、その値を含む完全なクエリ文字列が含まれます。  
キャッシュキー設定の場合、CloudFront はヘッダー、クエリ文字列、Cookie のアスタリスク文字 (`*`) をワイルドカードとしてではなくリテラル文字列として扱います。

**圧縮のサポート**  
これらの設定により、Gzip または Brotli 圧縮形式で圧縮されたオブジェクトを CloudFront がリクエストおよびキャッシュできるようになります (ビューワーでサポートされている場合)。これらの設定により、[CloudFront 圧縮](ServingCompressedFiles.md)も有効になります。ビューワーは `Accept-Encoding` HTTP ヘッダーを使用して、これらの圧縮形式のサポートの可否を示します。  
ウェブブラウザ Chrome および Firefox では、HTTPS を使用してリクエストを送信する場合のみ、Brotli 圧縮がサポートされます。これらのブラウザでは、HTTP リクエストで Brotli がサポートされません。
次のいずれかに該当する場合は、これらの設定を有効にします。  
+ ビューワーによってサポートされている場合にオリジンが Gzip 圧縮オブジェクトを返す (リクエストには、HTTPヘッダー `Accept-Encoding` と値 `gzip` が含まれます)。この場合、**Gzip が有効化された**設定を使用します (CloudFront API、AWS SDK、AWS CLI、または CloudFormation で `EnableAcceptEncodingGzip` を `true` に設定します)。
+ ビューワーによってサポートされている場合にオリジンが Brotli 圧縮オブジェクトを返す (リクエストには、HTTPヘッダー `Accept-Encoding` と値 `br` が含まれます)。この場合、**Brotli が有効化された**設定を使用します (CloudFront API、AWS SDK、AWS CLI、または CloudFormation で `EnableAcceptEncodingBrotli` を `true` に設定します)。
+ このキャッシュポリシーが適用されるキャッシュ動作は、[CloudFront 圧縮](ServingCompressedFiles.md)によって設定されます。この場合、Gzip または Brotli のいずれか、またはその両方に対してキャッシュを有効にできます。CloudFront 圧縮が有効になっている場合、両方の形式でキャッシュを有効にすると、インターネットへのデータ転送のコストを軽減できます。
これらの圧縮形式の一方または両方でキャッシュを有効にする場合は、同じキャッシュ動作に関連付けられている[オリジンリクエストポリシー](controlling-origin-requests.md)に `Accept-Encoding` ヘッダーを含めないでください。CloudFront は、これらの形式のいずれかでキャッシュが有効になっている場合、常にこのヘッダーをオリジンリクエストに含めます。そのため、オリジンリクエストポリシーに `Accept-Encoding` を含めても効果はありません。
オリジンサーバーが Gzip または Brotli で圧縮されたオブジェクトを返さない場合、またはキャッシュ動作が CloudFront 圧縮で設定されていない場合は、圧縮オブジェクトのキャッシュを有効にしないでください。有効にすると、[キャッシュヒット率](cache-hit-ratio.md)が低下する可能性があります。  
以下に、これらの設定が CloudFront ディストリビューションに与える影響について説明します。次のシナリオはすべて、ビューワーリクエストに `Accept-Encoding` ヘッダーが含まれていることを前提としています。ビューワーリクエストに `Accept-Encoding` ヘッダーが含まれていない場合、CloudFront はこのヘッダーをキャッシュキーに含めず、対応するオリジンリクエストにも含めません。    
**圧縮されたオブジェクトのキャッシュが両方の圧縮形式に対応している場合**  
ビューワーが Gzip と Brotli の両方をサポートしている場合、つまり、ビューワーリクエストの `gzip` ヘッダーに `br` 値と `Accept-Encoding` 値の両方が含まれている場合、CloudFront では以下の処理が行われます。  
+ ヘッダーを `Accept-Encoding: br,gzip` の形式に正規化し、正規化されたヘッダーをキャッシュキーに含めます。キャッシュキーには、ビューワーから送信された `Accept-Encoding` ヘッダーに存在していた他の値は含まれません。
+ エッジロケーションのキャッシュに、リクエストに一致し有効期限が切れていない Brotli または Gzip 圧縮オブジェクトがある場合、エッジロケーションはそのオブジェクトをビューワーに返します。
+ エッジロケーションのキャッシュに、リクエストと一致し、有効期限が切れていない Brotli または Gzip 圧縮オブジェクトがない場合、CloudFront は対応するオリジンリクエストに正規化されたヘッダー (`Accept-Encoding: br,gzip`) を含めます。オリジンリクエストには、ビューワーから送信された `Accept-Encoding` ヘッダーに存在していた他の値は含まれません。
例えば、ビューワーが一方の圧縮形式をサポートし、他方の圧縮形式をサポートしていない場合、ビューワーリクエストの `gzip` ヘッダーに値 `Accept-Encoding` が指定され、`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 をサポートしている (ビューワーリクエストの `gzip` ヘッダー内の値の 1 つが `Accept-Encoding` である) 場合、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 ヘッダーと同一のキャッシュポリシーまたはオリジンリクエストポリシーのヘッダーリストに含めることができます。