ไม่มีส่วนหัวควบคุมแคชสำหรับไฟล์จาก AWS CloudFront พร้อม S3 Origin


27

เราเพิ่งย้ายไปที่ Amazon AWS ขณะนี้เรามีอินสแตนซ์ EC2 ที่ทำงานได้ดี กำลังเรียกใช้ Nginx อยู่ข้างหน้าและ Apache อยู่ข้างหลัง นั่นก็ทำงานได้ดีเช่นกัน ไซต์ทั้งหมดได้รับการเปิดใช้งานอย่างถูกต้องและมีส่วนหัวของ Cache-Control สำหรับไฟล์ที่ให้บริการจาก EC2

มีปัญหากับไฟล์แบบคงที่ทั้งหมดที่เราวางไว้ในAmazon S3ที่ถูกเข้าถึงได้ผ่านCloudFront CDN เราสามารถเข้าถึงไฟล์ได้ดี (และไม่มีปัญหากับ CORS) แต่เห็นได้ชัดว่าCloudFront ไม่ให้บริการไฟล์ที่มีส่วนหัวของ Cache-Control เราต้องการใช้ประโยชน์จากการแคชเบราว์เซอร์

วิธีที่ฉันเห็นอินสแตนซ์ EC2 ไม่ได้มีบทบาทที่นี่เนื่องจากไฟล์สแตติกถูกให้บริการโดยตรงโดย S3 + CloudFront คำขอไม่ได้ไปที่เว็บเซิร์ฟเวอร์ใน EC2

ฉันกำลังหลงทางอยู่

คำถาม: 1) ฉันจะตั้งค่า Cache-Control ได้อย่างไร? 2) เป็นไปได้ไหมที่จะตั้งค่า Cache-Control? จาก S3 หรือ CloudFront

หมายเหตุ: ฉันกดไปสองสามหน้าใน Google ที่คุณสามารถตั้งค่า Header ใน S3 สำหรับแต่ละวัตถุ นั่นไม่ใช่วิธีที่มีประสิทธิผลที่จะทำเป็นพิเศษเพราะในกรณีของฉันเรากำลังพูดถึงวัตถุหลายอย่าง

ขอบคุณ!


กรุณาโพสต์ URL สำหรับวัตถุใน S3 และ URL CloudFront ที่เกี่ยวข้อง ฉันต้องการดูพฤติกรรมที่คุณอธิบายตัวเอง อีกวิธีหนึ่งคือโพสต์ CURL สำหรับแสดงส่วนหัว
ทิม

ฉันได้รับสามารถที่จะเพิ่มส่วนหัวที่กำหนดเอง "หมดอายุ: Sun, 15 ตุลาคม 2027 13:46:07 GMT" โดยการแก้ไขกำเนิดในconsole.aws.amazon.com/cloudfront/home อย่างไรก็ตามมันดูเหมือนจะไม่ทำงาน คุณทำมันได้อย่างไรในที่สุด?
Manolo

คำตอบ:


31

ฉันตีสองสามหน้าใน Google ที่คุณสามารถตั้งค่าส่วนหัวใน S3 สำหรับแต่ละวัตถุ นั่นไม่ใช่วิธีที่มีประสิทธิผลที่จะทำเป็นพิเศษเพราะในกรณีของฉันเรากำลังพูดถึงวัตถุหลายอย่าง

นั่นคือ "ประสิทธิผล" หรือไม่นั่นคือวิธีที่มันถูกออกแบบมาเพื่อใช้งานจริง

CloudFront ไม่เพิ่ม Cache-Control:ส่วนหัว

CloudFront ผ่านผ่าน (และประการเว้นแต่การกำหนดค่าอื่น ๆ )Cache-Control:ส่วนหัวให้โดยเซิร์ฟเวอร์ต้นทางซึ่งในกรณีนี้คือ S3

ในการรับCache-Control:ส่วนหัวที่จัดเตรียมไว้โดย S3 เมื่อดึงวัตถุมาจะต้องจัดเตรียมเมื่ออัปโหลดวัตถุไปยัง S3 หรือเพิ่มลงในข้อมูลเมตาของวัตถุด้วยการดำเนินการวาง + คัดลอกที่ตามมาซึ่งสามารถนำมาใช้เพื่อคัดลอกภายในวัตถุเอง S3, แก้ไขข้อมูลเมตาในกระบวนการ นี่คือสิ่งที่คอนโซลทำอยู่เบื้องหลังหากคุณแก้ไขข้อมูลเมตาของวัตถุ

นอกจากนี้ยังมี (ในกรณีที่คุณสงสัย) ไม่มีการตั้งค่าส่วนกลางใน S3 เพื่อบังคับให้วัตถุทั้งหมดในที่เก็บข้อมูลเพื่อส่งคืนส่วนหัวเหล่านี้ - เป็นแอตทริบิวต์ต่อวัตถุ


