Kein Cache-Control-Header für Dateien aus AWS CloudFront mit S3 Origin

27

Wir sind gerade auf Amazon AWS umgestiegen. Wir haben derzeit eine EC2-Instanz, die gut funktioniert. Es läuft Nginx vorne und Apache im Backend. Das läuft auch gut. Alle Sites werden ordnungsgemäß gestartet und enthalten den Cache-Control-Header für Dateien, die vom EC2 bereitgestellt werden.

Das Problem liegt bei ALLEN statischen Dateien, die wir in Amazon S3 abgelegt haben und auf die über CloudFront CDN zugegriffen wird . Wir können problemlos auf die Dateien zugreifen (und dies ist mit CORS kein Problem), aber anscheinend liefert CloudFront keine Dateien mit Cache-Control-Header. Wir möchten das Browser-Caching nutzen.

So wie ich das sehe, spielt die EC2-Instanz hier keine Rolle, da die statischen Dateien direkt von S3 + CloudFront bereitgestellt werden. Die Anforderung wird nicht an den Webserver in EC2 gesendet.

Ich bin völlig verloren.

Frage: 1) Wie stelle ich in diesem Fall die Cache-Kontrolle ein? 2) Kann die Cache-Kontrolle eingestellt werden? Von S3 oder CloudFront?

Hinweis: Ich habe einige Seiten in Google aufgerufen, auf denen Sie die Kopfzeile in S3 für einzelne Objekte festlegen können. Dies ist wirklich keine produktive Methode, da es sich in meinem Fall um mehrere Objekte handelt.

Vielen Dank!

Jarvis
quelle
Veröffentlichen Sie in S3 eine URL für ein Objekt und die entsprechende CloudFront-URL. Ich möchte das Verhalten sehen, das Sie selbst beschreiben. Stellen Sie alternativ für beide CURLs mit Kopfzeilen bereit.
Tim
Ich konnte einen benutzerdefinierten Header "Expires: Sun, 15 Oct 2027 13:46:07 GMT" hinzufügen, indem ich Origin in console.aws.amazon.com/cloudfront/home bearbeitete . Es scheint jedoch nicht zu funktionieren. Wie hast du es endlich gemacht?
Manolo

Antworten:

31

Ich habe einige Seiten in Google aufgerufen, auf denen Sie die Kopfzeile in S3 für einzelne Objekte festlegen können. Dies ist wirklich keine produktive Methode, da es sich in meinem Fall um mehrere Objekte handelt.

Nun, "produktiv" oder nicht, so ist es eigentlich konzipiert, um zu funktionieren.

Cloudfront nicht hinzufügen Cache-Control: Header.

Cloudfront gelangt Durch (und auch Hinsicht, wenn nicht anders konfiguriert) die Cache-Control:durch den Ursprungsserver bereitgestellt Headern, die in diesem Fall ist , S3.

Damit Cache-Control:von S3 beim Abrufen eines Objekts Header bereitgestellt werden, müssen diese beim Hochladen des Objekts in S3 bereitgestellt oder durch eine nachfolgende Operation put + copy zu den Metadaten des Objekts hinzugefügt werden, mit der ein Objekt intern in sich selbst kopiert werden kann S3, Ändern der Metadaten im Prozess. Dies macht die Konsole im Hintergrund, wenn Sie Objektmetadaten bearbeiten.

Es gibt auch (falls Sie sich fragen) keine globale Einstellung in S3, mit der alle Objekte in einem Bucket gezwungen werden, diese Header zurückzugeben - es handelt sich um ein Objektattribut.


Update: Lambda @ Edge ist eine neue Funktion in CloudFront , mit der Sie Trigger für Anforderungen und / oder Antworten zwischen Viewer und Cache und / oder Cache und Ursprung auslösen können, indem Sie in Node.js geschriebenen Code für eine einfache Anforderungs- / Antwortobjektstruktur ausführen von CloudFront ausgesetzt.

