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


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

Das Problem liegt bei ALLEN statischen Dateien, in die wir eingefügt haben Amazon S3 auf das zugegriffen wird CloudFront CDN. Wir können auf die Dateien gut zugreifen (und kein Problem mit CORS), aber anscheinend CloudFront liefert keine Dateien mit dem 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 geliefert werden, die Anfrage nicht an den Web-Server in EC2 geht.

Ich bin völlig verloren.

Frage: 1) Wie setze ich den Cache-Control in diesem Fall? 2) Ist es möglich den Cache-Control zu setzen? Von S3 oder CloudFront?

Hinweis: Ich habe ein paar Seiten in Google getroffen, wo Sie die Kopfzeile in S3 für einzelne Objekte festlegen können. Das ist wirklich keine produktive Art, es speziell zu machen, da wir in meinem Fall von mehreren Objekten sprechen.

Vielen Dank!


20
2018-04-14 12:32


Ursprung


Bitte geben Sie eine URL für ein Objekt in S3 und die entsprechende CloudFront-URL an. 100 sch 100 100 100 100 100 100 100 100 100 dieser sch sch sch sch sch dieser sch zwischen 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 dieser Platzieren Sie abwechselnd CURLs für beide und zeigen Sie Header an. - Tim
Ich konnte einen benutzerdefinierten Header hinzufügen "Expires: So, 15 Oct 2027 13:46:07 GMT", indem ich den Ursprung in ändere console.aws.amazon.com/cloudfront/home. Es scheint jedoch nicht zu funktionieren. Wie hast du es endlich geschafft? - Manolo


Antworten:


Ich habe ein paar Seiten in Google getroffen, wo Sie die Kopfzeile in S3 für einzelne Objekte festlegen können. Das ist wirklich keine produktive Art, es speziell zu machen, da wir in meinem Fall von mehreren Objekten sprechen.

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

CloudFront nicht hinzufügen  Cache-Control: Kopfzeilen.

CloudFront durchläuft  (und respektiert auch, sofern nicht anders konfiguriert) das Cache-Control: Header, die vom Ursprungsserver bereitgestellt werden, der in diesem Fall S3 ist.

Bekommen Cache-Control: Kopfzeilen, die von S3 bereitgestellt werden, wenn ein Objekt abgerufen wird, müssen beim Laden des Objekts in S3 bereitgestellt werden oder den Metadaten des Objekts durch eine anschließende put + copy-Operation hinzugefügt werden, die intern zum Kopieren eines Objekts in S3 verwendet werden kann. Ändern der Metadaten im Prozess. Dies macht die Konsole hinter den Kulissen, wenn Sie Objektmetadaten bearbeiten.

Es gibt auch (falls Sie sich wundern) keine globale Einstellung in S3, um alle Objekte in einem Bucket zum Zurückgeben dieser Header zu zwingen - dies ist ein pro-Objekt-Attribut.


Aktualisieren:  Lambda @ Edge ist ein neues Feature in CloudFront Mit dieser Option können Sie Auslöser für Anforderungen und / oder Antworten zwischen Viewer und Cache und / oder Cache und Ursprung auslösen, indem Sie in Node.js geschriebenen Code in eine einfache Anfrage / Antwort-Objektstruktur schreiben, die von CloudFront bereitgestellt wird.

Eine der Hauptanwendungen für dieses Feature ist das Bearbeiten von Headern ... obwohl das oben Genannte immer noch korrekt ist - CloudFront selbst wird nicht hinzugefügt Cache-Control - Es ist jetzt möglich, dass eine Lambda-Funktion sie zu der Antwort hinzufügt, die von CloudFront zurückgegeben wird.

Dieses Beispiel fügt hinzu Cache-Control: public, max-age=86400 nur wenn es keine gibt Cache-ControlHeader bereits auf der Antwort vorhanden.

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

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

Aktualisieren (2018-06-20): Vor kurzem habe ich dem CloudFront-Team eine Feature-Anfrage gesendet, um die Konfiguration des statischen Ursprungs zu ermöglichen Antwort Header als Ursprungsattribute, ähnlich wie statisch anfordern Header können jetzt hinzugefügt werden, aber mit einer Wendung, die es erlaubt, jeden Header so zu konfigurieren, dass er bedingt hinzugefügt wird (nur wenn der Ursprung diesen Header in der Antwort nicht bereitstellt) oder bedingungslos (den Header hinzufügt und den Header überschreibt) dann Ursprung, falls vorhanden).

Bei Feature-Anfragen erhalten Sie in der Regel keine Bestätigung, ob sie tatsächlich in Betracht ziehen, das neue Feature zu implementieren ... oder ob sie bereits daran gearbeitet haben ... es wird nur angekündigt, wenn sie fertig sind. Also, ich habe keine Ahnung, ob diese umgesetzt werden. Es gibt ein Argument, dass, da diese Fähigkeit bereits über Lambda @ Edge verfügbar ist, es in der Basisfunktionalität nicht notwendig ist ... aber mein Gegenargument ist, dass die Basis funktional nicht vollständig ist, ohne die Fähigkeit dazu Machen Sie einfache, statische Antwort-Header-Manipulation, und dass, wenn dies der einzige Grund ist, ein Trigger benötigt wird, ist die Anforderung von Lambda-Triggern eine unnötige Kosten, finanziell und in zusätzlichen Latenzzeiten (auch wenn dies keine unnötigen Kosten sind).


22
2018-04-15 00:49



Es ist aber immer noch nervig. - Erica Kane
stackoverflow.com/a/30225271/846727 - TADA !! - Kunal
Tada, tatsächlich, @Kunal. Das ist ein Beispiel für das, was ich in der Antwort als bezeichnet habe "hinzugefügt zu den Metadaten des Objekts durch eine nachfolgende Operation put + copy." Benutze es mit Vorsicht und teste es, weil es Vorbehalte gibt. Es wird alle Ihre Datumsstempel zurücksetzen und Auswirkungen auf die Verschlüsselung haben. Es kann auch Objekt-Etags vom Multipart- zum Single-Part-Format ändern, was ein anderer Algorithmus ist, und jedes System, das die Etags anderweitig gespeichert hat, für zukünftige Integritätsprüfungen verwirren. Wenn die Versionierung für den Bucket aktiviert ist, werden Ihre Speicherkosten verdoppelt, sofern Sie nicht die alten Versionen bereinigen. - Michael - sqlbot
Der neue Lambda @ Edge-Dienst bietet jetzt auch einen Mechanismus, mit dem Cache-Control-Antwortheader (unter anderem) während des Betriebs hinzugefügt werden können. Ich habe die Antwort mit einem Arbeitsbeispiel aktualisiert, wie das gemacht werden kann. - Michael - sqlbot
@ Broshi die "Vertrauensrichtlinie" der Rolle muss sowohl die Lambda als auch die EdgeLambda Dienste auflisten. Sieh dir das an docs.aws.amazon.com/lambda/latest/dg/.... - Michael - sqlbot