Update: Lambda @ Edge เป็นฟีเจอร์ใหม่ใน CloudFrontที่ช่วยให้คุณสามารถเรียกใช้งานการร้องขอและ / หรือการตอบสนองระหว่างผู้ดูและแคชและ / หรือแคชและต้นกำเนิดและการเรียกใช้โค้ดที่เขียนใน Node.js กับโครงสร้างวัตถุคำขอ / ตอบ เปิดเผยโดย CloudFront

หนึ่งในแอปพลิเคชั่นหลักสำหรับคุณสมบัตินี้คือการจัดการส่วนหัว ... ดังนั้นในขณะที่ข้างต้นยังคงมีความถูกต้อง - CloudFront ไม่เพิ่มCache-Control- ตอนนี้เป็นไปได้ที่ฟังก์ชั่นแลมบ์ดาจะเพิ่มเข้าไปในการตอบสนองที่ส่งคืนจาก CloudFront

ตัวอย่างนี้เพิ่มCache-Control: public, max-age=86400ต่อเมื่อไม่มีCache-Controlส่วนหัวที่มีอยู่ในการตอบกลับ

การใช้รหัสนี้ในทริกเกอร์การตอบสนองของแหล่งกำเนิดสินค้าจะทำให้รหัสนั้นเกิดขึ้นทุกครั้งที่ CloudFront เรียกวัตถุจากแหล่งกำเนิดและแก้ไขการตอบสนองก่อนที่ CloudFront จะแคช

'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    if(!response.headers['cache-control'])
    {
        response.headers['cache-control'] = [{ 
            key:   'Cache-Control', 
            value: 'public, max-age=86400' 
        }];
    }

    callback(null, response);
};

อัปเดต (2018-06-20): เมื่อเร็ว ๆ นี้ฉันส่งคำขอคุณลักษณะไปยังทีม CloudFront เพื่ออนุญาตการกำหนดค่าของส่วนหัวการตอบสนองแบบคงที่กำเนิดเป็นแอตทริบิวต์ดั้งเดิมคล้ายกับวิธีที่สามารถเพิ่มส่วนหัวคำขอแบบคงที่ตอนนี้ ... แต่ด้วย บิดอนุญาตให้แต่ละส่วนหัวได้รับการกำหนดค่าให้เพิ่มตามเงื่อนไข (เฉพาะในกรณีที่ต้นกำเนิดไม่ได้ให้ส่วนหัวนั้นในการตอบสนอง) หรือไม่มีเงื่อนไข (เพิ่มส่วนหัวและเขียนทับส่วนหัวจากต้นกำเนิดจากนั้นถ้ามี)

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


มันยังคงน่ารำคาญอยู่ดี
Erica Kane


1
ธาดาแน่นอน @Kunal นั่นคือตัวอย่างของสิ่งที่ฉันอ้างถึงในคำตอบว่า"เพิ่มไปยังข้อมูลเมตาของวัตถุโดยการดำเนินการใส่และคัดลอกภายหลัง" ใช้ด้วยความระมัดระวังและทดสอบเพราะมีข้อแม้ มันจะรีเซ็ตของคุณทั้งหมดในวันที่และอาจมีความหมายสำหรับการเข้ารหัส นอกจากนี้มันยังอาจเปลี่ยนวัตถุ etags จากหลายส่วนเป็นรูปแบบส่วนเดียวซึ่งเป็นอัลกอริทึมที่แตกต่างกันและจะสร้างความสับสนให้กับระบบใด ๆ ที่เก็บ etags ที่อื่นสำหรับการตรวจสอบความสมบูรณ์ในอนาคต หากการกำหนดเวอร์ชันถูกเปิดใช้งานในที่เก็บข้อมูลต้นทุนการเก็บข้อมูลของคุณจะเพิ่มเป็นสองเท่าเว้นแต่คุณจะล้างข้อมูลเวอร์ชันเก่า
Michael - sqlbot

1
บริการ Lambda @ Edge ใหม่ในขณะนี้ยังมีกลไกที่อนุญาตให้เพิ่มส่วนหัวการตอบสนองการควบคุมแคช (รวมถึงอื่น ๆ ) ได้ทันที ฉันได้อัปเดตคำตอบด้วยตัวอย่างการทำงานของวิธีการที่สามารถทำได้
Michael - sqlbot

1
@Broshi บทบาท "นโยบายการเชื่อถือ" จำเป็นต้องแสดงรายการทั้งบริการแลมบ์ดาและ edgelambda ลองดูที่docs.aws.amazon.com/lambda/latest/dg/...
Michael - sqlbot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.