บังคับให้ CloudFront ส่งผ่านไฟล์ HTML ล่าสุดจาก S3


13

พื้นหลัง

ฉันโฮสต์เว็บไซต์คงที่ใน S3 กับ CloudFront ด้านบน ปัญหาที่ฉันมีอยู่กับไฟล์ HTML ของฉัน

ตามคำถามที่พบบ่อยของ CloudFront :

Amazon CloudFront ใช้ส่วนหัวควบคุมแคชเหล่านี้เพื่อกำหนดความถี่ในการตรวจสอบจุดเริ่มต้นของไฟล์นั้น ๆ

สิ่งที่ฉันทำไปแล้ว

ด้วยสิ่งนี้ในใจฉันได้ตั้งค่าไฟล์ HTML ใน S3 Bucket ของฉันเพื่อเพิ่มในส่วนหัวต่อไปนี้:

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

ข้อมูลอย่างย่อ / คำถาม

จากที่กล่าวมาข้างต้นฉันจะได้รับ HTML ล่าสุดโดยอัตโนมัติเมื่อใช้ CloudFront ได้อย่างไร

ตามคำถามที่พบบ่อยฉันควรจะทำเช่นนี้กับส่วนหัวของ Cache-Control แต่ฉันไม่สามารถทำงานนี้ได้

ทำตามคำตอบด้านล่าง

ในที่สุดฉันก็ตัดสินใจเปลี่ยน www CNAME ของฉันให้ชี้ไปที่ถัง S3 ของฉันโดยตรง จากนั้นเพิ่ม CNAME ใหม่ชื่อ "คงที่" ซึ่งชี้ไปที่ CloudFront

ซึ่งหมายความว่า HTML นั้นโดยตรงจาก S3 ซึ่งมีการอ้างอิง CSS / JS / IMG ทั้งหมดที่ชี้ไปที่ static.mydomain.com

คำตอบ:


6

ประการแรกประเด็นของ Cloudfront คือการให้บริการเนื้อหาแคช - หากคุณพยายามแสดงเนื้อหาที่ไม่ได้ใช้งานจาก Cloudfront มันช้ากว่าการให้บริการโดยตรงจาก S3 ในเกือบทุกกรณี (สิ่งที่ชอบการสตรีมเนื้อหาจะเป็นข้อยกเว้น) พิจารณาสักครู่สิ่งที่ต้องเกิดขึ้นเพื่อให้บริการเนื้อหาจาก Cloudfront - จำเป็นต้องดึงข้อมูลจากเซิร์ฟเวอร์ต้นทางไปยังตำแหน่งที่อยู่ใกล้กับผู้ใช้ทางภูมิศาสตร์ - ซึ่งหมายความว่าสำหรับคำขอที่ Cloudfront ต้องดึงเนื้อหาจากเซิร์ฟเวอร์ต้นทาง คุณเพิ่มเวลาแฝงเพิ่มเติมลงในคำขอและผู้ใช้ได้รับเนื้อหาช้าลง จะมีเพียงครั้งเดียวที่เนื้อหาพร้อมใช้งานที่ตำแหน่งขอบซึ่งการร้องขอที่ตามมาจะเร็วกว่า

วิธีที่ดีที่สุดในการแก้ไขปัญหานี้คือการเปลี่ยนชื่อไฟล์ของคุณเมื่อคุณอัปเดตหน้าเว็บซึ่งจะบังคับให้ Cloudfront เรียกเนื้อหาใหม่ โปรดจำไว้ว่าโดยทั่วไปแล้ว Cloudfront จะใช้สำหรับไฟล์สื่อ (รวมถึงรูปภาพ) และสไตล์ / จาวาสคริปต์ - และไม่มากสำหรับ html โดยพื้นฐานแล้วคุณจะมี HTML ใน S3 และรูปภาพของคุณบน Cloudfront - เมื่อมีการเปลี่ยนแปลงใด ๆ คุณสามารถเปลี่ยนชื่อของไฟล์บน Cloudfront (เช่น file-v1.jpg, file-v2.jpg, ฯลฯ ) วิธีการทั่วไปอีกวิธีหนึ่งคือการรวมสตริงการสืบค้นด้วยข้อมูลรุ่น

นอกจากนี้โปรดทราบว่า Cloudfront ไม่ให้บริการเนื้อหา gzipped ซึ่งอาจส่งผลให้การตอบสนองช้ากว่าเซิร์ฟเวอร์ปกติ (แม้ว่าในกรณีของคุณ S3 จะไม่ระบุเบราว์เซอร์ที่รองรับ gzip)

ในที่สุดหากคุณต้องการคุณสามารถใช้การบังคับใช้เพื่อบังคับให้ Cloudfront ยกเลิกการคัดลอกที่มีอยู่แล้วดึงข้อมูลใหม่จากเซิร์ฟเวอร์ต้นทาง อย่างไรก็ตามโปรดทราบว่า Cloudfront ให้การตรวจสอบความถูกต้องฟรี 1,000 ครั้งต่อเดือนหลังจากนั้นค่าใช้จ่ายคือ $ 0.005 / การตรวจสอบความถูกต้อง

