S3 Origin ile AWS CloudFront'tan dosyalar için Önbellek Kontrol Başlığı yok


27

Amazon AWS'ye daha yeni taşındık. Şu anda iyi çalışan bir EC2 örneğimiz var. Önünde Nginx, arka tarafında Apache çalışıyor. Aynı zamanda iyi çalışıyor. Tüm siteler düzgün bir şekilde başlatıldı ve EC2'den sunulan dosyalar için Cache-Control başlığını içeriyor.

Sorun, Amazon S3'e yerleştirdiğimiz ve CloudFront CDN'den erişilen TÜM statik dosyalar ile ilgili . Dosyalara para cezasına erişebiliriz (ve CORS ile ilgili sorun değiliz ), ancak görünüşe göre CloudFront önbellek kontrolü başlığına sahip dosyalar sunmuyor. Tarayıcı önbelleğe alma işleminden yararlanmak istiyoruz.

Gördüğüm gibi, EC2 örneği burada bir rol oynamıyor, statik dosyalar doğrudan S3 + CloudFront tarafından sunuluyor, istek EC2'deki Web Sunucusuna gitmiyor.

Tamamen kayboldum.

Soru: 1) Bu durumda Cache-Control'ü nasıl ayarlarım? 2) Önbellek Kontrolünü ayarlamak mümkün mü? S3 veya CloudFront'tan mı?

Not: Google’da, tek tek nesneler için S3’de Başlığı ayarlayabileceğiniz birkaç sayfaya bastım. Bu özel olarak yapmanın verimli bir yolu değil, çünkü benim durumumda birkaç cisimden bahsediyoruz.

Teşekkürler!


Lütfen S3'teki bir nesneye ve ilgili CloudFront URL'ye bir URL gönderin. Kendimi tarif ettiğiniz davranışları görmek isterim. Alternatif olarak, her ikisi için de başlıkları gösteren CURL'ler gönderin.
Tim

Ben özel bir başlık eklemek mümkün oldum "bitiş tarihi: Güneş, 15 Ekim 2027 13:46:07 GMT" in kökeni düzenleyerek console.aws.amazon.com/cloudfront/home . Ancak işe yaramadı. Sonunda nasıl yaptın?
Manolo

Yanıtlar:


31

Tek tek nesneler için Başlığı S3'te ayarlayabileceğiniz Google’da birkaç sayfaya çarptım. Bu özel olarak yapmanın verimli bir yolu değil, çünkü benim durumumda birkaç cisimden bahsediyoruz.

"Üretken" olsun ya da olmasın, aslında çalışması için tasarlandı.

CloudFront başlık eklememektedir Cache-Control: .

CloudFront geçer Dönüşümü (yapılandırılmış sürece ve ayrıca bakımdan,)Cache-Control: , bu durumda S3 başlangıç sunucusu tarafından sağlanan başlıkları.

Cache-Control:Bir nesne alındığında S3 tarafından sağlanan başlıkları almak için , nesne S3'e yüklendiğinde veya nesnenin içine kendi içine kopyalamak için kullanılabilecek bir sonraki put + copy işlemiyle nesnenin meta verilerine eklenmesi gerekir. S3, işlemdeki meta verileri değiştiriyor. Nesne meta verilerini düzenlerseniz, konsolun yaptığı sahne arkası.

Ayrıca (merak ediyorsanız) S3'te bir kovadaki tüm nesneleri bu başlıkları döndürmeye zorlayacak genel bir ayar yoktur - bu nesne başına bir özelliktir.


Güncelleme: Lambda @ Edge, CloudFront'da Node.js'de yazılmış basit bir istek / yanıt nesnesi yapısına karşı kod çalıştıran görüntüleyici ve önbellek ve / veya önbellek ve orijini arasında isteklere ve / veya yanıtlara karşı tetikleyiciler ateşlemenizi sağlayan yeni bir özelliktir CloudFront tarafından gösterilmektedir.

Bu özelliğin ana uygulamalarından biri üstbilgileri manipüle etmektir ... bu yüzden yukarıdakiler hala doğru olsa da - CloudFront'un kendisi eklemiyor Cache-Control- şimdi bir Lambda işlevinin onları CloudFront'dan döndürülen yanıta eklemesi mümkün.

Bu örnek, Cache-Control: public, max-age=86400yalnızca Cache-Controlyanıtta henüz bir başlık bulunmuyorsa ekler .

Bir Origin Response tetikleyicisinde bu kodu kullanmak, CloudFront'un kaynaktan bir nesne aldığında ateşlenmesine ve CloudFront'un önbelleğe almadan önce cevabını değiştirmesine neden olur.

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

Güncelleme (2018/06/20): Son zamanlarda, statik kökenli yapılandırmasını sağlamak için CloudFront ekibine bir özellik talepte tepki yolu statik benzer kökenli nitelikler gibi başlıklarını isteği şimdi, eklenebilir başlıklarından ... ama birlikte döndürerek, her başlığın koşullu olarak eklenmesine olanak tanıyarak (yalnızca kaynak o yanıtı bu başlığı sağlamıyorsa) veya koşulsuz olarak (başlığın eklenmesi ve varsa başlığın başlangıç ​​noktasının üzerine yazılması) ekleyin.

Özellik istekleriyle, genellikle yeni özelliğin uygulanmasını gerçekten düşündüklerinin… veya daha önce üzerinde çalışıp çalışmadıklarına dair hiçbir onay ... alamazsınız, sadece bittiğinde duyurulur. Dolayısıyla bunların uygulanıp uygulanmayacağı hakkında hiçbir fikrim yok. Bu özelliğin Lambda @ Edge üzerinden zaten mevcut olduğu için, temel fonksiyonellikte buna ihtiyaç olmadığına dair bir argüman var ... ama benim karşı iddiam, tabanın işlevsel olarak tam özelliği bulunmadığıdır. basit, statik yanıt başlığı manipülasyonu yapın ve bu, bir tetikleyiciye ihtiyaç duyulmasının tek sebebi ise, Lambda tetikleyicilerinin zorunlu kılınması, finansal olarak ve ilave gecikme süresinde gereksiz bir maliyettir (her ikisi de bir tuhaf maliyet olmasa da).


Yine de can sıkıcı bir durum.
Erica Kane,


1
Tada, gerçekten, @Kunal. Bu, cevapta "sonraki nesnenin kopyala işleminin ardından nesnenin meta verilerine eklenmesi" olarak adlandırdığım şeyin bir örneğidir . Dikkatli kullanın ve test edin, çünkü uyarılar var. Tüm tarih damgalarınızı sıfırlar ve şifreleme ile ilgili etkileri olabilir. Ayrıca nesne etaglarını farklı bir algoritma olan çoklu bölümden tek parça formata değiştirebilir ve gelecekteki bütünlük kontrolleri için etag'ları başka bir yerde saklayan herhangi bir sistemi karıştırır. Kovada sürüm etkinleştirilmişse, eski sürümleri temizlemediğiniz sürece depolama maliyetiniz iki katına çıkar.
Michael - sqlbot

1
Yeni Lambda @ Edge servisi şimdi ayrıca Cache-Control cevap başlıklarının (diğerleri arasında) anında eklenmesine izin veren bir mekanizma sunuyor. Cevabı, bunun nasıl yapılabileceğine dair çalışan bir örnekle güncelledim.
Michael - sqlbot

1
@Broshi rolünün "güven politikası" hem lambda hem de edgelambda hizmetlerini listelemelidir. Docs.aws.amazon.com/lambda/latest/dg/… adresini ziyaret edin .
Michael - sqlbot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.