Alterando recursivamente o tipo de conteúdo para arquivos de uma determinada extensão no Amazon S3

12

Eu tenho um grande bucket S3 com uma estrutura de "pasta" aninhada que contém (entre outras coisas) arquivos .json e .md estáticos. Os arquivos de teses estão sendo servidos pelo S3 text/plaine não pelo correto application/jsone text/markdown.

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

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

Gabriel Bauman
fonte

Respostas:

25

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. Nesse caso, estou corrigindo um monte de 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/
t1m0
fonte
Eu entendo o conceito subjacente do comando. Mas isso excluirá as versões do arquivo, pois é uma diretiva de substituição? Meu bucket está configurado com controle de versão e cada arquivo possui algumas versões. Substituí-lo excluirá todas as versões e criará um novo arquivo ou levará em consideração todas as versões durante a substituição?
Joze
Esta é uma boa pergunta. Definitivamente vale a pena testar em um balde descartável. Minha esperança é que a solicitação para substituir apenas metadados não iria soprar versões, mas ...
t1m0
Fiz um teste e descobri que as versões permanecem; no entanto, a versão modificada de metadados se torna a versão mais recente, as versões mais antigas têm os metadados anteriores. Estou tentando encontrar uma maneira de recursivamente modificar os metadados de todas as versões agora, isto é, sem fazer um script complicado que irá listar todas as versões e modifique seus metadados ...
Joze
Este comando redefine o acl. Se você precisar de um valor não padrão, adicione--acl=...
Vasiliy Zverev 21/10
3

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-objectcom o --content-typesinalizador para copiar um objeto para si próprio, definindo o novo tipo de conteúdo.

Aqui está a documentação para o s3api.

Escusado será dizer que você deve testar isso primeiro, antes de executá-lo recursivamente em todo o seu balde.

EEAA
fonte
1
Em relação aos testes, use o sinalizador "dry run" no Amazon CLI.
Bart
3

Depois de algumas escavações, descobri que a s3cmdferramenta pode fazer isso. Por exemplo, para configurar arquivos JSON como application / json:

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

Como mencionado anteriormente, você pode usar a awsferramenta Amazon e usar o s3api para copiar um objeto para si mesmo e metadata-directive=REPLACEalterar o tipo de conteúdo.

Estou colocando isso aqui, porque às vezes você deseja iterar nos 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
gilm
fonte
Isso substitui apenas um arquivo. Como você executa esse comando em todos os arquivos do tipo .apk?
Bart
@ Bart ver a minha resposta de forma recursiva.
t1m0