web-dev-qa-db-ja.com

AWSクラウドフロントがS3のファイルの更新時に更新されない

S3のファイルを使用して、cloudfrontでディストリビューションを作成しました。それはうまくいき、私のファイルはすべて利用可能でした。しかし、今日、私はS3でファイルを更新し、Cloudfront経由でそれらにアクセスしようとしましたが、それでも古いファイルが提供されました。

何が欠けていますか?

27
Jigar Tank

CloudFrontディストリビューションキャッシュ内のオブジェクトを無効にする必要があります。昔は一度に1ファイルずつ実行する必要がありましたが、ワイルドカードで実行できるようになりました。/images/*

https://aws.Amazon.com/about-aws/whats-new/2015/05/Amazon-cloudfront-makes-it-easier-to-invalidate-multiple-objects/

6
jpaljasma

AWS S3コンソールを介してCache-Control max-ageを変更する方法:

  • Cache-Controlを変更するファイルに移動します。
  • ファイル名の横にあるチェックボックスをオンにします(青色になります)
  • 右上のPropertiesをクリックします
  • Metadataをクリックします
  • Cache-Controlという名前のKeyが表示されない場合は、Add more metadataをクリックします。
  • KeyCache-Controlに設定しますValuemax-age=0に設定します(0は、ファイルをキャッシュに残しておく秒数です)。 0は好きなものに置き換えることができます。

enter image description here

4
nu everest

CloudFrontを使用する主な利点は、ソース(この場合はS3)からファイルを取得し、それをエッジサーバーに保存して、GETリクエストにすばやく応答できることです。 CloudFrontは、HTTPリクエストごとにS3ソースに戻りません。

CloudFrontに最新のフィールド/オブジェクトを提供させるには、複数のオプションがあります。

CloudFrontを使用して変更されたオブジェクトを無効にする

CloudFrontを使用して、手動で、またはトリガーを使用して、1つ以上のファイルまたはディレクトリを無効にすることができます。このオプションは、ここの他の応答で説明されています。詳細は CloudFrontの複数のオブジェクトを無効にする を参照してください。この方法は、ファイルを頻繁に更新せず、キャッシュされたオブジェクトのパフォーマンス上の利点に影響を与えたくない場合に便利です。

S3オブジェクトのオブジェクト有効期限の設定

これが現在推奨されるソリューションです。それは簡単です:

  • AWSマネジメントコンソールにログイン
  • S3バケットに入る
  • すべてのファイルを選択
  • メニューから「アクション」ドロップダウンを選択します
  • 「メタデータの変更」を選択します
  • [Key]フィールドで、ドロップダウンメニューから[Cache-Control]を選択します。
  • 「値」フィールドに、「max-age = 300」(秒数)を入力します
  • [保存]ボタンを押しますCloudFrontオブジェクトのデフォルトのキャッシュ値は24時間です。これを低い値に変更することにより、CloudFrontはS3ソースをチェックして、オブジェクトの新しいバージョンがS3で使用可能かどうかを確認します。

これら2つの方法を組み合わせて使用​​して、更新がEdgeの場所に迅速に伝達され、CloudFrontで管理されている古いファイルが提供されないようにします。

ただし、AWSでは、各ファイル名にバージョン識別子を使用してオブジェクト名を変更することをお勧めします。ビルドコマンドを使用してファイルをコンパイルしている場合、そのオプションは通常利用できます(react npm buildコマンドの場合と同様)。

0
Saeed D.

Tedder42とChris Healdに感謝

Origin、つまりs3オブジェクトのキャッシュ期間を短縮し、デフォルトの24時間よりも迅速にファイルを配信することができました。他の一部のディストリビューションでは、すべてのヘッダーをOriginに転送するように設定しました。この場合、cloudfrontは何もキャッシュせず、すべてのリクエストをOriginに送信します。

ありがとう。

0
Jigar Tank

この回答を参照してください。これが役立つ場合があります。

Cache-Control:max-age = 0とno-cacheの違いは何ですか?

変数を追加するCache-Controlから0ヘッダーのS3で選択したファイルの This worked me

0
banoth ravinder

私もこの問題を抱えており、バージョン管理(S3バージョン管理とは異なります)を使用して解決しました。これは、cloudfrontでバージョニングを使用するための包括的なリンクです

ファイルの無効化 要約すると:

新しいファイルをS3バケットにアップロードするときは、バージョンを変更し、必要に応じてリンクを更新します。ドキュメントから、バージョニングと無効化を使用することのメリット(これを行う別の方法)は、バージョンの変更によってCloudFrontを更新するのに追加料金が発生しないことですが、無効化はあります。何百ものファイルがある場合、これは問題となる可能性がありますが、ルートディレクトリまたはデフォルトのルートオブジェクト(該当する場合)にバージョンを追加することで問題が発生する可能性はありません。私の場合、SPAがあります。デフォルトルートオブジェクトのバージョン(index.htmlをindex2.html)に変更するだけで、CloudFrontで即座に更新されます。

0
Farasi78

同じ問題が発生しました。最初に、更新したS3バケット内のファイルについて、キャッシュコントロールを0に、max-age = 0に更新してみましたが、機能しませんでした。

機能したのは、@ jpaljasmaの手順に従っていました。ここにいくつかのスクリーンショットの手順があります。

まずAWS CloudFrontサービスに移動します。

次に、無効にするCloudFrontディストリビューションをクリックします。 enter image description here

[無効化]タブをクリックし、赤で囲まれた[無効化の作成]をクリックします。 enter image description here

「オブジェクトパス」テキストフィールドには、特定のファイル、つまり/index.htmlまたはワイルドカードを使用する/*すべてを無効にします。これにより、cloudfrontはS3バケット内のすべてから最新のものを取得します。

テキストフィールドに入力したら、[無効化]をクリックします。CloudFrontが無効化を終了すると、次にウェブページに移動したときに変更が表示されます。

enter image description here

0
CAM_344