CloudFrontを上にして、S3で静的サイトをホストしています。私の問題は私のHTMLファイルにあります。
CloudFrontのFAQ によると:
Amazon CloudFrontは、これらのキャッシュ制御ヘッダーを使用して、そのファイルの更新されたバージョンについてオリジンをチェックする必要がある頻度を決定します
これを念頭に置いて、S3バケットのHTMLファイルを次のヘッダーに追加するように設定しました。
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: Fri, 01 Jan 1990 00:00:00 GMT
私のsamplefile.htm
への最初の呼び出しで、ポイントを維持するために、次の応答ヘッダーが表示されます(明白なヘッダー(例:Content-Type
)を除外しました)。
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Date:Sat, 10 Dec 2011 14:16:51 GMT
ETag:"a5890ace30a3e84d9118196c161aeec2"
Expires:Fri, 01 Jan 1990 00:00:00 GMT
Last-Modified:Sat, 10 Dec 2011 14:16:43 GMT
Server:AmazonS3
X-Cache:Miss from cloudfront
ご覧のとおり、私のCache-Control
ヘッダーがそこにあります。問題は、このファイルを更新して更新すると(最新のファイルではなく)キャッシュされたコンテンツが表示され、応答ヘッダーを確認することで、CloudFrontがキャッシュされたバージョンを提供していることがわかります。
X-Cache:Hit from cloudfront
上記を念頭に置いて、CloudFrontを使用しているときに最新のHTMLを自動的に取得するにはどうすればよいですか?
FAQのとおり、私はCache-Controlヘッダーでこれを行うことができるはずですが、これを機能させることができないようです。
最終的に、www CNAMEを変更してS3バケットを直接指すようにすることにしました。次に、CloudFrontを指す「静的」と呼ばれる新しいCNAMEを追加しました。
これは、HTMLがS3から直接のものであることを意味し、S3はすべてのCSS/JS/IMG参照がstatic.mydomain.comを指すようにします。
まず、Cloudfrontのポイントは、キャッシュされたコンテンツを提供することです。キャッシュされていないコンテンツをCloudfrontから提供しようとすると、ほとんどすべての場合、S3から直接提供するよりも遅くなります(ストリーミングコンテンツなどは例外です)。 Cloudfrontからコンテンツを提供するために何が必要かを考えてみましょう。Originサーバーからユーザーに地理的に近い場所に取得する必要があります。つまり、CloudfrontがOriginサーバーからコンテンツを取得する必要があるリクエストの場合です。 、リクエストにレイテンシを追加すると、ユーザーのコンテンツの受信が遅くなります。エッジの場所でコンテンツが利用可能になると、その後のリクエストがより速くなります。
この問題に対する最善のアプローチは、ページを更新するときにファイル名を変更することです。これにより、Cloudfrontが新しいコンテンツを取得するようになります。繰り返しますが、Cloudfrontは通常、メディアファイル(画像を含む)とスタイル/ JavaScriptに使用され、HTMLにはあまり使用されないことに注意してください。基本的には、S3にHTML、Cloudfrontに画像を配置します。変更を加えると、Cloudfront上のファイルの名前を変更できます(file-v1.jpg、file-v2.jpgなど)。別の一般的な方法は、バージョン情報を含むクエリ文字列を含めることです。
また、Cloudfrontはgzip圧縮されたコンテンツを提供しないことに注意してください。これにより、通常のサーバーよりも応答が遅くなる場合があります(ただし、S3はgzip対応のブラウザーも識別しません)。
最後に、必要に応じて、無効化を使用してCloudfrontに既存のコピーを破棄させ、Originサーバーから新しいコピーをフェッチさせることができます。ただし、Cloudfrontが提供する無料の無効化は1か月あたり1000のみであり、その後のコストは$ 0.005 /無効化です。
Cloudfrontがコンテンツを保持する最低時間は 1hr ですが、デフォルトは24時間です。したがって、私はmax-ageを少なくとも3600に設定しようとします。s-maxageヘッダーも検討してください(共有-プロキシされたコンテンツの場合)。 Amazonは this キャッシングチュートリアルを推奨しています。
最近の問題 がありました。これで、数日前に修正されました
Cloudfrontが最小のTTL= 0をサポートし、OPの元のcache-age = 0を使用する試みがサポートされるようになったため、これまでの答えは現時点では正しいとはいえ、古くなっていると思いますこれで動作するはずです。
あなたが探している結果を生み出すかどうかという観点から、これらの他のキャッシュ制御ヘッダーを使用するかどうかを調べたいと思います-max-ageだけが必要な場合があります。 CloudfrontがS3をチェックして、HTMLファイルが変更されているかどうかを確認することがおそらく必要です。ある場合、Cloudfrontは新しいファイルをフェッチして返すことができます。そうでない場合は、既存のキャッシュからクライアントにサービスを提供できます(S3帯域幅を節約し、クライアントをより速くローカルに提供します)。
Cloudfrontのポイントは、キャッシュされたコンテンツを提供することです、はい、ただし、これには時々変更されるコンテンツが含まれますが、変更されていない場合はキャッシュすることができます。
追伸クエリ文字列は現在Cloudfrontでも機能します(関連するOriginの「動作」を構成する場合-別の新機能)。ただし、一部のプロキシはクエリ文字列を含むファイルをキャッシュできません。
Amazon開発者ガイド:有効期限 1