

# コンテンツをキャッシュに保持する期間 (有効期限) を管理する
<a name="Expiration"></a>

CloudFront が別のリクエストをオリジンに転送するまでにファイルを CloudFront キャッシュに保持する期間を制御できます。この期間を短くすると、動的なコンテンツを供給できます。この期間を長くすると、ユーザー側のパフォーマンスは向上します。ファイルがエッジキャッシュから直接返される可能性が高くなるためです。期間を長くすると、オリジンの負荷も軽減されます。

一般的に CloudFront は、指定したキャッシュ保持期間が経過するまで、つまりファイルの有効期限が切れるまでエッジロケーションからファイルを提供します。ファイルの有効期限が切れると、エッジロケーションがファイルのリクエストを次に受け取ったときに、CloudFront は、リクエストをオリジンに転送し、キャッシュにファイルの最新バージョンが含まれていることを確認します。オリジンからのレスポンスは、ファイルが変更されたかどうかによって異なります。
+ CloudFront キャッシュに最新バージョンがすでにある場合、オリジンはステータスコード `304 Not Modified` を返します。
+ CloudFront キャッシュに最新バージョンがない場合、オリジンはステータスコード `200 OK` とファイルの最新バージョンを返します。

エッジロケーションに頻繁にリクエストされないファイルがあれば、CloudFront は、頻繁にリクエストされるようになったファイル用にスペースを確保するために、そのファイルを削除する (そのファイルの有効期限が切れる前に削除する) 場合があります。

