Wie füge ich eine Cache-Steuerung in AWS S3 hinzu?

75

Ich habe 20000 Dateien mit dem Befehl s3cmd nach AWS S3 verschoben. Jetzt möchte ich die Cache-Steuerung für alle Bilder hinzufügen (.jpg)

Diese Dateien befinden sich in (s3: // Bucket-Name / images /). Wie kann ich die Cache-Steuerung für alle Bilder von s3cmd hinzufügen oder gibt es eine andere Möglichkeit, Header hinzuzufügen?

Vielen Dank

Rajaraman
quelle

Antworten:

83

Bitte versuchen Sie es mit dem aktuellen Upstream-Hauptzweig ( https://github.com/s3tools/s3cmd ), da er jetzt einen modifyBefehl hat, der wie folgt verwendet wird:

./s3cmd --recursive modify --add-header="Cache-Control:max-age=86400" s3://yourbucket/
user3440362
quelle
5
Hallo, danke für die Antwort, ich habe es versucht und ich erhalte eine Fehlermeldung wie FEHLER: Ungültiger Befehl: u'modify '
Rajaraman
@ Rajaraman du weißt etwas darüber? Nach diesem Schritt wird der Zugriff verweigert
Shajin
2
Dies funktioniert .. getestet mit s3cmd Version 1.5.0-rc1 ABER!: Dies ändert den Content-Typ-Header des Objekts in "binary / octet-stream"! Getestet mit einer PNG-Datei.
Hardy
1
Ich hatte das gleiche Problem wie @Hardy. Außerdem wurde die öffentliche Lesbarkeit aller meiner Dateien entfernt. Achtung.
Andrew B.
1
Es scheint, dass der Content-TypeFehler mit # 406 behoben wurde .
Josh3736
60

Auch mit dem AWS-eigenen Client:

aws s3 sync /path s3://yourbucket/ --recursive --cache-control max-age=604800
user31208
quelle
2
Dies funktioniert, wenn Sie von einem lokalen Pfad auf Ihrem Computer auf AWS hochladen und möchten, dass alles die richtige Cache-Kontrolle
behält
24
Dadurch werden die Cache-Header zum Zeitpunkt der ersten Synchronisierung festgelegt, vorhandene Dateien werden jedoch nicht aktualisiert. Sie können ein Update wie dieses erzwingenfind . -type f -exec touch '{}' \;; aws s3 sync /path s3://yourbucket/ --recursive --cache-control max-age=604800
Matt Byrne
3
Das OP bittet darum, vorhandene Dateien in S3 zu aktualisieren und keine neuen Dateien hochzuladen
Beowulfenator
2
Ist das --recursivenoch nötig? Die CLI-Dokumentation scheint es nicht als Argument aufzulisten. docs.aws.amazon.com/cli/latest/reference/s3/sync.html
Corey McMahon
1
Bei Verwendung touch '{}'wie oben erwähnt wird das Änderungsdatum der Datei geändert, was möglicherweise unerwünscht ist. Um Satz cache-controlauf vorhandene Dateien finden @ rodrigo-silveira Antwort unten.
Fabien Snauwaert
27

Mein Eimer hat mp4, jpg und andere Dateien. Die Dateien, die ich aktualisieren wollte, werden in einem "Sub-Bucket" gespeichert (z. B. https://s3.amazonaws.com/my.bucket/sub-directory/my-video.mp4 ). In meinem Fall wollte ich nur das Cache-Steuerelement für MP4-Dateien aktualisieren:

aws s3 cp \
   s3://my.bucket/sub-directory/ s3://my.bucket/sub-directory/ \
   --exclude '*.jpg' --exclude '*.png' \
   --cache-control 'max-age=31104000' \
   --recursive

Um zu testen, was dies bewirkt, können Sie das --dryrunFlag verwenden:

aws s3 cp --dryrun \
   s3://my.bucket/sub-directory/ s3://my.bucket/sub-directory/ \
   --exclude '*.jpg' --exclude '*.png' \
   --cache-control 'max-age=31104000' \
   --recursive
Rodrigo-Silveira
quelle
Ich erhalte die folgende Fehlermeldung: "Beim Aufrufen der CopyObject-Operation: Diese Kopieranforderung ist unzulässig, da versucht wird, ein Objekt in sich selbst zu kopieren, ohne die Metadaten, die Speicherklasse, den Standort der Websiteumleitung oder die Verschlüsselungsattribute des Objekts zu ändern."
Flimm
6
Um das Problem zu beheben, musste ich hinzufügen --metadata-directive REPLACE --acl public-read.
Flimm
Ich habe ursprünglich die Metadaten-Direktive verwendet, um diese Arbeit zu machen, aber das hat letztendlich den Inhaltstyp der Objekte geändert, anstatt nur hinzuzufügen--acl public-read
Matt Gaunt
24

Um Metadaten wie die Cache-Steuerung für ein Objekt in S3 anzupassen, ohne es erneut hochladen zu müssen und ohne Tools von Drittanbietern verwenden zu müssen, können Sie mit der AWS-CLI Folgendes tun. Es kopiert das Objekt in sich selbst und überschreibt die Metadaten mit den von Ihnen gewählten Einstellungen:

aws s3api copy-object --copy-source <bucket-name>/<file> --bucket <bucket-name> --key <file> --metadata-directive REPLACE --cache-control "max-age=3600"

Verarbeiten Sie diesen Befehl in einer Suche, um ihn für einen vorhandenen Satz von Dateien auszuführen, der bereits im Bucket vorhanden ist, wie Sie bereits erwähnt haben:

find . -type f -exec aws s3api copy-object --copy-source <bucket-name>/{} --bucket <bucket-name> --key {} --metadata-directive REPLACE --cache-control "max-age=3600"

Ersetzen Sie ihn <bucket-name>durch den Namen Ihres Eimers

WARNUNG: Dadurch werden alle vorhandenen Metadaten in den Dateien wie acl überschrieben. Fügen Sie dem Befehl einfach zusätzliche Flags hinzu, um festzulegen, was Sie benötigen, z. B. --acl public-readum einen vollständigen öffentlichen Zugriff zu ermöglichen. (danke @jackson)

Joel Duckworth
quelle
7
Dadurch wurden meine Cache-Header festgelegt, obwohl die "öffentlichen" Berechtigungen, die ich für die Dateien festgelegt hatte, entfernt wurden (wodurch sie auf meiner von s3 gehosteten Site nicht mehr sichtbar waren). Um die Dateien öffentlich zu halten, musste ich den Befehl mit ausführen --acl public-read.
Jackson
14

Wenn Sie Tools von Drittanbietern vermeiden möchten und dies eine einmalige Aufgabe ist, können Sie die AWS-Konsole verwenden.

  1. Navigieren Sie zu Ihrem S3-Bucket
  2. Wählen Sie alle Objekte aus, die Sie ändern möchten
  3. Klicken Sie auf Aktionen -> Metadaten ändern
  4. Wählen Sie Cache-Control für den Schlüssel und geben Sie das gewünschte Steuerelement als Wert ein
  5. sparen
mattdedek
quelle
Wie können Sie diese Änderungen für zukünftige Uploads vornehmen? Zum Beispiel, wenn Sie eine Datei über die s3-API oder einfach manuell in die Webkonsole hochladen, um die Cache-Steuerung auf dem Ordner / Bucket zu belassen
Andrei F
3
PUT / ObjectName HTTP/1.1 
Host: BucketName .s3.amazonaws.com 
Date: date 
x-amz-meta-Cache-Control : max-age= <value in seconds> 
Authorization: signatureValue 

Jede Metadateneinstellung enthält ein Schlüssel-Wert-Paar. Der Metadatenschlüssel für die Cache-Steuerung lautet "Cache-Steuerung" und der Wert ist“max-age=<time for which you want your object to be accessed from cache in seconds>”

Sie können den benutzerdefinierten Header für die Cache-Steuerung für Amazon S3-Objekte festlegen, indem Sie eine HTTP-PUT-Anforderung mit den entsprechenden Headern auf zwei Arten an Amazon S3 Server senden:

Festlegen von Cache-Steuerungsmetadaten mithilfe der PUT-Objektanforderung für die Amazon S3-REST-API - Wenn Sie Programmierer sind, können Sie ein eigenes Softwareprogramm schreiben, um mithilfe von Amazon S3-REST- oder SOAP-APIs benutzerdefinierte Header mit der PUT-Objektanforderung festzulegen. Diese Website bezieht sich nur auf Amazon S3-REST-APIs. Weitere Informationen zur Verwendung von SOAP-APIs finden Sie auf der AWS-Dokumentationswebsite. Festlegen von Cache Control-Metadaten mithilfe der Bucket Explorer-Benutzeroberfläche - Wenn Sie benutzerdefinierte HTTP-Header wie Cache Control mithilfe von Mausklicks festlegen möchten, anstatt ein Softwareprogramm zu schreiben, können Sie dafür die Bucket Explorer-Benutzeroberfläche verwenden. Mit diesem benutzerdefinierten HTTP-Header können Sie das Caching-Verhalten angeben, das bei der Anforderungs- / Antwortkette eingehalten werden muss, und um zu verhindern, dass Caches die Anforderung oder Antwort stören.

Weitere Informationen finden Sie unter Festlegen des Cache-Steuerkopfs für Amazon S3-Objekte. `

Laxmikant Ratnaparkhi
quelle
1

(Da das OP nach einem anderen Weg gefragt hat)

Sie können dies auch tun über aws-clizB (v :) aws-cli/1.8.8 Python/2.7.2 Darwin/12.5.0:

aws s3api put-object \
--bucket mybucket \
--key my/key \
--cache-control max-age=1 \
--body myfile.txt

Bitte beachten Sie jedoch, dass Sie alle vorhandenen Objekte neu schreiben.

Jose Alban
quelle
0

Aktualisieren Sie einfach das s3cmd auf Version 1.5.1 und das Problem wird behoben.

Monika Bhadauria
quelle
0

Eine andere wirklich einfache Möglichkeit, dies zu tun, ist die Verwendung des S3-Browsers: http://s3browser.com/ Sie können einfach mit gedrückter Umschalttaste oder Strg + a alle gewünschten Bilder auswählen. Gehen Sie dann einfach zur Registerkarte "HTTP-Header" und klicken Sie auf "Neue Header hinzufügen" und dann auf "Änderungen übernehmen". Alle anderen Berechtigungen und Header wurden automatisch beibehalten.

Wenn Sie viel S3 verwenden; Es ist sowieso eine süße App, besonders wenn Sie enorme Uploads haben (es gibt nichts Besseres in der Welt von FTP, Dropbox oder anderem!)

Reece
quelle
1
Warum die Abstimmungen? Das OP sagte 's3cmd oder gibt es eine andere Möglichkeit, Header hinzuzufügen?' s3browser eignet sich hervorragend für die Bearbeitung von Bulk-Headern. viel besser als AWS Console Webinterface.
Reece
1
Ich habe dich nicht abgelehnt, aber das ist eine schlechte Idee, weil es nicht zu warten ist. Sie müssen dies jedes Mal manuell tun, wenn jemand eine neue Datei hinzufügt (oder versuchen, ihn dafür zu trainieren). Eine bessere Lösung wäre "Führen Sie dieses Skript aus, um Ihre Dateien hochzuladen" und es funktioniert immer korrekt. Keine manuellen Eingriffe und folgenden Schritte erforderlich.
Ryan Shillington
2
Warum machen sich die Leute die Mühe, GUI-FTP-Clients wie Filezilla oder Cyberduck zu verwenden, wenn es den Linux-Befehl sftp gibt? Ähnlich schlechte Idee? Theoretisch können Sie fast jede Softwarelösung skripten, die eine vorhandene GUI-Lösung enthält. Ich würde gerne denken, dass das, was es als gute oder schlechte Idee qualifiziert, der Nutzungskontext ist. Ich finde, dass der s3-Browser ein nützliches Werkzeug ist. Ich glaube nicht, dass es weh tut, ihn als Option zu präsentieren.
Reece