Alterar recursivamente o tipo de conteúdo dos arquivos de uma determinada extensão no Amazon S3

Alterar recursivamente o tipo de conteúdo dos arquivos de uma determinada extensão no Amazon S3

Eu tenho um grande bucket S3 com uma estrutura de "pastas" aninhada contendo (entre outras coisas) arquivos estáticos .json e .md. Esses arquivos estão sendo servidos pelo S3 como text/plainem vez dos application/jsonarquivos text/markdown.

Atualizei os padrões do bucket para que novos uploads tenham o tipo de conteúdo correto.

Qual é a melhor maneira de percorrer a "árvore" e atualizar o tipo de conteúdo dos arquivos que correspondem a uma determinada extensão?

Responder1

Aqui está um exemplo de como fazer isso com a ferramenta aws cli. A ferramenta cp permite o uso de opções recursivas, o que não acho que a ferramenta s3api possa fazer. Neste caso, estou consertando vários SVGs. Remova as opções --dryrun quando estiver pronto para liberá-lo.

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

Responder2

Depois de algumas pesquisas, descobri que a s3cmdferramenta pode fazer isso. Por exemplo, para definir arquivos JSON como application/json:

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

Responder3

A menos que você queira sujar as mãos usando boto/python ou outra API da AWS, suspeito que sua melhor aposta seria usar $ aws s3api copy-objecto --content-typesinalizador para copiar um objeto para si mesmo, definindo o novo tipo de conteúdo.

Aqui está odocumentaçãopara s3api.

Nem é preciso dizer que você deve testar isso primeiro, antes de executá-lo recursivamente em todo o seu bucket.

Responder4

Conforme mencionado anteriormente, você pode usar awsa ferramenta da Amazon e usar s3api para copiar o objeto para si mesmo e usar metadata-directive=REPLACEpara alterar o tipo de conteúdo.

Estou colocando isso aqui, porque às vezes você deseja iterar em nomes de arquivos armazenados no banco de dados, e é assim que você pode fazer isso através do 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

informação relacionada