Stellen Sie die Cache-Steuerung für den gesamten S3-Bucket automatisch ein (mithilfe von Bucket-Richtlinien?)


121

Ich muss Cache-Control-Header für einen gesamten s3-Bucket festlegen, sowohl für vorhandene als auch für zukünftige Dateien, und hatte gehofft, dies in einer Bucket-Richtlinie zu tun. Ich weiß, dass ich die vorhandenen bearbeiten kann und wie ich sie beim Put angeben kann, wenn ich sie selbst hochlade, aber leider kann die App, die sie hochlädt, die Header nicht festlegen, da sie s3fs verwendet, um die Dateien dort zu kopieren.

Antworten:


205

Es gibt jetzt drei Möglichkeiten, dies zu erreichen: über die AWS-Konsole , über die Befehlszeile oder über das Befehlszeilentool s3cmd .


AWS Console-Anweisungen

Dies ist jetzt die empfohlene Lösung. Es ist einfach, aber es kann einige Zeit dauern.

  • Melden Sie sich bei AWS Management Console an
  • Gehe in den S3-Eimer
  • Wählen Sie alle Dateien nach Route aus
  • Wählen Sie "Mehr" aus dem Menü
  • Wählen Sie "Metadaten ändern"
  • Wählen Sie im Feld "Schlüssel" die Option "Cache-Steuerung" aus dem Dropdown-Menü max-age = 604800Enter (7 Tage) für Value
  • Klicken Sie auf "Speichern"

( danke an @biplob - bitte gib ihm unten etwas Liebe )


AWS-Befehlszeilenlösung

Als ich diese Bucket-Richtlinien erstellte, war das ursprünglich ein No-Go, also habe ich mir überlegt, wie man es mit aws-cli macht, und es ist ziemlich schlau. Bei der Recherche konnte ich keine Beispiele in freier Wildbahn finden, daher dachte ich, ich würde einige meiner Lösungen veröffentlichen, um den Bedürftigen zu helfen.

HINWEIS: Standardmäßig kopiert aws-cli nur die aktuellen Metadaten einer Datei, AUCH WENN SIE NEUE METADATEN ANGABEN.

Um die in der Befehlszeile angegebenen Metadaten zu verwenden, müssen Sie das Flag '--metadata-directive REPLACE' hinzufügen. Hier einige Beispiele.

Für eine einzelne Datei

aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Für einen ganzen Bucket (Hinweis - rekursives Flag):

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Ein kleines Problem, das ich gefunden habe: Wenn Sie es nur auf einen bestimmten Dateityp anwenden möchten, müssen Sie alle Dateien ausschließen und dann die gewünschten einschließen.

Nur JPGs und PNGs:

aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public

Hier sind einige Links zum Handbuch, wenn Sie weitere Informationen benötigen:

Bekannte Probleme:

"Unknown options: --metadata-directive, REPLACE"

Dies kann durch ein veraltetes awscli verursacht werden - siehe die Antwort von @ eliotRosewater unten


S3cmd Werkzeug

S3cmd ist ein "Befehlszeilentool zum Verwalten von Amazon S3- und CloudFront-Diensten". Während diese Lösung einen Git-Pull erfordert, könnte sie eine einfachere und umfassendere Lösung sein.

Eine vollständige Anleitung finden Sie im Beitrag von @ ashishyadaveee11 unten


Ich hoffe es hilft!


6
Vielen Dank für die konkreten Beispiele, was genau zu tun ist. Ich hatte Probleme herauszufinden, was überhaupt möglich war, wenn ich nur die Dokumente las.
Danneu

2
Ich erhalte "Unbekannte Optionen: --metadata-Direktive, REPLACE", wenn ich einen der oben genannten Befehle ausführe. Bitte helfen Sie mir.
user3722785

1
Beachten Sie, dass es jetzt einen einfacheren Weg gibt. Sie können jetzt die Metadaten für ALLE Dateien in einem Bucket über AWS Console ändern. Siehe CoderBoys Antwort unten: stackoverflow.com/a/47072736/2538952
Martin Tschammer

1
Beachten Sie, dass die Verwendung der --meta-Direktive REPLACE alle vorherigen Metadaten überschreibt, die nicht in den Befehl kopiert wurden! Zum Beispiel wird "content-encoding gzip" entfernt, wenn es nicht explizit zum Befehl cp hinzugefügt wird.
Harmen Janssen

1
Ist der cpDownload und erneuten Upload alles?
mlissner

37

Jetzt kann es einfach über die AWS-Konsole geändert werden.

  • Melden Sie sich bei AWS Management Console an
  • Gehe in den S3-Eimer
  • Wählen Sie alle Dateien nach Route aus
  • Wählen Sie "Mehr" aus dem Menü
  • Wählen Sie "Metadaten ändern"
  • Wählen Sie im Feld "Key" die Option "Cache-Control" aus dem Dropdown-Menü
  • max-age = 604800Geben Sie (7 Tage) für Value ein
  • Klicken Sie auf "Speichern"

Die Ausführung dauert einige Zeit, abhängig von Ihren Bucket-Dateien. Wiederholen Sie von Anfang an, wenn Sie den Browser versehentlich schließen.


6
Was bedeutet "Alle Dateien nach Route auswählen"?
Tamzin Blake

1
Wählen Sie alle / einige Dateien aus dem Verzeichnis , das Sie Satz meta wollen
Biplob

