CloudFront が、Amazon S3 から古いコンテンツを提供し続けるのはなぜですか?

最終更新日: 2021 年 1 月 28 日

Amazon Simple Storage Service (Amazon S3) に格納されているオブジェクトを提供するために Amazon CloudFront を使用しています。S3 のオブジェクトを更新しても、CloudFront ディストリビューションは前のバージョンのファイルを提供します。CloudFront で Amazon S3 コンテンツが更新されないのはなぜですか? どうすれば解決できますか?

簡単な説明

デフォルトでは、CloudFront は Amazon S3 からのレスポンスを 24 時間 (86,400 秒間のデフォルト TTL) キャッシュしています。リクエストが エッジロケーションに到着してから24 時間以内に Amazon S3 を提供した場合、Amazon S3 のコンテンツを更新したとしても、CloudFront はキャッシュされたレスポンスを使います。

次のいずれかの方法で、CloudFront の更新された S3 コンテンツを CloudFront にプッシュできるようになります。

解決方法

S3 オブジェクトを無効にする

S3 オブジェクト無効にして、CloudFront ディストリビューションのキャッシュからレスポンスを削除できます。オブジェクトがキャッシュから削除されると、次のリクエストでは、 Amazon S3 から直接オブジェクトを取得します。

無効化を実行する前に、以下の点を考慮してください。

  • 無効化は、ウェブディストリビューション上でしか実行できません。リアルタイムメッセージングプロトコル (RTMP) ディストリビューションは、無効にすることができません。
  • 特定バージョンの Cookie を使用するオブジェクトやレスポンスを変更するヘッダーを無効にすることはできません。この場合、CloudFront はオブジェクトのすべてのバージョンを無効にします。
  • 各 AWS アカウントには、無料で 1 か月あたり 1,000 回のパスの無効化が許可されています。パスの無効化が 1 か月あたり 1000 回を超える場合は、「Amazon CloudFront の料金」にある「無効リクエスト」の覧をご参照ください。

無効化を作成する際は、オブジェクトパスが次の要件を満たしていることをご確認ください。

  • オブジェクトパスは、個々のオブジェクトであること、あるいはパスの最後がワイルドカード文字 (*) になっている必要があります。たとえば、/images/*.jpeg のようなパスを無効化できません。これは、パスが個々のオブジェクトに対応してないこと、そして最後にワイルドカードが付いていないからです。
  • 指定したパスは、オブジェクトのパスの大文字に完全に一致する必要があります。無効化リクエストでは、大文字と小文字が区別されます。
  • クエリ文字列に基づく特定のバージョンのオブジェクトを削除するには、無効化パスに QueryString を含めます。

オブジェクトの無効化を完了するには、通常 60~300 秒かかります。無効化のステータスを確認するには、CloudFront コンソールでディストリビューションを表示します。

オブジェクトのバージョニングを使用する

コンテンツを頻繁に更新する場合は、CloudFront ディストリビューションのキャッシュを消去するベストプラクティスは、オブジェクトのバージョニングを使用することです。オブジェクトのバージョニングを使用した頻繁なキャッシュ更新の方が、無効化を使用するよりもコストが低くなることがあります。

次のいずれかの方法を使用して、バージョニングをオブジェクトに追加します。

  • キー名にバージョン番号を含めながら、オブジェクトの新しいバージョンをオリジンに保存します。たとえば、/image_v1.png を更新する場合、オブジェクトの新しいバージョンを /image_v2.png として保存します。
  • オリジンでオブジェクトを更新し、オブジェクトのバージョンを含むクエリ文字列に基づいてキャッシュします。例えば、クエリ文字列を /image.png?ver=1 から /image.png?ver=2に更新します。キャッシュポリシーを使用して、キャッシュキーおよびオリジン要求に含めるクエリ文字列を指定できます。
    注意: CloudFront キャッシュで利用可能である間は、以前のバージョン (/image.png?ver=1) もリクエストできます。

オブジェクトバージョニングの各方法には、次のような利点と欠点があります。

  • オブジェクトの新しいバージョンをオリジン(Amazon S3)に保存する場合は、以前のバージョンも引き続き同じ名前で使用できるため、変更を元に戻すことが可能です。ただし、複数バージョンのオブジェクトを保存することで、ストレージコストが増加する場合があります。
  • オリジンではオブジェクトを更新しながら、クエリ文字列に基づいたキャッシュを行えば、ストレージコストを削減できます。ただし、ロールバックの準備段階では、古いバージョンのオブジェクトをオフラインにしておくことがベストプラクティスです。