6

Ich habe einen S3-Bucket, auf dem CloudFront CDN ist.S3/CloudFront, alle Dateien mit Header "Cache-Control: max-age = 365000000, unveränderbar"

Dieser S3-Bucket ist "unveränderlich", was bedeutet, dass ich, wenn ich eine Datei dort hochlade, niemals lösche oder aktualisiere. Es ist dann sicher, dass alle Clients die von S3/CloudFront stammenden Dateien sehr aggressiv zwischenspeichern.

Gegenwärtig arbeiten Etags gut und die Kunden haben meistens 304 Antworten erhalten. Aber eine 304-Antwort zu erhalten, erfordert immer noch eine Rundreise, die durch aggressiveres Caching vermieden werden könnte.

Also würde ich dieses Verhalten mag:

  • Cloudfront CDN-Cache sollte nie für ungültig erklärt bekommen, weil S3 Cache ändert sich nie. CloudFront muss S3 nicht mehrmals nach einer Datei fragen. Ich denke, ich habe das mit den CloudFront-Verteilungseinstellungen erfolgreich konfiguriert.

  • Cloudfront sollte alle Dateien mit Kopf Cache-Control: max-age=365000000, immutable (immutable ist ein neuer, teilweise unterstützte Wert ab 2016)

Ich verstehe nicht, dienen, wie kann ich das gewünschte Ergebnis erzielen. Soll ich das auf CloudFront- oder S3-Ebene handhaben? Ich habe ein paar Dinge über die Konfiguration der entsprechenden Header für jede S3-Datei gelesen. Gibt es keine globale Einstellung, um alle Dateien mit einem benutzerdefinierten HTTP-Header zu versehen, den ich verwenden könnte?

Antwort

13

Sollte ich das auf CloudFront oder S3-Ebene behandeln?

Es gibt derzeit keine globale Einstellung zum Hinzufügen von benutzerdefinierten http-Headern in Cloudfront oder S3. Um HTTP-Headern zu Objekten hinzuzufügen, müssen sie in S3 einzeln für jedes Objekt im Bucket festgelegt werden. Sie werden in den Metadaten des Objekts gespeichert und können für jedes Objekt in der AWS S3-Konsole im Abschnitt "Metadaten" gefunden werden.

In der Regel ist es am einfachsten, die Header beim Hinzufügen des Objekts zum Bucket festzulegen - der genaue Mechanismus hierfür hängt davon ab, welche Client-Anwendung Sie verwenden, oder sdk.

z.B. mit der aws cli Befehl verwenden Sie die --cache-control option:

aws s3 cp test.txt s3://mybucket/test2.txt \ 
    --cache-control max-age=365000000,immutable 

vorhandene Objekte zu ändern, das s3cmd Dienstprogramm hat eine modify Option als Antwort in diesem SO beschrieben: https://stackoverflow.com/a/22522942/6720449

Oder können Sie die aws s3 Befehl verwenden, um Kopieren Sie Objekte zurück auf sich selbst und modifizieren Sie die Metadaten, wie in dieser SO-Antwort erläutert: https://stackoverflow.com/a/29280730/6720449. z.B. ersetzen Metadaten für alle Objekte in einem Eimer:

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \ 
    --cache-control max-age=365000000,immutable 

Cloudfront CDN-Cache soll nie

für ungültig erklärt bekommen

Dies ist eine ziemlich strenge Anforderung - man kann nicht eine Cloudfront-Cache von jemals verhindern wird ungültig gemacht.Das heißt, es gibt keine Einstellung, die verhindert, dass eine Cloudfront-Invalidierung erstellt wird, wenn der Benutzer, der es erstellt, über ausreichende Berechtigungen verfügt. Auf Umwegen können Sie also Ungültigmachungen verhindern, indem Sie sicherstellen, dass keine Benutzer, Rollen oder Gruppen Berechtigungen zum Erstellen einer Ungültigkeitserklärung in der Distribution mit der IAM-Berechtigung cloudfront:CreateInvalidation haben. Dies ist möglicherweise nicht praktikabel.

Es gibt jedoch einige Gründe, warum Cloudfront einen Cache unter Verstoß gegen die Cache-Steuerung des Back-Ends ungültig machen könnte - z. wenn die Maximum TTL Einstellung eingestellt ist und sie kleiner als das maximale Alter ist.

+0

danke. Ich werde mit dem Befehl ändern gehen. Wenn CloudFront es manchmal für ungültig erklärt, ist es nicht gut, aber es ist auch keine große Sache. –

+0

Sie haben recht, dass * "CloudFront CDN-Cache niemals ungültig gemacht werden sollte" * ist sehr streng. In der Tat ist es einfach keine vernünftige Erwartung. Es gibt keinen einzigen monolithischen Cache - es gibt einen an jeder Kante, und jede Kante, die eine Anfrage für ein Objekt behandelt, holt sie anfänglich vom Ursprung ab. Objekte können auch aus einer gegebenen Kante entfernt werden, wenn ein häufiger Zugriff fehlt ("Popularität"). Es ist ein Cache ... per Definition volatil, aber insgesamt sehr konsistent. Siehe auch [Warum entfernt Cloudfront Objekte aus dem Cache innerhalb von nur wenigen Stunden?] (Http://stackoverflow.com/a/32878535/1695906) –