S3のファイルを使用して、cloudfrontでディストリビューションを作成しました。それはうまくいき、私のファイルはすべて利用可能でした。しかし、今日、私はS3でファイルを更新し、Cloudfront経由でそれらにアクセスしようとしましたが、それでも古いファイルが提供されました。
何が欠けていますか?
CloudFrontディストリビューションキャッシュ内のオブジェクトを無効にする必要があります。昔は一度に1ファイルずつ実行する必要がありましたが、ワイルドカードで実行できるようになりました。/images/*
CloudFrontを使用する主な利点は、ソース(この場合はS3)からファイルを取得し、それをエッジサーバーに保存して、GETリクエストにすばやく応答できることです。 CloudFrontは、HTTPリクエストごとにS3ソースに戻りません。
CloudFrontに最新のフィールド/オブジェクトを提供させるには、複数のオプションがあります。
CloudFrontを使用して、手動で、またはトリガーを使用して、1つ以上のファイルまたはディレクトリを無効にすることができます。このオプションは、ここの他の応答で説明されています。詳細は CloudFrontの複数のオブジェクトを無効にする を参照してください。この方法は、ファイルを頻繁に更新せず、キャッシュされたオブジェクトのパフォーマンス上の利点に影響を与えたくない場合に便利です。
これが現在推奨されるソリューションです。それは簡単です:
これら2つの方法を組み合わせて使用して、更新がEdgeの場所に迅速に伝達され、CloudFrontで管理されている古いファイルが提供されないようにします。
ただし、AWSでは、各ファイル名にバージョン識別子を使用してオブジェクト名を変更することをお勧めします。ビルドコマンドを使用してファイルをコンパイルしている場合、そのオプションは通常利用できます(react npm buildコマンドの場合と同様)。
Tedder42とChris Healdに感謝
Origin、つまりs3オブジェクトのキャッシュ期間を短縮し、デフォルトの24時間よりも迅速にファイルを配信することができました。他の一部のディストリビューションでは、すべてのヘッダーをOriginに転送するように設定しました。この場合、cloudfrontは何もキャッシュせず、すべてのリクエストをOriginに送信します。
ありがとう。
この回答を参照してください。これが役立つ場合があります。
私もこの問題を抱えており、バージョン管理(S3バージョン管理とは異なります)を使用して解決しました。これは、cloudfrontでバージョニングを使用するための包括的なリンクです
ファイルの無効化 要約すると:
新しいファイルをS3バケットにアップロードするときは、バージョンを変更し、必要に応じてリンクを更新します。ドキュメントから、バージョニングと無効化を使用することのメリット(これを行う別の方法)は、バージョンの変更によってCloudFrontを更新するのに追加料金が発生しないことですが、無効化はあります。何百ものファイルがある場合、これは問題となる可能性がありますが、ルートディレクトリまたはデフォルトのルートオブジェクト(該当する場合)にバージョンを追加することで問題が発生する可能性はありません。私の場合、SPAがあります。デフォルトルートオブジェクトのバージョン(index.htmlをindex2.html)に変更するだけで、CloudFrontで即座に更新されます。
同じ問題が発生しました。最初に、更新したS3バケット内のファイルについて、キャッシュコントロールを0に、max-age = 0に更新してみましたが、機能しませんでした。
機能したのは、@ jpaljasmaの手順に従っていました。ここにいくつかのスクリーンショットの手順があります。
まずAWS CloudFrontサービスに移動します。
次に、無効にするCloudFrontディストリビューションをクリックします。
[無効化]タブをクリックし、赤で囲まれた[無効化の作成]をクリックします。
「オブジェクトパス」テキストフィールドには、特定のファイル、つまり/index.html
またはワイルドカードを使用する/*
すべてを無効にします。これにより、cloudfrontはS3バケット内のすべてから最新のものを取得します。
テキストフィールドに入力したら、[無効化]をクリックします。CloudFrontが無効化を終了すると、次にウェブページに移動したときに変更が表示されます。