Modifica ricorsiva del tipo di contenuto per i file di una determinata estensione su Amazon S3


12

Ho un grande bucket S3 con una struttura "cartella" nidificata contenente (tra le altre cose) file statici .json e .md. Questi file vengono serviti da S3 text/plainpiuttosto che dal corretto application/jsone text/markdown.

Ho aggiornato i valori predefiniti del bucket in modo che i nuovi caricamenti abbiano il tipo di contenuto corretto.

Qual è il modo migliore per percorrere "l'albero" e aggiornare il tipo di contenuto per i file che corrispondono a una determinata estensione?

Risposte:


25

Ecco un esempio di come farlo con lo strumento aws cli. Lo strumento cp consente l'uso di opzioni ricorsive, cosa che non credo possa fare lo strumento s3api. In questo caso, sto risolvendo un sacco di SVG. Rimuovi le opzioni --dryrun quando sei pronto a liberarlo.

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

Comprendo il concetto alla base del comando. Ma questo eliminerà le versioni del file poiché è una direttiva di sostituzione? Il mio bucket è configurato con il versioning e ogni file ha alcune versioni. La sostituzione eliminerà tutte le versioni e creerà un nuovo file o terrà conto di tutte le versioni durante la sostituzione?
Joze,

Questa è una buona domanda. Sicuramente merita una prova in un secchio usa e getta. La mia speranza è che la richiesta di sostituire solo i metadati non
spazzasse

Ho fatto un test e ho scoperto che le versioni rimangono, tuttavia la versione modificata dei metadati diventa l'ultima versione, le versioni precedenti hanno i metadati precedenti. Sto cercando di trovare un modo per modificare in modo ricorsivo i metadati di tutte le versioni ora, cioè senza creare uno script complicato che elencherà ogni versione e quindi modifichi i suoi metadati ...
Joze

Questo comando ripristina acl. Se hai bisogno di un valore non predefinito, aggiungi--acl=...
Vasiliy Zverev il

3

A meno che tu non voglia sporcarti le mani usando boto / python o un'altra API AWS, sospetto che la tua scommessa migliore sarebbe quella di utilizzare $ aws s3api copy-objectil --content-typeflag per copiare un oggetto su se stesso, impostando il nuovo tipo di contenuto.

Ecco la documentazione per s3api.

Inutile dire che dovresti testarlo prima di eseguirlo in modo ricorsivo su tutto il secchio.


1
Per quanto riguarda i test, utilizzare il flag "dry run" nell'interfaccia della riga di comando di Amazon.
Bart

3

Dopo alcuni scavi, ho scoperto che lo s3cmdstrumento può fare questo. Ad esempio, per impostare i file JSON su application / json:

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

3

Come accennato in precedenza, è possibile utilizzare lo awsstrumento di Amazon e utilizzare s3api per copiare l'oggetto su se stesso e utilizzare metadata-directive=REPLACEper modificare il tipo di contenuto.

Lo sto mettendo qui, perché a volte vorresti iterare su nomi di file che sono memorizzati nel database, ed è così che puoi farlo tramite cli.

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

Questo sostituisce solo un file. Come si esegue questo comando su tutti i file di tipo .apk?
Bart

@bart vedi la mia risposta per via ricorsiva.
t1m0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.