Entschuldige die späte Antwort. Nein, das tut es nicht. Sie sollten es in Ihrer Anwendung festlegen.
Biplob

Ersetzt dies frühere Metadaten oder ergänzt sie diese? (Ich möchte nicht alle meine Inhaltstypen verlieren!)
Chris

Ich habe gerade bestätigt, dass vorhandene Werte NICHT entfernt werden.
Legt

21

Schritte

  1. git clone https://github.com/s3tools/s3cmd
  2. Ausführen s3cmd --configure (Sie werden nach den beiden Schlüsseln gefragt - kopieren Sie sie und fügen Sie sie aus Ihrer Bestätigungs-E-Mail oder von Ihrer Amazon-Kontoseite ein. Seien Sie beim Kopieren vorsichtig! Sie unterscheiden zwischen Groß- und Kleinschreibung und müssen korrekt eingegeben werden, da sonst immer wieder Fehler über ungültig angezeigt werden Signaturen oder ähnliches. Denken Sie daran s3:ListAllMyBuckets, den Schlüsseln Berechtigungen hinzuzufügen , da AccessDeniedsonst beim Testen des Zugriffs eine Fehlermeldung angezeigt wird.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/

Super Antwort. Danke dir! Gibt es eine Möglichkeit, NUR diejenigen zu aktualisieren, die diese Header-Einstellung noch nicht haben?
PKHunter

Hat jemand eine ähnliche Lösung für die Verwendung mit S3Express von Windows?
Joe

12

Wäre mein Ruf> 50, würde ich nur einen Kommentar abgeben. Aber es ist (noch) nicht so, also hier ist eine weitere vollständige Antwort.


Ich habe mich jetzt schon eine Weile mit diesem Problem beschäftigt. Bis ich die Dokumente gefunden und gelesen habe. Teilen Sie das hier, falls es jemand anderem hilft:

Was für mich zuverlässig funktioniert hat, war dieser Befehl. Ich habe eine Ablaufzeit von 1 Sekunde für den Test gewählt, um die erwarteten Ergebnisse zu überprüfen:

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACEist erforderlich, wenn cpMetadaten einer vorhandenen Datei in S3 geändert werden
  • max-age Legt das Alter des Browser-Cachings in Sekunden fest
  • s-maxage Legt das CloudFront-Caching in Sekunden fest

Wenn Sie diese Cache-Control-Headerwerte beim Hochladen in S3 für eine Datei festlegen, sieht der Befehl ebenfalls folgendermaßen aus:

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /local/path/file \
  s3://bucket/path/file

8

Ich glaube nicht, dass Sie dies auf Bucket-Ebene angeben können, aber es gibt einige Problemumgehungen für Sie.

  1. Kopieren Sie das Objekt in S3 in sich selbst und legen Sie die entsprechenden cache-controlHeader für den Kopiervorgang fest.

  2. Geben Sie in der URL zu den Dateien Antwortheader an . Sie müssen vorsignierte URLs verwenden, damit dies funktioniert. Sie können jedoch bestimmte Antwortheader im Querystring angeben, einschließlich cache-controlund expires. Eine vollständige Liste der verfügbaren Optionen finden Sie unter: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225


Danke Geoff, ich wusste von (1), aber nicht von (2). Nicht das, was ich mir erhofft hatte (obwohl ich befürchte, dass es nicht möglich ist)
thattommyhall

Haben Sie einen AWS CLI-Beispielbefehl für die Vorgehensweise Nr. 1? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm

3

Sie können ein Lambda jederzeit mit einem Trigger auf PUTOBJECT in S3 konfigurieren. Das Lambda ändert einfach den Header dieses bestimmten Objekts, das gerade platziert wurde.

Anschließend können Sie den oben genannten Kopierbefehl ein letztes Mal ausführen, und alle neuen Objekte werden vom Lambda repariert.

AKTUALISIEREN:

Hier ist ein guter Ausgangspunkt: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /.


Können Sie uns weitere Einzelheiten zur Herstellung dieser Lamba mitteilen? Klingt nach einer großartigen Lösung.
Wouter

1
@Wouter sicher, ich habe für Sie einen Link gefunden, der Ihnen tatsächlich dabei helfen kann, dorthin zu gelangen: aaronfagan.ca/blog/2017/… Wenn Sie Hilfe oder Unterstützung benötigen, helfe ich Ihnen gerne weiter.
Ibrahim Bou Ncoula

Ich weiß, dass dies alt ist, aber ich fand diese Ressource nützlich für das, was ich suchte. Danke dafür. Upvotes für dich, mein Typ!
castaway2000

1

An diejenigen, die versuchen, Dans Antwort zu verwenden und den Fehler erhalten:

"Unbekannte Optionen: --metadata-Direktive, REPLACE"

Ich bin auf das Problem gestoßen, und das Problem war, dass ich awscli mit installiert habe

sudo apt-get installiere awscli

Dadurch wurde eine alte Version der awscli installiert, in der der Befehl --metadata-directive fehlt. Also habe ich sudo apt-get remove awscli verwendet, um es zu entfernen.

Anschließend gemäß dem Verfahren von amazon neu installiert: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

Der einzige Unterschied ist, dass ich sudo -H wegen Berechtigungsproblemen verwenden musste, auf die auch andere stoßen könnten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.