Modification récursive du type de contenu pour les fichiers d'une extension donnée sur Amazon S3

12

J'ai un grand compartiment S3 avec une structure de "dossier" imbriquée contenant (entre autres) des fichiers .json et .md statiques. Ces fichiers sont servis par S3 text/plainplutôt que par le correct application/jsonet le text/markdown.

J'ai mis à jour les valeurs par défaut du compartiment afin que les nouveaux téléchargements aient le type de contenu correct.

Quelle est la meilleure façon de parcourir «l'arborescence» et de mettre à jour le type de contenu pour les fichiers correspondant à une certaine extension?

Gabriel Bauman
la source

Réponses:

25

Voici un exemple de procédure à suivre avec l'outil aws cli. L'outil cp permet d'utiliser des options récursives, ce que je ne pense pas que l'outil s3api puisse faire. Dans ce cas, je corrige un tas de SVG. Supprimez les options --dryrun lorsque vous êtes prêt à le déclencher.

aws s3 cp \
      --exclude "*" \
      --include "*.svg" \
      --content-type="image/svg+xml"  \
      --metadata-directive="REPLACE" \
      --recursive \
      --dryrun \
       s3://mybucket/static/ \
       s3://mybucket/static/
t1m0
la source
Je comprends le concept sous-jacent de la commande. Mais cela supprimera-t-il les versions du fichier puisqu'il s'agit d'une directive de remplacement? Mon compartiment est configuré avec le contrôle de version et chaque fichier a des versions. Le remplacer supprimera toutes les versions et créera un nouveau fichier ou prendra-t-il en compte toutes les versions lors du remplacement?
Joze
C'est une bonne question. Vaut vraiment le coup dans un seau jetable. J'espère que la demande de remplacer uniquement les métadonnées ne fera pas exploser les versions mais ...
t1m0
J'ai fait un test et il s'avère que les versions restent, mais la version modifiée des métadonnées devient la dernière version, les anciennes versions ont les métadonnées précédentes. J'essaie de trouver un moyen de modifier récursivement les métadonnées de toutes les versions maintenant, c'est-à-dire sans faire un script compliqué qui listera chaque version puis modifiera ses métadonnées ...
Joze
Cette commande réinitialise acl. Si vous avez besoin d'une valeur autre que celle par défaut, ajoutez--acl=...
Vasiliy Zverev
3

Sauf si vous voulez vous salir les mains en utilisant boto / python ou une autre API AWS, je pense que votre meilleur pari serait d'utiliser $ aws s3api copy-objectavec le --content-typedrapeau pour copier un objet sur lui-même, en définissant le nouveau type de contenu.

Voici la documentation de s3api.

Il va sans dire que vous devez d'abord tester cela, avant de l'exécuter récursivement sur l'ensemble de votre compartiment.

EEAA
la source
1
En ce qui concerne les tests, utilisez l'indicateur "dry run" dans Amazon CLI.
bart
3

Après avoir creusé, j'ai trouvé que l' s3cmdoutil pouvait le faire. Par exemple, pour définir les fichiers JSON sur application / json:

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

Comme mentionné précédemment, vous pouvez utiliser l' awsoutil d'Amazon et utiliser s3api pour copier-objet sur lui-même, et utiliser metadata-directive=REPLACEpour changer le type de contenu.

Je mets cela ici, parce que parfois vous voudrez répéter les noms de fichiers qui sont stockés dans la base de données, et c'est ainsi que vous pouvez le faire via 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
gilm
la source
Cela remplace un seul fichier. Comment exécutez-vous cette commande sur tous les fichiers de type .apk?
bart
@bart voir ma réponse de manière récursive.
t1m0