ディストリビューションのキャッシュポリシーを更新して、キャッシュ期間を管理することをお勧めします。キャッシュポリシーの使用をオプトアウトした場合、デフォルトの TTL (有効期限) は 24 時間ですが、次の設定を更新してデフォルトを上書きできます。
+ 同じパスパターンに一致するすべてのファイルのキャッシュ保持期間を変更するには、CloudFront の設定でキャッシュの動作の [**Minimum TTL (最小 TTL)**]、[**Maximum TTL (最大 TTL)**]、[**Default TTL (デフォルト TTL)**] を変更できます。個々の設定の詳細については、「[最小 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMinTTL)」、「[最大 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMaxTTL)」、「[デフォルト TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesDefaultTTL)」を参照してください。
+ 個々のファイルのキャッシュ保持期間を変更するには、ファイルに `Cache-Control` または `max-age` ディレクティブが付いた `s-maxage` を追加するか、`Expires` ヘッダーフィールドを追加するようにオリジンを設定します。詳細については、「[ヘッダーを使用して個々のオブジェクトのキャッシュ保持期間を制御する](#expiration-individual-objects)」を参照してください。

[**Minimum TTL (最小 TTL)**]、[**Default TTL (デフォルト TTL)**]、[**Maximum TTL (最大 TTL)**] が `max-age` ディレクティブ、`s-maxage` ディレクティブ、`Expires` ヘッダーフィールドとどのように連動するかの詳細については、「[CloudFront がオブジェクトをキャッシュする期間を指定する](#ExpirationDownloadDist)」を参照してください。

CloudFront がオリジンに別のリクエストを転送して、リクエストされたオブジェクトを再度取得することを試みるまでに、エラー (`404 Not Found` など) が CloudFront キャッシュに保持される期間を制御することもできます。詳細については、「[CloudFront がオリジンからの HTTP 4xx および 5xx ステータスコードを処理する方法](HTTPStatusCodes.md)」を参照してください。

**Topics**
+ [

## ヘッダーを使用して個々のオブジェクトのキャッシュ保持期間を制御する
](#expiration-individual-objects)
+ [

## 古い (期限切れの) コンテンツを提供する
](#stale-content)
+ [

## CloudFront がオブジェクトをキャッシュする期間を指定する
](#ExpirationDownloadDist)
+ [

## Amazon S3 コンソールを使用してオブジェクトにヘッダーを追加する
](#ExpirationAddingHeadersInS3)

## ヘッダーを使用して個々のオブジェクトのキャッシュ保持期間を制御する
<a name="expiration-individual-objects"></a>

`Cache-Control` および `Expires` ヘッダーを使用して、オブジェクトをキャッシュに保持する期間を制御できます。[**Minimum TTL**]、[**Default TTL**]、[**Maximum TTL**] の設定もキャッシュ保持期間に影響を与えますが、ここでは、ヘッダーがキャッシュ保持期間に与える影響について概要を示します。
+ `Cache-Control max-age` ディレクティブでは、CloudFront がオリジンサーバーからオブジェクトを再度取得するまでにオブジェクトをキャッシュに保持する期間 (秒単位) を指定できます。CloudFront がサポートする最小有効期限は 0 秒です。最大値は 100 (年) です。値は次の形式で指定します。

  `Cache-Control: max-age=`*秒*

  例えば、以下のディレクティブは CloudFront に関連付けられているオブジェクトを 3,600 秒 (1 時間) キャッシュに保持するよう指示します。

  `Cache-Control: max-age=3600`

  ブラウザキャッシュに保持される期間とは異なる期間、オブジェクトを CloudFront エッジキャッシュに保持する場合、`Cache-Control max-age` ディレクティブと `Cache-Control s-maxage` ディレクティブを併用できます。詳細については、「[CloudFront がオブジェクトをキャッシュする期間を指定する](#ExpirationDownloadDist)」を参照してください。
+ `Expires` ヘッダーフィールドでは、「[RFC 2616、ハイパーテキスト転送プロトコル –– HTTP/1.1 セクション 3.3.1、完全な日付](https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1)」に規定された形式を使用して、有効期限切れ日時を指定できます。

  `Sat, 27 Jun 2015 23:59:59 GMT`

オブジェクトのキャッシュを制御するには、`Expires` ヘッダーフィールドではなく、`Cache-Control max-age` ディレクティブを使用することをお勧めします。`Cache-Control max-age` と `Expires` の両方の値を指定した場合、CloudFront は `Cache-Control max-age` の値のみを使用します。

詳細については、「[CloudFront がオブジェクトをキャッシュする期間を指定する](#ExpirationDownloadDist)」を参照してください。

ビューワーからの `Cache-Control` リクエストで HTTP `Pragma` または `GET` ヘッダーフィールドを使用して、オリジンサーバーに戻ってオブジェクトを取得するように CloudFront を設定することはできません。CloudFront は、ビューワーからのリクエストにあるそのようなヘッダーフィールドを無視します。

`Cache-Control` および `Expires` ヘッダーフィールドの詳細については、「*RFC 2616、ハイパーテキスト転送プロトコル –– HTTP/1.1*」の以下のセクションを参照してください。
+ [セクション 14.9 キャッシュ制御](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9)
+ [セクション 14.21 期限](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21)

## 古い (期限切れの) コンテンツを提供する
<a name="stale-content"></a>

CloudFront は `Stale-While-Revalidate` および `Stale-If-Error` キャッシュ制御ディレクティブをサポートしています。これらのディレクティブを使用して、ビューワーが古いコンテンツを利用できる期間を指定できます。

**Topics**
+ [

### `Stale-While-Revalidate`
](#stale-while-revalidate)
+ [

### `Stale-If-Error`
](#stale-if-error-only)
+ [

### 両方のディレクティブを使用する
](#use-both-stale-directives)

### `Stale-While-Revalidate`
<a name="stale-while-revalidate"></a>

このディレクティブにより、CloudFront はオリジンから新しいバージョンを非同期で取得しながら、キャッシュから古いコンテンツを提供できます。これにより、ビューワーはバックグラウンドフェッチを待たずにエッジロケーションからレスポンスをすぐに受け取るため、レイテンシーが向上します。新しいコンテンツは、今後のリクエストのためにバックグラウンドでロードされます。

**Example 例:`Stale-While-Revalidate`**  
CloudFront は、これらのディレクティブを使用するように `Cache-Control` ヘッダーを設定するときに、以下を実行します。  

```
Cache-Control: max-age=3600, stale-while-revalidate=600
```

1. CloudFront はレスポンスを 1 時間キャッシュします (`max-age=3600`)。

1. この期間を過ぎてリクエストが行われた場合、CloudFront は古いコンテンツを提供すると同時に、キャッシュされたコンテンツを再検証して更新するリクエストをオリジンに送信します。

1. コンテンツが再検証される間、CloudFront は、古いコンテンツは最大 10 分間 (`stale-while-revalidate=600`) 提供します。

**注記**  
CloudFront は、`stale-while-revalidate` ディレクティブの値または CloudFront [最大 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMaxTTL) 値のどちらか小さい方の値まで、古いコンテンツを提供します。最大 TTL 期間が経過すると、`stale-while-revalidate` の値に関係なく、古いオブジェクトはエッジキャッシュから使用できなくなります。

### `Stale-If-Error`
<a name="stale-if-error-only"></a>

オリジンにアクセスできない場合やエラーコード 500～600 が返された場合、このディレクティブにより、CloudFront はキャッシュから古いコンテンツを提供できます。これにより、ビューワーはオリジンが停止しているときでもコンテンツにアクセスできるようになります。

**Example 例:`Stale-If-Error`**  
CloudFront は、これらのディレクティブを使用するように `Cache-Control` ヘッダーを設定するときに、以下を実行します。  

```
Cache-Control: max-age=3600, stale-if-error=86400
```

1. CloudFront はレスポンスを 1 時間キャッシュします (`max-age=3600`)。

1. この期間を過ぎてもオリジンがダウンしたり、エラーが返されたりした場合、CloudFront は最長 24 時間 (`stale-if-error=86400`)、古いコンテンツを提供し続けます。

1. カスタムエラーレスポンスが設定されると、指定された `stale-if-error` 期間内にエラーが発生した場合、CloudFront はまず古いコンテンツの提供を試みます。古いコンテンツが利用できない場合、CloudFront は対応するエラーステータスコードに設定されたカスタムエラーレスポンスを提供します。詳細については、「[カスタムエラーレスポンスを生成する](GeneratingCustomErrorResponses.md)」を参照してください。

**注意事項**  
CloudFront は、`stale-if-error` ディレクティブの値または CloudFront [最大 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMaxTTL) 値のどちらか小さい方の値まで、古いコンテンツを提供します。最大 TTL 期間が経過すると、`stale-if-error` の値に関係なく、古いオブジェクトはエッジキャッシュから使用できなくなります。
`stale-if-error` またはカスタムエラーレスポンスを設定しない場合、CloudFront はリクエストされたオブジェクトがエッジキャッシュにあるかどうかに応じて、古いオブジェクトを返すか、エラーレスポンスをビューワーに転送します。詳細については、「[カスタムエラーページが設定されていない場合に CloudFront がエラーを処理する方法](HTTPStatusCodes.md#HTTPStatusCodes-no-custom-error-pages)」を参照してください。

### 両方のディレクティブを使用する
<a name="use-both-stale-directives"></a>

`stale-while-revalidate` および `stale-if-error` は独立したキャッシュ制御ディレクティブで、これらを一緒に使用することでレイテンシーを減らしたり、オリジンが応答または回復するためのバッファを追加したりできます。

**Example 例: 両方のディレクティブの使用**  
CloudFront は、以下のディレクティブを使用するように `Cache-Control` ヘッダーを設定するときに、以下を実行します。  

```
Cache-Control: max-age=3600, stale-while-revalidate=600, stale-if-error=86400
```

1. CloudFront はレスポンスを 1 時間キャッシュします (`max-age=3600`)。

1. この期間を過ぎてからリクエストが行われた場合、コンテンツが再検証される間、CloudFront は古いコンテンツを最大 10 分間 (`stale-while-revalidate=600`) 提供します。

1. CloudFront がコンテンツを再検証しようとしたときにオリジンサーバーがエラーを返した場合、CloudFront は古いコンテンツを最大 24 時間 (`stale-if-error=86400`) 提供し続けます。

キャッシュによって、パフォーマンスと鮮度が保たれます。`stale-while-revalidate` や `stale-if-error` などのディレクティブを使用すると、パフォーマンスとユーザーエクスペリエンスが向上しますが、コンテンツをどれだけ新鮮にするかの希望に合った設定にしてください。古いコンテンツディレクティブは、コンテンツを更新する必要があるが、最新バージョンであることが重要でない場合に最適です。さらに、コンテンツが変更されないか、ほとんど変更されない場合、`stale-while-revalidate` は不要なネットワークリクエストを追加する可能性があります。代わりに、キャッシュ期間を長く設定することを検討してください。

## CloudFront がオブジェクトをキャッシュする期間を指定する
<a name="ExpirationDownloadDist"></a>

CloudFront が、オリジンに別のリクエストを送信するまでの期間に オブジェクトをキャッシュに保持する時間の長さを制御するには、次の方法があります。
+ CloudFront ディストリビューションのキャッシュ動作の TTL 値に、最小、最大、およびデフォルトの値を設定します。これらの値は、キャッシュ動作にアタッチされた[キャッシュポリシー](controlling-the-cache-key.md) (推奨) の中、またはレガシーキャッシュ設定の中で設定できます。
+ オリジンからの応答に `Cache-Control` または `Expires` ヘッダーを含めます。これらのヘッダーは、別のリクエストがブラウザから CloudFront に送信されるまでの期間に、オブジェクトがブラウザーキャッシュに保持される時間を定義するためにも役立ちます。

次の表では、オリジンから送信された `Cache-Control` ヘッダーと `Expires` ヘッダーがキャッシュ動作の TTL 設定とどのように関係し、キャッシュに影響を与えるのかを説明しています。


****  

| オリジンヘッダー | 最小 TTL = 0 | 最小 TTL > 0 | 
| --- | --- | --- | 
|  **オリジンが `Cache-Control: max-age` ディレクティブをオブジェクトに追加**  |  **CloudFront キャッシュ** CloudFront は、`Cache-Control: max-age` ディレクティブの値と最大 TTL の値のうち、小さい方の値に対応する期間、オブジェクトをキャッシュに保持します。 **ブラウザキャッシュ** ブラウザは、`Cache-Control: max-age` ディレクティブの値に対応する期間、オブジェクトをキャッシュに保持します。  |  **CloudFront キャッシュ** CloudFront のキャッシュ動作は、CloudFront 最小 TTL および最大 TTL、`Cache-Control max-age` ディレクティブの値によって異なります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) **ブラウザキャッシュ** ブラウザは、`Cache-Control: max-age` ディレクティブの値に対応する期間、オブジェクトをキャッシュに保持します。  | 
|  **オリジンが `Cache-Control: max-age` ディレクティブをオブジェクトに追加しない**  |  **CloudFront キャッシュ** CloudFront は、デフォルト TTL の値に対応する期間、オブジェクトをキャッシュに保持します。 **ブラウザキャッシュ** ブラウザによって異なります。  |  **CloudFront キャッシュ** CloudFront は、最小 TTL またはデフォルト TTL の値のうち、大きい方の値に対応する期間、オブジェクトをキャッシュに保持します。 **ブラウザキャッシュ** ブラウザによって異なります。  | 
|  **オリジンが `Cache-Control: max-age` および `Cache-Control: s-maxage` ディレクティブをオブジェクトに追加**  |  **CloudFront キャッシュ** CloudFront は、`Cache-Control: s-maxage` ディレクティブの値と最大 TTL の値のうち、小さい方の値に対応する期間、オブジェクトをキャッシュに保持します。 **ブラウザキャッシュ** ブラウザは、`Cache-Control max-age` ディレクティブの値に対応する期間、オブジェクトをキャッシュに保持します。  |  **CloudFront キャッシュ** CloudFront のキャッシュ動作は、CloudFront 最小 TTL および最大 TTL、`Cache-Control: s-maxage` ディレクティブの値によって異なります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) **ブラウザキャッシュ** ブラウザは、`Cache-Control: max-age` ディレクティブの値に対応する期間、オブジェクトをキャッシュに保持します。  | 
|  **オリジンが `Expires` ヘッダーをオブジェクトに追加**  |  **CloudFront キャッシュ** CloudFront は、`Expires` ヘッダーにある日付と最大 TTL の値に対応する日付のうち早い方の日付まで、オブジェクトをキャッシュに保持します。 **ブラウザキャッシュ** ブラウザは、`Expires` ヘッダーにある日付まで、オブジェクトをキャッシュに保持します。  |  **CloudFront キャッシュ** CloudFront キャッシュは、CloudFront 最小 TTL および最大 TTL、`Expires` ヘッダーの値によって異なります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) **ブラウザキャッシュ** ブラウザは、`Expires` ヘッダーの日付けおよび時刻まで、オブジェクトをキャッシュに保持します。  | 
|  **オリジンが `Cache-Control: no-cache`、`no-store`、および (または) `private` ディレクティブをオブジェクトに追加**  |  CloudFront とブラウザはヘッダーを優先させます。  |  **CloudFront キャッシュ** CloudFront は、最小 TTL の値に対応する期間、オブジェクトをキャッシュに保持します。[この表の下にある注意点をお読みください](#stale-if-error)。 **ブラウザキャッシュ** ブラウザはヘッダーを優先します。  | 

**警告**  
最小 TTL が 0 より大きい場合は、`Cache-Control: no-cache`、`no-store`、`private` ディレクティブがオリジンヘッダーに含まれていても、CloudFront はキャッシュポリシーの最小 TTL を使用します。  
オリジンとの接続が可能な場合、CloudFront はオリジンからオブジェクトを取得し、ビューワーに返します。
オリジンが接続不能で、最小または最大 TTL 値が 0 より大きい場合、CloudFront は、以前にオリジンから取得したオブジェクトを返します。**
この動作を回避するには、`Cache-Control: stale-if-error=0` ディレクティブに、オリジンから返されたオブジェクトを含めます。このようにすることで、オリジンが接続不能な場合に CloudFront が以後のリクエストに応答する際、以前にオリジンから取得したオブジェクトを返すのではなくエラーを返すようになります。
オリジンヘッダーに `Cache-Control: no-cache`、`no-store`、および/または `private` ディレクティブが含まれている場合、CloudFront は S3 オリジンから HTTP 501 ステータスコード (未実装) をキャッシュしません。これは、[最小 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMinTTL) 設定が 0 より大きい場合でも、S3 オリジンのデフォルトの動作です。

CloudFront コンソールを使用して、ディストリビューションの設定を変更する方法については、「[ディストリビューションを更新する](HowToUpdateDistribution.md)」を参照してください。CloudFront API を使用してディストリビューションの設定を変更する方法については、「[UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)」を参照してください。

## Amazon S3 コンソールを使用してオブジェクトにヘッダーを追加する
<a name="ExpirationAddingHeadersInS3"></a>

`Cache-Control` または `Expires` ヘッダーフィールドを Amazon S3 オブジェクトに追加できます。そのために、オブジェクトのメタデータフィールドを変更します。

**Amazon S3 オブジェクトに `Cache-Control` または `Expires` ヘッダーフィールドを追加するには**

1. 「*Amazon S3 ユーザーガイド*」の「[Amazon S3 コンソールでのオブジェクトメタデータの編集](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-object-metadata.html)」トピックの「**システム定義メタデータの置き換え**」セクションの手順に従います。

1. [**Key**] (キー) で、追加するヘッダーの名前 ([**Cache-Control**] または [**Expires**]) を選択します。

1. [**Value**] (値) で、ヘッダー値を入力します。例えば、`Cache-Control` ヘッダーの場合は、`max-age=86400` と入力します。`Expires` で、有効期限の日時を `Wed, 30 Jun 2021 09:28:00 GMT` のように入力できます。

1. 残りの手順に従って、メタデータの変更を保存します。