เวลาต่ำสุดที่ Cloudfront จะเก็บเนื้อหาไว้คือ1 ชั่วโมงแม้ว่าค่าเริ่มต้นคือ 24 ชั่วโมง ฉันจึงพยายามตั้งค่าอายุสูงสุดอย่างน้อย 3600 ลองพิจารณาส่วนหัว s-maxage (สำหรับการแชร์ - เช่นเนื้อหาพร็อกซี) Amazon แนะนำการสอนการแคชนี้

มีปัญหาเมื่อเร็ว ๆ นี้กับสิ่งนี้แก้ไขไม่กี่วันที่ผ่านมา


เหตุผลสำหรับการติด CF มากกว่า S3 มาจากแวร์เนอร์ Vogels กล่าวขวัญตัวเองในการโพสต์บล็อกของเขา allthingsdistributed.com/2011/02/website_amazon_s3.html ฉันอาจพิจารณากำหนดเส้นทาง html โดยตรงจาก s3 ตามที่คุณพูด หมายเหตุเล็กน้อยหนึ่งรายการ: การเพิ่มสตริงการสืบค้นที่ท้ายไฟล์เพื่อป้องกันการแคชไม่ใช่ความคิดที่ดีเพราะจะทำให้พร็อกซีบางตัวไม่เคยแคช
isNaN1247

ผู้ชายคนนี้ดูเหมือนว่าจะใช้การตรวจสอบความถูกต้องในการอัปโหลดทุกครั้งซึ่งดูเหมือน overkill jmlacroix.com
isNaN1247

1
สตริงการสืบค้นจะไม่ทำงานกับ Cloudfront ซึ่งจะไม่แคชไฟล์ แต่จะมีประสิทธิภาพหากคุณให้บริการเนื้อหาโดยตรง HTML จาก S3 จะเป็นทางออกที่ดีที่สุดของคุณ แน่นอนว่าคุณไม่ต้องการทำให้ทุกอย่างในการอัปโหลดเป็นโมฆะ แต่การทำให้ไฟล์ที่มีการเปลี่ยนแปลงเป็นโมฆะนั้นอาจไม่ได้รับการยอมรับในบางกรณี ข้อดีของ Cloudfront นั้นมีความเกี่ยวข้องกับไซต์ที่ถูกค้ามนุษย์อย่างหนักเท่านั้น - สำหรับไซต์เฉลี่ยของคุณ S3 อาจเสนอประสิทธิภาพที่ดีกว่า (ลองทั้งคู่และดู - โดยเฉพาะสำหรับวัตถุขนาดเล็ก Cloudfront อาจช้า)
cyberx86

2
ตอนนี้ Cloudfront รองรับการบีบอัด Gzip ประกาศที่นี่
เกร็ก Sadetsky

@ ขีด จำกัด ของ 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/?hl=th
xvga

20

ฉันเชื่อว่าคำตอบจนถึงขณะนี้ถูกต้องในขณะนี้ล้าสมัยเนื่องจาก Cloudfront สนับสนุน TTL ขั้นต่ำเป็น 0 และความพยายามดั้งเดิมของ OP ในการใช้ cache-age = 0 ควรจะทำงานได้แล้ว

คุณต้องการดูว่าจะใช้ส่วนหัวควบคุมแคชอื่น ๆ หรือไม่ในแง่ของว่าพวกเขาจะสร้างผลลัพธ์ที่คุณต้องการหรือไม่คุณอาจต้องมีอายุสูงสุดเท่านั้น สิ่งที่คุณอาจต้องการสำหรับ Cloudfront เพื่อตรวจสอบ S3 เพื่อดูว่ามีการเปลี่ยนแปลงไฟล์ HTML ถ้าเป็นเช่นนั้น Cloudfront สามารถดึงและคืนไฟล์ใหม่ได้ หากไม่สามารถให้บริการลูกค้าได้จากแคชที่มีอยู่ (สงวนแบนด์วิดท์ S3 และให้บริการลูกค้าได้เร็วขึ้นและมากขึ้นในพื้นที่)

จุดของ Cloudfront คือการให้บริการเนื้อหาแคชใช่ แต่ตอนนี้รวมถึงเนื้อหาที่บางครั้งการเปลี่ยนแปลง แต่สามารถแคชถ้ามันไม่เปลี่ยนแปลง

สตริงการสืบค้น Ps ยังทำงานกับ Cloudfront ได้ในขณะนี้ (หากคุณกำหนดค่า 'พฤติกรรม' สำหรับแหล่งกำเนิดที่เกี่ยวข้อง - คุณลักษณะใหม่อื่น) อย่างไรก็ตามพร็อกซีบางแห่งอาจยังไม่สามารถแคชไฟล์ใด ๆ ที่มีสตริงข้อความค้นหา

คู่มือผู้พัฒนา Amazon: วันหมดอายุ1


-1

ไม่แน่ใจว่า CloudFront ปฏิบัติต่อส่วนหัวเช่นเดียวกับคุณได้อย่างไร แต่ถ้าคุณไม่ระบุส่วนหัวใด ๆ เวลาเริ่มต้นในการรีเฟรชออบเจ็กต์คือ 24 ชั่วโมง

สิ่งหนึ่งที่คุณสามารถทำได้เพื่อรีเฟรชวัตถุคือการทำให้เนื้อหาไม่ถูกต้อง ตรวจสอบลิงค์ด้านล่างของข้อมูลเพิ่มเติม http://blog.cloudberrylab.com/2010/08/how-to-manage-cloudfront-object.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.