CloudFrontにS3からの最新のHTMLファイルを強制的にパススルーさせる


13

バックグラウンド

S3で静的サイトをホストしており、CloudFrontが上部にあります。私が抱えている問題は、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

myへの最初の呼び出しで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ヘッダーを使用してこれを行うことができますが、これを機能させることはできません。

以下の回答に従う

最終的に、S3バケットを直接指すようにwww CNAMEを変更することにしました。次に、CloudFrontを指す「static」という新しいCNAMEを追加しました。

これは、HTMLがS3から直接送信されることを意味し、S3はstatic.mydomain.comを指すすべてのCSS / JS / IMG参照を持ちます。

回答:


6

まず、Cloudfrontのポイントはキャッシュされたコンテンツを提供することです。Cloudfrontからキャッシュされていないコンテンツを提供しようとすると、ほとんどすべての場合、S3から直接提供するよりも遅くなります(ストリーミングコンテンツのようなものは例外です)。Cloudfrontからコンテンツを提供するために何が起こる必要があるかを少し考慮してください-オリジンサーバーから地理的にユーザーに近い場所に取得する必要があります-つまり、Cloudfrontがオリジンサーバーからコンテンツを取得する必要があるリクエストの場合、リクエストにレイテンシーを追加すると、ユーザーはコンテンツをより遅く受け取ります。コンテンツがエッジロケーションで利用可能になると、その後のリクエストが高速になります。

この問題に対する最善のアプローチは、ページを更新するときにファイル名を変更することです。これにより、Cloudfrontは新しいコンテンツを取得します。繰り返しになりますが、Cloudfrontは通常、メディアファイル(画像を含む)とstyle / javascriptに使用され、htmlにはあまり使用されないことに注意してください。本質的に、S3にHTMLがあり、Cloudfrontに画像があります。変更を加えると、Cloudfrontのファイルの名前を変更できます(file-v1.jpg、file-v2.jpgなど)。別の一般的な方法は、クエリ文字列にバージョン情報を含めることです。

また、Cloudfrontはgzip圧縮されたコンテンツを提供しないことに注意してください-通常のサーバーよりも応答が遅くなる場合があります(ただし、S3はgzip対応のブラウザーも識別しません)。

最後に、必要に応じて、無効化を使用して、Cloudfrontに既存のコピーを破棄させ、元のサーバーから新しいコピーを取得させることができます。ただし、Cloudfrontから無料の無効化が1か月あたり1,000件のみ提供され、その後の費用は無効化あたり0.005ドルです。

Cloudfrontがコンテンツを保持する最低時間は1時間ですが、デフォルトは24時間です。したがって、max-ageを少なくとも3600に設定しようとします。s-maxageヘッダーも考慮します(共有コンテンツ、つまりプロキシコンテンツ用)。Amazonは、このキャッシュチュートリアルを推奨しています。

これに最近問題があり、数日前に修正されました


S3にCFを貼り付ける理由は、Werner Vogelsが彼のブログ投稿allthingsdistributed.com/2011/02/website_amazon_s3.htmlでそれを言及しているから です。あなたが言うように、s3から直接htmlをルーティングすることを検討するかもしれません。ちょっとした注意点:キャッシュ無効化のためにファイルの最後にクエリ文字列を追加することは、一部のプロキシがキャッシュされない原因となる可能性があるため、良いアイデアではありません。
isNaN1247

この男は、すべてのアップロードで無効化を使用しているようです。これは、jmlacroix.comを
isNaN1247

1
クエリ文字列はCloudfrontでは機能しません-ファイルをキャッシュしませんが、コンテンツを直接提供する場合は効果的です。S3のHTMLが最善の策です。アップロードするたびにすべてを無効にしたくないことは間違いありませんが、変更されたファイルを無効にすることは、場合によってはメリットがないわけではありません。Cloudfrontのメリットは、トラフィックの多いサイトでのみ重要になります。平均的なサイトでは、S3がパフォーマンスを向上させることもあります(特に、Cloudfrontの速度が遅い小さなオブジェクトの場合、両方を試してみてください)。
cyberx86

2
CloudfrontはGzip圧縮をサポートするようになりました。お知らせはこちら
グレッグサデツキー16年

最近の@ cyberx86の制限は異なります:The minimum expiration time CloudFront supports is 0 seconds for web distributions and 3600 seconds for RTMP distributions. docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…– xvga 18
1

20

Cloudfrontが最小TTLの0をサポートするようになり、OPのcache-age = 0を使用する元の試行が機能するようになったため、これまでの回答は現時点では正しいものの、時代遅れになっていると思います。

これらの他のcache-controlヘッダーを使用するかどうか、探している結果を生成するかどうかを検討する必要があります-max-ageのみが必要な場合があります。おそらく必要なのは、CloudfrontがS3をチェックしてHTMLファイルが変更されているかどうかを確認することです。持っている場合、Cloudfrontは新しいファイルを取得して返すことができます。そうでない場合は、既存のキャッシュからクライアントにサービスを提供できます(S3帯域幅を節約し、クライアントにより速く、よりローカルにサービスを提供します)。

Cloudfrontのポイントは、キャッシュされたコンテンツを提供することです(はい)。ただし、これには時々変更されるコンテンツが含まれますが、変更されていない場合はキャッシュできます。

PSクエリ文字列もCloudfrontで機能するようになりました(関連するオリジンの「動作」を設定した場合-別の新しい機能)、ただし、一部のプロキシはクエリ文字列を含むファイルのキャッシュに失敗する場合があります。

Amazon開発者ガイド:有効期限1


-1

CloudFrontが現在のヘッダーをどのように扱うかはわかりませんが、ヘッダーを指定しない場合、オブジェクトを更新するデフォルトの時間は24時間です。

オブジェクトを更新するためにできることの1つは、コンテンツを無効にすることです。詳細については、以下のリンクをご覧ください。 http://blog.cloudberrylab.com/2010/08/how-to-manage-cloudfront-object.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.