コンテンツをキャッシュに保持する期間 (有効期限) を管理する
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」、「最大 TTL」、「デフォルト TTL」を参照してください。
-
個々のファイルのキャッシュ保持期間を変更するには、ファイルに
Cache-Control
またはmax-age
ディレクティブが付いたs-maxage
を追加するか、Expires
ヘッダーフィールドを追加するようにオリジンを設定します。詳細については、「ヘッダーを使用して個々のオブジェクトのキャッシュ保持期間を制御する」を参照してください。
[Minimum TTL (最小 TTL)]、[Default TTL (デフォルト TTL)]、[Maximum TTL (最大 TTL)] が max-age
ディレクティブ、s-maxage
ディレクティブ、Expires
ヘッダーフィールドとどのように連動するかの詳細については、「CloudFront がオブジェクトをキャッシュする期間を指定する」を参照してください。
CloudFront がオリジンに別のリクエストを転送して、リクエストされたオブジェクトを再度取得することを試みるまでに、エラー (404 Not Found
など) が CloudFront キャッシュに保持される期間を制御することもできます。詳細については、「CloudFront がオリジンからの HTTP 4xx および 5xx ステータスコードを処理する方法」を参照してください。
トピック
ヘッダーを使用して個々のオブジェクトのキャッシュ保持期間を制御する
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 がオブジェクトをキャッシュする期間を指定する」を参照してください。 -
Expires
ヘッダーフィールドでは、「RFC 2616、ハイパーテキスト転送プロトコル –– HTTP/1.1 セクション 3.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 がオブジェクトをキャッシュする期間を指定する」を参照してください。
ビューワーからの Cache-Control
リクエストで HTTP Pragma
または GET
ヘッダーフィールドを使用して、オリジンサーバーに戻ってオブジェクトを取得するように CloudFront を設定することはできません。CloudFront は、ビューワーからのリクエストにあるそのようなヘッダーフィールドを無視します。
Cache-Control
および Expires
ヘッダーフィールドの詳細については、「RFC 2616、ハイパーテキスト転送プロトコル –– HTTP/1.1」の以下のセクションを参照してください。
古い (期限切れの) コンテンツを提供する
CloudFront は Stale-While-Revalidate
および Stale-If-Error
キャッシュ制御ディレクティブをサポートしています。これらのディレクティブを使用して、ビューワーが古いコンテンツを利用できる期間を指定できます。
Stale-While-Revalidate
このディレクティブにより、CloudFront はオリジンから新しいバージョンを非同期で取得しながら、キャッシュから古いコンテンツを提供できます。これにより、ビューワーはバックグラウンドフェッチを待たずにエッジロケーションからレスポンスをすぐに受け取るため、レイテンシーが向上します。新しいコンテンツは、今後のリクエストのためにバックグラウンドでロードされます。
例:Stale-While-Revalidate
CloudFront は、これらのディレクティブを使用するように Cache-Control
ヘッダーを設定するときに、以下を実行します。
Cache-Control: max-age=3600, stale-while-revalidate=600
-
CloudFront はレスポンスを 1 時間キャッシュします (
max-age=3600
)。 -
この期間を過ぎてリクエストが行われた場合、CloudFront は古いコンテンツを提供すると同時に、キャッシュされたコンテンツを再検証して更新するリクエストをオリジンに送信します。
-
コンテンツが再検証される間、CloudFront は、古いコンテンツは最大 10 分間 (
stale-while-revalidate=600
) 提供します。
注記
CloudFront は、stale-while-revalidate
ディレクティブの値または CloudFront 最大 TTL 値のどちらか小さい方の値まで、古いコンテンツを提供します。最大 TTL 期間が経過すると、stale-while-revalidate
の値に関係なく、古いオブジェクトはエッジキャッシュから使用できなくなります。
Stale-If-Error
オリジンにアクセスできない場合やエラーコード 500~600 が返された場合、このディレクティブにより、CloudFront はキャッシュから古いコンテンツを提供できます。これにより、ビューワーはオリジンが停止しているときでもコンテンツにアクセスできるようになります。
例:Stale-If-Error
CloudFront は、これらのディレクティブを使用するように Cache-Control
ヘッダーを設定するときに、以下を実行します。
Cache-Control: max-age=3600, stale-if-error=86400
-
CloudFront はレスポンスを 1 時間キャッシュします (
max-age=3600
)。 -
この期間を過ぎてもオリジンがダウンしたり、エラーが返されたりした場合、CloudFront は最長 24 時間 (
stale-if-error=86400
)、古いコンテンツを提供し続けます。 -
カスタムエラーレスポンスが設定されると、指定された
stale-if-error
期間内にエラーが発生した場合、CloudFront はまず古いコンテンツの提供を試みます。古いコンテンツが利用できない場合、CloudFront は対応するエラーステータスコードに設定されたカスタムエラーレスポンスを提供します。詳細については、「カスタムエラーレスポンスを生成する」を参照してください。
メモ
-
CloudFront は、
stale-if-error
ディレクティブの値または CloudFront 最大 TTL 値のどちらか小さい方の値まで、古いコンテンツを提供します。最大 TTL 期間が経過すると、stale-if-error
の値に関係なく、古いオブジェクトはエッジキャッシュから使用できなくなります。 -
stale-if-error
またはカスタムエラーレスポンスを設定しない場合、CloudFront はリクエストされたオブジェクトがエッジキャッシュにあるかどうかに応じて、古いオブジェクトを返すか、エラーレスポンスをビューワーに転送します。詳細については、「カスタムエラーページが設定されていない場合に CloudFront がエラーを処理する方法」を参照してください。
両方のディレクティブを使用する
stale-while-revalidate
および stale-if-error
は独立したキャッシュ制御ディレクティブで、これらを一緒に使用することでレイテンシーを減らしたり、オリジンが応答または回復するためのバッファを追加したりできます。
例: 両方のディレクティブの使用
CloudFront は、以下のディレクティブを使用するように Cache-Control
ヘッダーを設定するときに、以下を実行します。
Cache-Control: max-age=3600, stale-while-revalidate=600, stale-if-error=86400
-
CloudFront はレスポンスを 1 時間キャッシュします (
max-age=3600
)。 -
この期間を過ぎてからリクエストが行われた場合、コンテンツが再検証される間、CloudFront は古いコンテンツを最大 10 分間 (
stale-while-revalidate=600
) 提供します。 -
CloudFront がコンテンツを再検証しようとしたときにオリジンサーバーがエラーを返した場合、CloudFront は古いコンテンツを最大 24 時間 (
stale-if-error=86400
) 提供し続けます。
キャッシュによって、パフォーマンスと鮮度が保たれます。stale-while-revalidate
や stale-if-error
などのディレクティブを使用すると、パフォーマンスとユーザーエクスペリエンスが向上しますが、コンテンツをどれだけ新鮮にするかの希望に合った設定にしてください。古いコンテンツディレクティブは、コンテンツを更新する必要があるが、最新バージョンであることが重要でない場合に最適です。さらに、コンテンツが変更されないか、ほとんど変更されない場合、stale-while-revalidate
は不要なネットワークリクエストを追加する可能性があります。代わりに、キャッシュ期間を長く設定することを検討してください。
CloudFront がオブジェクトをキャッシュする期間を指定する
CloudFront が、オリジンに別のリクエストを送信するまでの期間に オブジェクトをキャッシュに保持する時間の長さを制御するには、次の方法があります。
-
CloudFront ディストリビューションのキャッシュ動作の TTL 値に、最小、最大、およびデフォルトの値を設定します。これらの値は、キャッシュ動作にアタッチされたキャッシュポリシー (推奨) の中、またはレガシーキャッシュ設定の中で設定できます。
-
オリジンからの応答に
Cache-Control
またはExpires
ヘッダーを含めます。これらのヘッダーは、別のリクエストがブラウザから CloudFront に送信されるまでの期間に、オブジェクトがブラウザーキャッシュに保持される時間を定義するためにも役立ちます。
次の表では、オリジンから送信された Cache-Control
ヘッダーと Expires
ヘッダーがキャッシュ動作の TTL 設定とどのように関係し、キャッシュに影響を与えるのかを説明しています。
オリジンヘッダー | 最小 TTL = 0 | 最小 TTL > 0 |
---|---|---|
オリジンが |
CloudFront キャッシュ CloudFront は、 ブラウザキャッシュ ブラウザは、 |
CloudFront キャッシュ CloudFront のキャッシュ動作は、CloudFront 最小 TTL および最大 TTL、
ブラウザキャッシュ ブラウザは、 |
オリジンが |
CloudFront キャッシュ CloudFront は、デフォルト TTL の値に対応する期間、オブジェクトをキャッシュに保持します。 ブラウザキャッシュ ブラウザによって異なります。 |
CloudFront キャッシュ CloudFront は、最小 TTL またはデフォルト TTL の値のうち、大きい方の値に対応する期間、オブジェクトをキャッシュに保持します。 ブラウザキャッシュ ブラウザによって異なります。 |
オリジンが |
CloudFront キャッシュ CloudFront は、 ブラウザキャッシュ ブラウザは、 |
CloudFront キャッシュ CloudFront のキャッシュ動作は、CloudFront 最小 TTL および最大 TTL、
ブラウザキャッシュ ブラウザは、 |
オリジンが |
CloudFront キャッシュ CloudFront は、 ブラウザキャッシュ ブラウザは、 |
CloudFront キャッシュ CloudFront キャッシュは、CloudFront 最小 TTL および最大 TTL、
ブラウザキャッシュ ブラウザは、 |
オリジンが |
CloudFront とブラウザはヘッダーを優先させます。 |
CloudFront キャッシュ CloudFront は、最小 TTL の値に対応する期間、オブジェクトをキャッシュに保持します。この表の下にある注意点をお読みください。 ブラウザキャッシュ ブラウザはヘッダーを優先します。 |
警告
最小 TTL が 0 より大きい場合は、Cache-Control: no-cache
、no-store
、private
ディレクティブがオリジンヘッダーに含まれていても、CloudFront はキャッシュポリシーの最小 TTL を使用します。
オリジンとの接続が可能な場合、CloudFront はオリジンからオブジェクトを取得し、ビューワーに返します。
オリジンが接続不能で、最小または最大 TTL 値が 0 より大きい場合、CloudFront は、以前にオリジンから取得したオブジェクトを返します。
この動作を回避するには、Cache-Control:
stale-if-error=0
ディレクティブに、オリジンから返されたオブジェクトを含めます。このようにすることで、オリジンが接続不能な場合に CloudFront が以後のリクエストに応答する際、以前にオリジンから取得したオブジェクトを返すのではなくエラーを返すようになります。
CloudFront コンソールを使用して、ディストリビューションの設定を変更する方法については、「ディストリビューションを更新する」を参照してください。CloudFront API を使用してディストリビューションの設定を変更する方法については、「UpdateDistribution」を参照してください。
Amazon S3 コンソールを使用してオブジェクトにヘッダーを追加する
Cache-Control
または Expires
ヘッダーフィールドを Amazon S3 オブジェクトに追加できます。そのために、オブジェクトのメタデータフィールドを変更します。
Amazon S3 オブジェクトに Cache-Control
または Expires
ヘッダーフィールドを追加するには
-
「Amazon S3 ユーザーガイド」の「Amazon S3 コンソールでのオブジェクトメタデータの編集」トピックの「システム定義メタデータの置き換え」セクションの手順に従います。
-
[Key] (キー) で、追加するヘッダーの名前 ([Cache-Control] または [Expires]) を選択します。
-
[Value] (値) で、ヘッダー値を入力します。例えば、
Cache-Control
ヘッダーの場合は、max-age=86400
と入力します。Expires
で、有効期限の日時をWed, 30 Jun 2021 09:28:00 GMT
のように入力できます。 -
残りの手順に従って、メタデータの変更を保存します。