2014-05-08 3 views
12

J'ai plusieurs objets stockés dans Amazon S3 dont je dois changer le type de contenu de text/html à application/rss+xml. Je comprends qu'il devrait être possible de le faire avec une commande de copie, en spécifiant le même chemin pour la source et la destination. Je suis en train de le faire en utilisant les outils AWS cli, mais je reçois cette erreur:Comment puis-je changer le type de contenu d'un objet en utilisant aws cli?

$ aws s3 cp s3://mybucket/feed/ogg/index.html \ 
      s3://mybucket/feed/ogg/index.html \ 
      --content-type 'application/rss+xml' 
copy failed: s3://mybucket/feed/ogg/index.html 
to s3://mybucket/feed/ogg/index.html 
A client error (InvalidRequest) occurred when calling the 
CopyObject operation: This copy request is illegal because it is 
trying to copy an object to itself without changing the object's 
metadata, storage class, website redirect location or encryption 
attributes. 

Si je spécifie un autre chemin pour la source et la destination, je ne suis pas l'erreur:

$ aws s3 cp s3://mybucket/feed/ogg/index.html \ 
      s3://mybucket/feed/ogg/index2.html \ 
      --content-type 'application/rss+xml' 
copy: s3://mybucket/feed/ogg/index.html 
to s3://mybucket/feed/ogg/index2.html 

Même si la commande aboutit, l'objet index2.html est créé avec le type de contenu text/html, et non le type application/rss+xml que j'ai spécifié.

Comment puis-je modifier cette ligne de commande pour que cela fonctionne?

+1

J'ai vu [ce problème] (https://github.com/aws/aws-cli/issues/652#issuecomment-41213226) signaler le même problème. Ce thread comprend quelques solutions de contournement, donc je vais voir comment je m'entends avec eux. – nelstrom

Répondre

8

Il est possible d'utiliser le faible niveau s3api pour faire ce changement:

$ aws s3api copy-object --bucket archive --content-type "application/rss+xml" \ 
    --copy-source archive/test/test.html --key test/test.html \ 
    --metadata-directive "REPLACE" 

http://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html

Le problème est tout simplement de ne pas pouvoir préciser le --metadata-directive. Merci d'avoir signalé le open issue/feature request, nelstrom!

+0

Comment cela peut-il être exécuté pour plusieurs objets avec une certaine extension? – bart

+0

Il peut y avoir un moyen plus propre, mais vous pouvez lister l'objet dans un fichier puis lire toutes les lignes et exécuter la commande ci-dessus sur chaque ligne, ce qui ressemblerait à: 'while read line; do copy-object --bucket archive --content-type "application/rss + xml" --copie-source archive/$ line.html --key $ line.html --metadata-directive "REPLACE"; done Cawb07

Questions connexes