コンテンツがキャッシュに保持される期間 (有効期限) の管理 - Amazon CloudFront

コンテンツがキャッシュに保持される期間 (有効期限) の管理

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

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

  • CloudFront キャッシュに最新バージョンがすでにある場合、オリジンはステータスコード 304 Not Modified を返します。

  • CloudFront キャッシュに最新バージョンがない場合、オリジンはステータスコード 200 OK とファイルの最新バージョンを返します。

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

デフォルトでは、各ファイルは 24 時間後に自動的に有効期限切れになりますが、2 つの方法でこのデフォルトの動作を変更できます。

[Minimum TTL (最小 TTL)]、[Default TTL (デフォルト TTL)]、[Maximum TTL (最大 TTL)] が Cache-Control max-age ディレクティブ、Cache-Control 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

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

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

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

Cache-Control および Expires ヘッダーフィールドの詳細については、「RFC 2616、ハイパーテキスト転送プロトコル –– HTTP/1.1」の以下のセクションを参照してください。

AWS SDK for PHP を使用して Cache-Control および Expires ヘッダーフィールドを追加する方法の例については、Amazon Simple Storage Service 開発者ガイドの「AWS SDK for PHP を使用してオブジェクトをアップロードする」を参照してください。これらのフィールドを追加できるサードパーティーツールもあります。

CloudFront がオブジェクトをキャッシュする期間の指定

CloudFront が、オリジンに別のリクエストを送信するまでの期間に オブジェクトをキャッシュに保持する時間の長さを制御するには、次の方法があります。

  • CloudFront ディストリビューションのキャッシュ動作の TTL 値に、最小、最大、およびデフォルトの値を設定します。これらの値は、キャッシュ動作にアタッチされたキャッシュポリシー (推奨) の中、またはレガシーキャッシュ設定の中で設定できます。

  • オリジンからの応答に 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 ディレクティブの値によって異なります。

  • 最小 TTL < max-age < 最大 TTL である場合、CloudFront は Cache-Control: max-age ディレクティブの値に対応する期間、オブジェクトをキャッシュに保持します。

  • max-age < 最小TTL である場合、CloudFront は 最小 TTL の値に対応する期間、オブジェクトをキャッシュに保持します。

  • max-age > 最大 TTL である場合、CloudFront は最大 TTL の値に対応する期間、オブジェクトをキャッシュに保持します。

ブラウザキャッシュ

ブラウザは、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 ディレクティブの値によって異なります。

  • 最小 TTL < s-maxage < 最大 TTL である場合、CloudFront は Cache-Control: s-maxage ディレクティブの値に対応する期間、オブジェクトをキャッシュに保持します。

  • s-maxage < 最小TTL の場合、CloudFront は最小 TTL の値に対応する期間、オブジェクトをキャッシュに保持します。

  • s-maxage > 最大 TTL である場合、CloudFront は最大 TTL の値に対応する期間、オブジェクトをキャッシュに保持します。

ブラウザキャッシュ

ブラウザは、Cache-Control: max-age ディレクティブの値に対応する期間、オブジェクトをキャッシュに保持します。

オリジンが Expires ヘッダーをオブジェクトに追加

CloudFront キャッシュ

CloudFront は、Expires ヘッダーにある日付と最大 TTL の値に対応する日付のうち早い方の日付まで、オブジェクトをキャッシュに保持します。

ブラウザキャッシュ

ブラウザは、Expires ヘッダーにある日付まで、オブジェクトをキャッシュに保持します。

CloudFront キャッシュ

CloudFront キャッシュは、CloudFront 最小 TTL および最大 TTL、Expires ヘッダーの値によって異なります。

  • 最小 TTL Expires < 最大 TTL である場合、CloudFront は Expires ヘッダーの日付けおよび時刻まで、オブジェクトをキャッシュに保持します。

  • Expires < 最小TTL である場合、CloudFront は最小 TTL の値に対応する期間、オブジェクトをキャッシュに保持します。

  • Expires > 最大 TTL である場合、CloudFront は最大 TTL の値に対応する期間、オブジェクトをキャッシュに保持します。

ブラウザキャッシュ

ブラウザは、Expires ヘッダーの日付けおよび時刻まで、オブジェクトをキャッシュに保持します。

オリジンが Cache-Control: no-cacheno-store、および (または) private ディレクティブをオブジェクトに追加

CloudFront とブラウザはヘッダーを優先させます。

CloudFront が Cache-Control: no-cache ヘッダーを処理する方法の例外については、「同じオブジェクト (トラフィックスパイク) の同時リクエスト」を参照してください。

CloudFront キャッシュ

CloudFront は、最小 TTL の値に対応する期間、オブジェクトをキャッシュに保持します。この表の下にある注意点をお読みください。

ブラウザキャッシュ

ブラウザはヘッダーを優先します。

警告

CloudFront が、Cache-Control: no-cacheno-store、および (または) private ディレクティブを含むオリジンからオブジェクトを取得した後、同じオブジェクトに対する別のビューワーリクエストを受け取った場合、CloudFront はこのビューワーリクエストを処理するためオリジンと通信します。

オリジンとの接続が可能な場合、CloudFront はオリジンからオブジェクトを取得し、ビューワーに返します。

オリジンが接続不能で、さらに最小 TTL が 0 より大きい場合、CloudFront は、先にオリジンから取得済みのオブジェクトを返信します。この動作を回避するには、Cache-Control: stale-if-error=0 ディレクティブに、オリジンから返されたオブジェクトを含めます。このようにすることで、オリジンが接続不能な場合に CloudFront が以後のリクエストに応答する際、以前にオリジンから取得したオブジェクトを返すのではなくエラーを返すようになります。

CloudFront コンソールを使用して、ディストリビューションの設定を変更する方法については、「ディストリビューションの更新」を参照してください。CloudFront API を使用してディストリビューションの設定を変更する方法については、「UpdateDistribution」を参照してください。

Amazon S3 コンソールを使用したオブジェクトへのヘッダーの追加

Amazon S3 コンソールを使用して Amazon S3 オブジェクトに Cache-Control または Expires ヘッダーフィールドを追加するには

  1. AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. バケットの一覧で、ヘッダーを追加するファイルを含むバケットの名前を選択します。

  3. ヘッダーを追加するファイルまたはフォルダの名前の横にあるチェックボックスをオンにします。フォルダにヘッダーを追加すると、そのフォルダ内のすべてのファイルに影響します。

  4. [Actions] (アクション) を選択し、[Edit metadata] (メタデータの編集) を選択します。

  5. [Add metadata] (メタデータを追加) パネルで 、次の操作を行います。

    1. [Add metadata] (メタデータの追加) を選択します。

    2. [Type] (タイプ) で、[System defined] (システム定義) を選択します。

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

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

  6. ページの最下部で [Edit metadata] (メタデータの編集) を選択します。