Eine der Hauptanwendungen für diese Funktion ist das Manipulieren von Headern. Während die obigen Cache-ControlAngaben noch korrekt sind - CloudFront selbst fügt sie nicht hinzu - ist es jetzt für eine Lambda-Funktion möglich, sie zu der von CloudFront zurückgegebenen Antwort hinzuzufügen.

Dieses Beispiel wird Cache-Control: public, max-age=86400nur hinzugefügt , wenn Cache-Controlin der Antwort noch kein Header vorhanden ist.

Wenn Sie diesen Code in einem Origin Response-Trigger verwenden, wird er jedes Mal ausgelöst, wenn CloudFront ein Objekt aus dem Ursprung abruft und die Antwort ändert, bevor CloudFront sie zwischenspeichert.

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

Update (20.06.2018): Vor kurzem habe ich eine Feature-Anfrage an das CloudFront-Team gesendet, um die Konfiguration von Antwort- Headern statischen Ursprungs als Ursprungsattribute zu ermöglichen, ähnlich wie statische Anforderungs- Header jetzt hinzugefügt werden können ... aber mit einem twist, so dass jeder zu konfigurierende Header bedingt hinzugefügt werden kann (nur wenn der Ursprung diesen Header nicht in der Antwort angegeben hat) oder unbedingt (Hinzufügen des Headers und Überschreiben des Headers ab dem Ursprung, falls vorhanden).

Bei Funktionsanfragen erhalten Sie normalerweise keine Bestätigung darüber, ob sie tatsächlich die Implementierung der neuen Funktion in Betracht ziehen oder ob sie möglicherweise bereits daran gearbeitet haben. Es wird nur angekündigt, wenn sie fertig sind. Ich habe also keine Ahnung, ob diese implementiert werden. Es muss argumentiert werden, dass diese Funktion in der Basisfunktionalität nicht erforderlich ist, da sie bereits über Lambda @ Edge verfügbar ist. Mein Gegenargument lautet jedoch, dass die Basisfunktionalität ohne diese Funktion nicht vollständig ist Führen Sie eine einfache Manipulation des Headers für statische Antworten durch. Wenn dies der einzige Grund ist, warum ein Trigger erforderlich ist, sind Lambda-Trigger aus finanzieller und latenter Sicht unnötig teuer (auch wenn beides nicht zwangsläufig ein ungewöhnlicher Aufwand ist).

Michael - sqlbot
quelle
Es ist immer noch ärgerlich.
Erica Kane
1
Tada, in der Tat, @ Kunal. Dies ist ein Beispiel für das, was ich in der Antwort als "durch eine nachfolgende Put + Copy-Operation zu den Metadaten des Objekts hinzugefügt" bezeichnet habe. Verwenden Sie es mit Vorsicht und testen Sie es, da es Vorbehalte gibt. Es setzt alle Ihre Datenstempel zurück und kann Auswirkungen auf die Verschlüsselung haben. Es kann auch dazu führen, dass Objektetags vom mehrteiligen in das Einzelteilformat geändert werden, was ein anderer Algorithmus ist, und dass jedes System, das die Etags an anderer Stelle gespeichert hat, für zukünftige Integritätsprüfungen verwirrt wird. Wenn die Versionierung für den Bucket aktiviert ist, verdoppeln sich Ihre Speicherkosten, sofern Sie nicht die alten Versionen bereinigen.
Michael - sqlbot
1
Der neue Lambda @ Edge-Dienst bietet jetzt auch einen Mechanismus, mit dem Cache-Control-Antwortheader (unter anderem) im laufenden Betrieb hinzugefügt werden können. Ich habe die Antwort mit einem Arbeitsbeispiel aktualisiert, wie das getan werden kann.
Michael - sqlbot
1
@Broshi Die "Vertrauensrichtlinie" der Rolle muss sowohl die Lambda-Dienste als auch die Edgelambda-Dienste auflisten. Besuchen Sie docs.aws.amazon.com/lambda/latest/dg/… .
Michael - sqlbot