Memaksa CloudFront untuk melewatkan file HTML terbaru dari S3

13

Latar Belakang

Saya hosting situs statis di S3, dengan CloudFront di atasnya. Masalah yang saya miliki adalah dengan file HTML saya.

Menurut FAQ CloudFront :

Amazon CloudFront menggunakan tajuk kontrol cache ini untuk menentukan seberapa sering perlu memeriksa asal untuk versi yang diperbarui dari file itu

Apa yang telah saya lakukan sejauh ini

Dengan mengingat hal ini, saya telah mengatur file HTML di S3 Bucket saya untuk menambahkan header berikut:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: Fri, 01 Jan 1990 00:00:00 GMT

Pada panggilan pertama saya ke saya samplefile.htm, saya melihat tajuk respons berikut (saya sudah mengecualikan tajuk yang jelas (misalnya Content-Type) untuk tetap pada intinya:

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

Seperti yang Anda lihat, Cache-Controltajuk saya ada di sana. Masalahnya adalah, jika saya memperbarui file ini dan menyegarkan saya mendapatkan konten yang di-cache (daripada file terbaru), dan saya bisa melihat bahwa CloudFront melayani versi yang di-cache dengan melihat header respons:

X-Cache:Hit from cloudfront

Ringkasan / pertanyaan

Dengan pemikiran di atas, bagaimana saya dapat mencapai pengambilan otomatis HTML terbaru saat menggunakan CloudFront?

Sesuai dengan FAQ-nya, saya seharusnya bisa melakukan ini dengan header Cache-Control, tapi sepertinya saya tidak bisa membuatnya berfungsi.

Ikuti jawaban di bawah ini

Pada akhirnya saya memutuskan untuk mengubah www CNAME saya untuk menunjuk ke ember S3 saya secara langsung. Kemudian menambahkan CNAME baru yang disebut "statis", yang menunjuk ke CloudFront.

Ini berarti bahwa HTML adalah langsung dari S3, yang kemudian memiliki semua referensi CSS / JS / IMG yang menunjuk ke static.mydomain.com

isNaN1247
sumber

Jawaban:

6

Pertama, tujuan Cloudfront adalah untuk menyajikan konten yang di-cache - jika Anda mencoba untuk menyajikan konten yang tidak di-cache dari Cloudfront, itu lebih lambat daripada menyajikannya langsung dari S3, dalam hampir semua kasus (sesuatu seperti streaming konten akan menjadi pengecualian). Pertimbangkan sejenak apa yang perlu terjadi untuk menayangkan konten dari Cloudfront - perlu diambil dari server asal ke lokasi yang secara geografis dekat dengan pengguna - yang berarti bahwa untuk permintaan di mana Cloudfront harus mengambil konten dari server asal , Anda menambahkan latensi tambahan ke dalam permintaan, dan pengguna menerima konten lebih lambat. Hanya sekali konten tersedia di lokasi tepi permintaan berikutnya lebih cepat.

Pendekatan terbaik untuk masalah ini adalah mengubah nama file Anda ketika Anda memperbarui halaman - ini akan memaksa Cloudfront untuk mengambil konten baru. Sekali lagi, perlu diingat bahwa Cloudfront biasanya digunakan untuk file media (termasuk gambar) dan style / javascript - dan tidak terlalu banyak untuk html. Intinya, Anda akan memiliki HTML pada S3, dan gambar Anda di Cloudfront - dengan perubahan apa pun yang Anda lakukan, Anda dapat mengubah nama file di Cloudfront (mis. File-v1.jpg, file-v2.jpg, dll). Cara umum lainnya adalah memasukkan string kueri dengan informasi versi.

Juga, ingatlah bahwa Cloudfront tidak menayangkan konten yang di-gzip - yang dapat mengakibatkan respons yang lebih lambat daripada dari server biasa (meskipun, dalam kasus Anda, S3 juga tidak mengidentifikasi browser yang mampu gzip).

Akhirnya, jika Anda mau, Anda dapat menggunakan pembatalan untuk memaksa Cloudfront untuk membuang salinan yang ada dan mengambil yang baru dari server asal. Namun, perlu diketahui bahwa Cloudfront hanya memberi Anda 1.000 pembatalan gratis per bulan, setelah itu biayanya adalah $ 0,005 / pembatalan.

Waktu terendah Cloudfront akan menyimpan konten adalah 1 jam , meskipun, standarnya adalah 24 jam. Karena itu saya akan mencoba untuk mengatur usia maksimum untuk setidaknya 3600. Pertimbangkan juga header s-maxage (untuk dibagikan - yaitu konten yang diproksi). Amazon merekomendasikan tutorial caching ini .

Ada masalah baru - baru ini dengan ini, diperbaiki beberapa hari yang lalu

cyberx86
sumber
Alasan menempel CF lebih dari S3 adalah dari Werner Vogels menyebutkannya sendiri di posting blognya allthingsdistributed.com/2011/02/website_amazon_s3.html . Saya mungkin mempertimbangkan untuk merutekan html langsung dari s3 seperti yang Anda katakan. Satu catatan kecil: menambahkan string kueri di akhir file untuk penghilang cache bukanlah ide yang baik karena dapat menyebabkan beberapa proxy tidak pernah melakukan cache.
isNaN1247
Orang ini tampaknya menggunakan pembatalan pada setiap unggahan yang tampaknya berlebihan jmlacroix.com
isNaN1247
1
String kueri tidak akan berfungsi dengan Cloudfront - itu tidak akan melakukan cache file, tetapi mereka bisa efektif jika Anda menyajikan konten Anda secara langsung. HTML dari S3 akan menjadi pilihan terbaik Anda. Anda pasti tidak ingin membatalkan segala sesuatu pada setiap unggahan, tetapi membatalkan file yang telah berubah bukan tanpa prestasi dalam beberapa kasus. Kelebihan Cloudfront hanya benar-benar relevan di situs yang diperdagangkan sangat banyak - untuk situs rata-rata Anda, S3 bahkan mungkin menawarkan kinerja yang lebih baik (coba keduanya dan lihat - terutama untuk objek kecil yang Cloudfront bisa lambat).
cyberx86
2
Cloudfront sekarang mendukung kompresi Gzip. Pengumuman di sini .
Greg Sadetsky
Batas @ cyberx86 berbeda saat ini: 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
20

Saya percaya jawaban sejauh ini, sementara benar pada saat itu, sekarang kedaluwarsa, karena Cloudfront sekarang mendukung TTL minimum 0, dan upaya asli OP untuk menggunakan cache-age = 0 sekarang harus bekerja.

Anda ingin melihat apakah akan menggunakan header kontrol-cache lainnya, dalam hal apakah mereka akan menghasilkan hasil yang Anda cari - Anda mungkin hanya perlu usia maksimal. Apa yang mungkin Anda inginkan adalah Cloudfront untuk memeriksa S3 untuk melihat apakah file HTML telah berubah. Jika sudah, Cloudfront dapat mengambil dan mengembalikan file baru. Jika tidak, ia dapat melayani klien dari cache yang ada (menghemat bandwidth S3, dan melayani klien lebih cepat, dan lebih lokal).

Maksud Cloudfront adalah untuk menyajikan konten yang di-cache, ya, tapi sekarang ini termasuk konten yang terkadang berubah, tetapi dapat di-cache jika belum diubah.

Ps string query juga berfungsi dengan Cloudfront sekarang (jika Anda mengkonfigurasi 'perilaku' untuk asal yang relevan - fitur baru lainnya), namun beberapa proxy mungkin masih gagal untuk men-cache file apa pun dengan string query.

Panduan Pengembang Amazon: Kedaluwarsa 1

Andy Nash
sumber
-1

Tidak yakin bagaimana CloudFront memperlakukan tajuk seperti yang Anda miliki, tetapi jika Anda tidak menentukan tajuk, waktu default untuk menyegarkan objek adalah 24 jam.

Salah satu hal yang dapat Anda lakukan untuk menyegarkan objek adalah Memvalidasi konten. Lihat tautan di bawah ini untuk info lebih lanjut. http://blog.cloudberrylab.com/2010/08/how-to-manage-cloudfront-object.html

Jeff
sumber