Tidak Ada Header Kontrol-Cache untuk file dari AWS CloudFront dengan S3 Origin

27

Kami baru saja bermigrasi ke Amazon AWS. Saat ini kami memiliki instance EC2 yang berfungsi dengan baik. Ini menjalankan Nginx di depan dan Apache di back-end. Itu berjalan dengan baik juga. Semua situs diluncurkan dengan benar dan termasuk header Kontrol-Cache untuk file yang dilayani dari EC2.

Masalahnya adalah dengan SEMUA file statis yang kami tempatkan di Amazon S3 yang sedang diakses melalui CloudFront CDN . Kami dapat mengakses file dengan baik (dan tidak ada masalah dengan CORS), tetapi tampaknya CloudFront tidak melayani file dengan header Cache-Control. Kami ingin memanfaatkan caching browser.

Cara saya melihatnya, instance EC2 tidak berperan di sini karena file statis dilayani langsung oleh S3 + CloudFront, permintaan tidak masuk ke Server Web di EC2.

Saya benar-benar bingung.

Pertanyaan: 1) Bagaimana cara saya mengatur Kontrol-Cache dalam kasus ini? 2) Apakah mungkin untuk mengatur Kontrol-Cache? Dari S3 atau CloudFront?

Catatan: Saya telah menekan beberapa halaman di Google di mana Anda dapat mengatur Header di S3 untuk objek individual. Itu benar-benar bukan cara yang produktif untuk melakukannya secara khusus karena dalam kasus saya kita berbicara tentang beberapa objek.

Terima kasih!

jarvis
sumber
Silakan kirim URL untuk objek dalam S3 dan URL CloudFront yang berlaku. Saya ingin melihat perilaku yang Anda gambarkan sendiri. Posting CURL secara bergantian untuk keduanya, tunjukkan tajuk.
Tim
Saya dapat menambahkan tajuk khusus "Kedaluwarsa: Sun, 15 Okt 2027 13:46:07 GMT" dengan mengedit asal di console.aws.amazon.com/cloudfront/home . Namun sepertinya itu tidak berhasil. Bagaimana akhirnya Anda melakukannya?
Manolo

Jawaban:

31

Saya telah menekan beberapa halaman di Google di mana Anda dapat mengatur Header di S3 untuk objek individual. Itu benar-benar bukan cara yang produktif untuk melakukannya secara khusus karena dalam kasus saya kita berbicara tentang beberapa objek.

Ya, "produktif" atau tidak, begitulah sebenarnya dirancang untuk bekerja.

CloudFront tidak menambahkan Cache-Control: header.

CloudFront melewati-melalui (dan juga hal, kecuali dinyatakan dikonfigurasi) yang Cache-Control:header yang disediakan oleh server asal, yang dalam hal ini adalah S3.

Untuk mendapatkan Cache-Control:tajuk yang disediakan oleh S3 saat sebuah objek diambil, mereka harus disediakan saat objek diunggah ke dalam S3, atau ditambahkan ke metadata objek dengan operasi put + copy berikutnya, yang dapat digunakan untuk menyalin objek secara internal ke dalam dirinya sendiri di dalam S3, memodifikasi metadata dalam proses. Inilah yang dilakukan konsol, di balik layar, jika Anda mengedit objek metadata.

Ada juga (kalau-kalau Anda bertanya-tanya) tidak ada pengaturan global di S3 untuk memaksa semua objek dalam ember untuk mengembalikan header ini - itu adalah atribut per objek.


Pembaruan: Lambda @ Edge adalah fitur baru di CloudFront yang memungkinkan Anda untuk mengaktifkan pemicu terhadap permintaan dan / atau tanggapan, antara penampil dan cache dan / atau cache dan asal, menjalankan kode yang ditulis dalam Node.js terhadap struktur objek permintaan / respons yang sederhana diekspos oleh CloudFront.

Salah satu aplikasi utama untuk fitur ini adalah memanipulasi header ... jadi sementara di atas masih akurat - CloudFront sendiri tidak menambahkan Cache-Control- sekarang mungkin untuk fungsi Lambda untuk menambahkannya ke respons yang dikembalikan dari CloudFront.

Contoh ini Cache-Control: public, max-age=86400hanya akan ditambahkan jika tidak ada Cache-Controltajuk yang sudah ada pada respons.

Menggunakan kode ini dalam pemicu Respons Asal akan menyebabkannya menyala setiap kali CloudFront mengambil objek dari asal, dan memodifikasi respons sebelum CloudFront menyimpannya.

'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);
};

Pembaruan (2018-06-20): Baru-baru ini, saya mengirimkan permintaan fitur ke tim CloudFront untuk memungkinkan konfigurasi header respons asal statis sebagai atribut asal, mirip dengan cara header permintaan statis dapat ditambahkan, sekarang ... tetapi dengan twist, memungkinkan setiap header dikonfigurasikan untuk ditambahkan secara kondisional (hanya jika asal tidak memberikan header itu dalam respons) atau tanpa syarat (menambahkan header dan menimpa header dari asal kemudian, jika ada).

Dengan permintaan fitur, Anda biasanya tidak menerima konfirmasi apakah mereka benar-benar mempertimbangkan untuk mengimplementasikan fitur baru ... atau bahkan apakah mereka mungkin sudah mengerjakannya ... itu baru diumumkan ketika sudah selesai. Jadi, saya tidak tahu apakah ini akan dilaksanakan. Ada argumen yang harus dibuat bahwa karena kemampuan ini sudah tersedia melalui Lambda @ Edge, tidak perlu untuk itu dalam fungsionalitas basis ... tetapi argumen kontra saya adalah bahwa basis fungsional tidak melengkapi fitur tanpa kemampuan untuk lakukan manipulasi header respons statis yang sederhana, dan bahwa jika ini adalah satu-satunya alasan pemicu diperlukan, maka diperlukan pemicu Lambda adalah biaya yang tidak perlu, secara finansial dan dalam latensi tambahan (walaupun keduanya tidak selalu merupakan biaya aneh).

Michael - sqlbot
sumber
Ini masih menyebalkan.
Erica Kane
1
Tada, memang, @Kunal. Itu adalah contoh dari apa yang saya sebut dalam jawaban sebagai "ditambahkan ke metadata objek oleh operasi put + copy berikutnya." Gunakan dengan hati-hati, dan uji, karena ada peringatan. Ini akan mengatur ulang semua datestamps Anda dan mungkin memiliki implikasi untuk enkripsi. Itu juga dapat mengubah objek etag dari format multi bagian ke bagian tunggal, yang merupakan algoritma yang berbeda, dan akan membingungkan sistem yang telah menyimpan etag di tempat lain untuk pemeriksaan integritas di masa mendatang. Jika versi diaktifkan pada bucket, biaya penyimpanan Anda berlipat ganda kecuali Anda membersihkan versi yang lama.
Michael - sqlbot
1
Layanan Lambda @ Edge yang baru sekarang juga menyediakan mekanisme yang memungkinkan tajuk respons Kontrol-Cache (antara lain) ditambahkan secara on-the-fly. Saya telah memperbarui jawabannya dengan contoh kerja tentang bagaimana hal itu dapat dilakukan.
Michael - sqlbot
1
@Broshi "kebijakan kepercayaan" peran perlu mendaftar layanan lambda dan edgelambda. Lihatlah docs.aws.amazon.com/lambda/latest/dg/… .
Michael - sqlbot