Frage Cachesteuerung für den gesamten S3-Bucket automatisch setzen (mithilfe von Bucket-Richtlinien?)


Ich muss Cache-Control-Header für einen gesamten S3-Bucket setzen, sowohl für bestehende als auch für zukünftige Dateien, und habe gehofft, dies in einer Bucket-Richtlinie zu tun. Ich weiß, dass ich die vorhandenen bearbeiten kann und ich weiß, wie man sie auf put spezifiziert, wenn ich sie selbst hochlade, aber leider kann die App, die sie hochlädt, die Header nicht setzen, da sie s3fs benutzt, um die Dateien dorthin zu kopieren.


75
2018-05-03 16:15


Ursprung


Antworten:


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


Anweisungen der AWS-Konsole

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 "Key" -Feld "Cache-Control" aus dem Dropdown-Menü max-age = 604800Geben Sie (7 Tage) für Value ein
  • Drücken Sie die Schaltfläche "Speichern"

(Danke an @CoderBoy - bitte gib ihm etwas Liebe unten)


AWS-Befehlszeilenlösung

Ursprünglich, als ich diese Bucket-Policies erstellt habe, war das ein Nein, also dachte ich mir, wie man es mit aws-cli macht, und es ist ziemlich glatt. Bei der Recherche konnte ich keine Beispiele in der Wildnis finden, daher dachte ich, ich würde einige meiner Lösungen veröffentlichen, um denen in Not zu helfen.

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

Um die in der Befehlszeile angegebenen Metadaten zu verwenden, müssen Sie das Flag "--metadata-directive REPLACE" hinzufügen. Hier sind ein paar 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 (Note - Recursive 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 eine veraltete awscli verursacht werden - siehe @ eliotRosewaters Antwort unten


S3cmd Werkzeug

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

Für vollständige Anweisungen, Siehe @ Ashishyadaveee11's Post unten


Ich hoffe es hilft!


120
2018-03-26 14:13



Schritte

  1. git clone https://github.com/s3tools/s3cmd
  2. Lauf s3cmd --configure  (Sie werden nach den zwei Schlüsseln gefragt - kopieren Sie sie und kopieren Sie sie von Ihrem Bestätigungs-E-Mail oder von Ihrer Amazon-Kontoseite. Sei vorsichtig, wenn sie kopieren! Sie sind Groß- und Kleinschreibung und müssen genau eingegeben werden oder Sie erhalten weiterhin Fehlermeldungen über ungültige Signaturen oder ähnliches. Denken Sie daran, hinzuzufügen s3:ListAllMyBuckets Berechtigungen für die Schlüssel oder Sie erhalten ein AccessDenied Fehler beim Testen des Zugriffs.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/

18
2018-02-04 13:27



Jetzt kann es problemlos von der AWS-Konsole aus 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 "Key" -Feld "Cache-Control" aus dem Dropdown-Menü
  • max-age = 604800Geben Sie (7 Tage) für Value ein
  • Drücken Sie die Schaltfläche "Speichern"

Die Ausführungszeit hängt von den Bucket-Dateien ab. Wiederholen Sie den Vorgang von Anfang an, wenn Sie den Browser versehentlich schließen.


11
2017-11-02 10:17



Ich denke nicht, dass Sie dies auf der Bucket-Ebene angeben können, aber es gibt ein paar Problemumgehungen für Sie.

  1. Kopiere das Objekt in sich selbst auf S3 die entsprechende Einstellung cache-control Header für den Kopiervorgang.

  2. Geben Sie Antwortheader in der URL zu den Dateien an. Sie müssen zuvor signierte URLs verwenden, damit dies funktioniert, Sie können jedoch bestimmte Antwortheader in der Querystring-Zeichenfolge angeben cache-control und expires. Für eine vollständige Liste der verfügbaren Optionen siehe: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225


7
2018-05-04 08:28



Wäre mein Reputationswert> 50, würde ich nur kommentieren. Aber es ist (noch) nicht so hier ist eine weitere vollständige Antwort.


Ich habe mir schon seit einer Weile mit diesem Problem den Kopf zerbrochen. Bis ich die Dokumente gefunden und gelesen habe. Teilen Sie das hier für den Fall, dass es anderen hilft:

Was schließlich für mich funktionierte, war dieser Befehl. Ich wählte eine Ablaufzeit von 1 Sekunde zum Testen, 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 REPLACE wird benötigt, wenn "cp"Ändern der Metadaten einer vorhandenen Datei in S3
  • max-age legt das Browser-Caching-Alter in Sekunden fest
  • s-maxage legt CloudFront-Caching in Sekunden fest

Wenn Sie diese Cache-Control-Headerwerte für eine Datei beim Hochladen auf S3 festlegen, sieht der Befehl ähnlich aus:

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

4
2018-02-01 21:53



Für diejenigen, die versuchen, Dan's Antwort zu verwenden und den Fehler zu bekommen:

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

Ich stieß auf das Problem, und das Problem war, dass ich awscli mit installiert

sudo apt-get installiert awscli

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

Dann neu installiert nach dem Verfahren von Amazon: 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 andere auch stoßen könnten.


1
2017-10-16 21:11



Sie können immer ein Lambda mit einem Trigger für PUTOBJECT in S3 konfigurieren, das Lambda ändert einfach die Kopfzeile dieses gerade gesetzten Objekts.

Dann können Sie den oben erwähnten Kopierbefehl ein letztes Mal ausführen, und alle neuen Objekte werden durch das Lambda behoben.

AKTUALISIEREN:

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


1
2018-06-03 21:35