Erzwingen, dass CloudFront die neueste HTML-Datei von S3 durchläuft

13

Hintergrund

Ich hoste eine statische Site auf S3, wobei CloudFront über der Spitze steht. Ich habe ein Problem mit meinen HTML-Dateien.

Laut CloudFronts FAQ :

Amazon CloudFront verwendet diese Cachesteuerungsheader, um zu bestimmen, wie oft der Ursprung einer aktualisierten Version dieser Datei überprüft werden muss

Was ich bisher gemacht habe

Aus diesem Grund habe ich die HTML-Dateien in meinem S3-Bucket so eingestellt, dass sie die folgenden Header enthalten:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: Fri, 01 Jan 1990 00:00:00 GMT

Bei meinem ersten Aufruf von my samplefile.htmwerden die folgenden Antwort-Header angezeigt (offensichtliche Header (z. B. Content-Type) wurden ausgeschlossen , um auf den Punkt zu kommen:

Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Date:Sat, 10 Dec 2011 14:16:51 GMT
ETag:"a5890ace30a3e84d9118196c161aeec2"
Expires:Fri, 01 Jan 1990 00:00:00 GMT
Last-Modified:Sat, 10 Dec 2011 14:16:43 GMT
Server:AmazonS3
X-Cache:Miss from cloudfront

Wie Sie sehen können, ist mein Cache-ControlHeader dort. Wenn ich diese Datei aktualisiere und aktualisiere, erhalte ich den zwischengespeicherten Inhalt (und nicht die neueste Datei) und kann anhand der Antwortheader feststellen, dass CloudFront die zwischengespeicherte Version bereitstellt:

X-Cache:Hit from cloudfront

Zusammenfassung / Frage

Wie kann ich vor dem Hintergrund des oben Gesagten bei Verwendung von CloudFront das automatische Abrufen des neuesten HTML-Codes erreichen?

Laut FAQ sollte es mir möglich sein, dies mit Cache-Control-Headern zu tun, aber ich scheine nicht in der Lage zu sein, dies zum Laufen zu bringen.

Befolgen Sie die Antworten unten

Am Ende entschied ich mich, meinen WWW-CNAME so zu ändern, dass er direkt auf meinen S3-Bucket verweist. Dann wurde ein neuer CNAME mit dem Namen "static" hinzugefügt, der auf CloudFront verweist.

Dies bedeutet, dass HTML direkt aus S3 stammt, dessen CSS / JS / IMG-Referenzen auf static.mydomain.com verweisen

isNaN1247
quelle

Antworten:

6

Erstens geht es bei Cloudfront darum, zwischengespeicherten Inhalt bereitzustellen. Wenn Sie versuchen, nicht zwischengespeicherten Inhalt von Cloudfront bereitzustellen, ist dies in fast allen Fällen langsamer als die direkte Bereitstellung von S3 (so etwas wie Streaming-Inhalt wäre die Ausnahme). Überlegen Sie sich einen Moment, was geschehen muss, um Inhalte von Cloudfront bereitzustellen. Sie müssen vom Ursprungsserver an einen Ort abgerufen werden, der sich geografisch in der Nähe des Benutzers befindet. Dies bedeutet, dass Cloudfront bei einer Anforderung Inhalte vom Ursprungsserver abrufen muss Fügen Sie der Anforderung eine zusätzliche Latenz hinzu, und der Benutzer erhält Inhalte langsamer. Erst wenn der Inhalt am Edge-Standort verfügbar ist, sind nachfolgende Anforderungen schneller.

Die beste Lösung für dieses Problem besteht darin, Ihre Dateinamen zu ändern, wenn Sie eine Seite aktualisieren. Dadurch wird Cloudfront gezwungen, den neuen Inhalt abzurufen. Denken Sie auch hier daran, dass Cloudfront normalerweise für Mediendateien (einschließlich Bilder) und Style / Javascript verwendet wird - und nicht so sehr für HTML. Im Wesentlichen würden Sie Ihr HTML in S3 und Ihre Bilder in Cloudfront haben. Bei jeder Änderung, die Sie vornehmen, können Sie den Namen der Datei in Cloudfront ändern (z. B. Datei-v1.jpg, Datei-v2.jpg usw.). Eine andere gebräuchliche Methode ist das Einfügen einer Abfragezeichenfolge mit Versionsinformationen.

Bedenken Sie auch, dass Cloudfront keine gzip-fähigen Inhalte bereitstellt. Dies kann zu einer langsameren Antwort als bei einem normalen Server führen (obwohl S3 in Ihrem Fall auch keine gzip-fähigen Browser erkennt).

Wenn Sie möchten, können Sie Cloudfront mithilfe von Invalidierung zwingen, die vorhandene Kopie zu verwerfen und eine neue vom Ursprungsserver abzurufen. Beachten Sie jedoch, dass Cloudfront Ihnen nur 1000 kostenlose Invalidierungen pro Monat gewährt. Danach betragen die Kosten 0,005 USD / Invalidierung.

Die Mindestzeit für die Speicherung von Inhalten in Cloudfront beträgt 1 Stunde . Die Standardeinstellung ist jedoch 24 Stunden. Ich würde daher versuchen, das maximale Alter auf mindestens 3600 festzulegen. Betrachten Sie auch einen s-maxage-Header (für gemeinsam genutzten - dh Proxy-Inhalt). Amazon empfiehlt dieses Lernprogramm zum Zwischenspeichern.

Es gab ein kürzlich aufgetretenes Problem , das vor einigen Tagen behoben wurde

cyberx86
quelle
Der Grund für das Festhalten von CF an S3 war, dass Werner Vogels dies selbst in seinem Blogbeitrag allthingsdistributed.com/2011/02/website_amazon_s3.html erwähnte . Ich könnte erwägen, das HTML direkt von s3 zu routen, wie Sie sagen. Ein kleiner Hinweis: Das Hinzufügen einer Abfragezeichenfolge am Ende von Dateien zum Löschen des Caches ist keine gute Idee, da dies dazu führen kann, dass einige Proxys niemals zwischengespeichert werden.
isNaN1247
Dieser Typ scheint bei jedem Upload eine Ungültigkeitserklärung zu verwenden, die übertrieben scheint. Jmlacroix.com
isNaN1247
1
Abfragezeichenfolgen funktionieren in Cloudfront nicht - die Dateien werden nicht zwischengespeichert, sie können jedoch wirksam sein, wenn Sie Ihre Inhalte direkt bereitstellen. HTML aus S3 wäre die beste Wahl. Sie möchten definitiv nicht bei jedem Upload alles ungültig machen, aber das Ungültigmachen der geänderten Dateien ist in einigen Fällen nicht ohne Grund. Die Vorzüge von Cloudfront werden nur auf stark frequentierten Websites wirklich relevant - für eine durchschnittliche Website bietet S3 möglicherweise sogar eine bessere Leistung (probieren Sie beide aus - insbesondere bei kleinen Objekten kann Cloudfront langsam sein).
cyberx86
2
Cloudfront unterstützt jetzt die Gzip-Komprimierung. Ankündigung hier .
Greg Sadetsky
@ cyberx86-Grenzwerte sind heutzutage unterschiedlich: The minimum expiration time CloudFront supports is 0 seconds for web distributions and 3600 seconds for RTMP distributions. docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…
xvga
20

Ich glaube, die bisherigen Antworten sind veraltet, obwohl sie zu diesem Zeitpunkt korrekt waren, da Cloudfront jetzt eine TTL von mindestens 0 unterstützt und der ursprüngliche Versuch des OP, cache-age = 0 zu verwenden, nun funktionieren sollte.

Sie sollten sich überlegen, ob Sie diese anderen Cache-Control-Header verwenden möchten, um festzustellen, ob sie das gewünschte Ergebnis liefern. Möglicherweise benötigen Sie nur das Höchstalter. Sie möchten wahrscheinlich, dass Cloudfront S3 überprüft, um festzustellen, ob sich die HTML-Datei geändert hat. Ist dies der Fall, kann Cloudfront die neue Datei abrufen und zurückgeben. Andernfalls kann der Client aus dem vorhandenen Cache bedient werden (S3-Bandbreite wird gespart und der Client wird schneller und lokaler bedient).

Der Sinn von Cloudfront ist es, zwischengespeicherten Inhalt bereitzustellen, ja, aber jetzt umfasst dies auch Inhalt, der sich manchmal ändert, der jedoch zwischengespeichert werden kann, wenn er sich nicht geändert hat.

Ps-Abfragezeichenfolgen funktionieren jetzt auch in Cloudfront (wenn Sie ein "Verhalten" für den jeweiligen Ursprung konfigurieren - eine weitere neue Funktion). Einige Proxys können jedoch möglicherweise keine Dateien mit Abfragezeichenfolgen zwischenspeichern.

Amazon Developer Guide: Ablauf 1

Andy Nash
quelle
-1

Sie sind sich nicht sicher, wie CloudFront den Header so behandelt, wie Sie ihn haben. Wenn Sie jedoch keine Header angeben, beträgt die Standardzeit zum Aktualisieren der Objekte 24 Stunden.

Sie können die Objekte unter anderem aktualisieren, indem Sie den Inhalt ungültig machen. Schauen Sie sich den Link unten an, um weitere Informationen zu erhalten. http://blog.cloudberrylab.com/2010/08/how-to-manage-cloudfront-object.html

Jeff
quelle