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?

Gabriel Bauman
quelle

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/
t1m0
quelle
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.

EEAA
quelle
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/
Gabriel Bauman
quelle
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
Gilm
quelle
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