Rekursives Ändern des Inhaltstyps für Dateien einer bestimmten Erweiterung in Amazon S3


12

Ich habe einen großen S3-Bucket mit einer verschachtelten "Ordner" -Struktur, die (unter anderem) statische .json- und .md-Dateien enthält. Diese Dateien werden von S3 text/plainals die richtigen application/jsonund geliefert text/markdown.

Ich habe die Bucket-Standardeinstellungen aktualisiert, damit neue Uploads den richtigen Inhaltstyp haben.

Was ist der beste Weg, um den "Baum" zu durchlaufen und den Inhaltstyp für Dateien zu aktualisieren, die einer bestimmten Erweiterung entsprechen?

Antworten:


25

Hier ist ein Beispiel, wie dies mit dem aws cli-Tool gemacht wird. Das cp-Tool ermöglicht die Verwendung rekursiver Optionen, was meines Erachtens das s3api-Tool nicht kann. In diesem Fall repariere ich eine Reihe von SVGs. Entfernen Sie die Optionen --dryrun, wenn Sie bereit sind, sie freizugeben.

aws s3 cp \
      --exclude "*" \
      --include "*.svg" \
      --content-type="image/svg+xml"  \
      --metadata-directive="REPLACE" \
      --recursive \
      --dryrun \
       s3://mybucket/static/ \
       s3://mybucket/static/

Ich verstehe das zugrunde liegende Konzept des Befehls. Aber werden dadurch die Versionen der Datei gelöscht, da es sich um eine Ersetzungsanweisung handelt? Mein Bucket ist mit Versionierung konfiguriert und jede Datei hat einige Versionen. Durch das Ersetzen werden alle Versionen gelöscht und eine neue Datei erstellt, oder werden beim Ersetzen alle Versionen berücksichtigt?
Joze

Das ist eine gute Frage. Auf jeden Fall einen Test in einem Wegwerfeimer wert. Ich hoffe, dass die Anfrage, nur Metadaten zu ersetzen, die Versionen nicht
umhauen

Ich habe einen Test durchgeführt und es stellte sich heraus, dass die Versionen erhalten bleiben. Die modifizierte Version der Metadaten wird jedoch zur neuesten Version. Die älteren Versionen haben die vorherigen Metadaten. Ich versuche jetzt einen Weg zu finden, die Metadaten aller Versionen rekursiv zu ändern, ohne ein kompliziertes Skript zu erstellen, das jede Version auflistet und dann ihre Metadaten ändert ...
Joze

Dieser Befehl setzt acl zurück. Wenn Sie einen nicht standardmäßigen Wert benötigen, fügen Sie hinzu--acl=...
Vasiliy Zverev

3

Wenn Sie sich nicht mit Boto / Python oder einer anderen AWS-API die Hände schmutzig machen möchten, sollten Sie am besten $ aws s3api copy-objectmit dem --content-typeFlag ein Objekt in sich selbst kopieren und den neuen Inhaltstyp festlegen.

Hier ist die Dokumentation für s3api.

Es versteht sich von selbst, dass Sie dies zuerst testen sollten, bevor Sie es rekursiv auf Ihrem gesamten Bucket ausführen.


1
Verwenden Sie zum Testen das Flag "Trockenlauf" in Amazon CLI.
Bart

3

Nach einigem Graben stellte ich fest, dass das s3cmdTool dies kann. So setzen Sie JSON-Dateien auf application / json:

s3cmd --recursive modify --acl-public \
       --add-header='content-type':'application/json' \
       --exclude '' --include '.json' \
       s3://bucket/

3

Wie bereits erwähnt, können Sie das awsTool von Amazon verwenden und mit s3api Objekte auf sich selbst kopieren und metadata-directive=REPLACEden Inhaltstyp ändern.

Ich setze dies hier ein, weil Sie manchmal Dateinamen iterieren möchten, die in der Datenbank gespeichert sind, und so können Sie dies über cli tun.

aws s3api copy-object \
          --content-type="application/vnd.android.package-archive" \
          --metadata-directive="REPLACE" \
          --copy-source "MYBUCKET/FILE.apk" \
          --bucket "MYBUCKET" \
          --key "FILE.apk" \
          --acl public-read

Dies ersetzt nur eine Datei. Wie führen Sie diesen Befehl für alle Dateien vom Typ .apk aus?
Bart

@bart siehe meine Antwort für rekursiven Weg.
t1m0
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.