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!
cp
Download und erneuten Upload alles?Jetzt kann es einfach über die AWS-Konsole geändert werden.
Die Ausführung dauert einige Zeit, abhängig von Ihren Bucket-Dateien. Wiederholen Sie von Anfang an, wenn Sie den Browser versehentlich schließen.
quelle
Schritte
git clone https://github.com/s3tools/s3cmd
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 darans3:ListAllMyBuckets
, den Schlüsseln Berechtigungen hinzuzufügen , daAccessDenied
sonst beim Testen des Zugriffs eine Fehlermeldung angezeigt wird.)./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
quelle
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:
--metadata-directive REPLACE
ist erforderlich, wenncp
Metadaten einer vorhandenen Datei in S3 geändert werdenmax-age
Legt das Alter des Browser-Cachings in Sekunden fests-maxage
Legt das CloudFront-Caching in Sekunden festWenn Sie diese Cache-Control-Headerwerte beim Hochladen in S3 für eine Datei festlegen, sieht der Befehl ebenfalls folgendermaßen aus:
quelle
Ich glaube nicht, dass Sie dies auf Bucket-Ebene angeben können, aber es gibt einige Problemumgehungen für Sie.
Kopieren Sie das Objekt in S3 in sich selbst und legen Sie die entsprechenden
cache-control
Header für den Kopiervorgang fest.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-control
undexpires
. Eine vollständige Liste der verfügbaren Optionen finden Sie unter: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225quelle
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 /.
quelle
An diejenigen, die versuchen, Dans Antwort zu verwenden und den Fehler erhalten:
Ich bin auf das Problem gestoßen, und das Problem war, dass ich awscli mit installiert habe
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.
quelle