Cambiar de forma recursiva el tipo de contenido para archivos de una extensión determinada en Amazon S3

12

Tengo un gran cubo S3 con una estructura de "carpeta" anidada que contiene (entre otras cosas) archivos estáticos .json y .md. Tesis archivos están siendo servidos por S3 como text/plainen lugar de la correcta application/jsony text/markdown.

He actualizado los valores predeterminados del depósito para que las nuevas cargas tengan el tipo de contenido correcto.

¿Cuál es la mejor manera de recorrer el "árbol" y actualizar el tipo de contenido para los archivos que coinciden con una determinada extensión?

Gabriel Bauman
fuente

Respuestas:

25

Aquí hay un ejemplo de cómo hacer esto con la herramienta aws cli. La herramienta cp permite el uso de opciones recursivas, lo que no creo que la herramienta s3api pueda hacer. En este caso, estoy arreglando un montón de SVG. Elimine las opciones --dryrun cuando esté listo para liberarlo.

aws s3 cp \
      --exclude "*" \
      --include "*.svg" \
      --content-type="image/svg+xml"  \
      --metadata-directive="REPLACE" \
      --recursive \
      --dryrun \
       s3://mybucket/static/ \
       s3://mybucket/static/
t1m0
fuente
Entiendo el concepto subyacente del comando. ¿Pero esto eliminará las versiones del archivo ya que es una directiva de reemplazo? Mi bucket está configurado con versiones y cada archivo tiene algunas versiones. Reemplazarlo eliminará todas las versiones y creará un nuevo archivo o tendrá en cuenta todas las versiones durante el reemplazo.
Joze
Buena pregunta. Definitivamente vale la pena probarlo en un cubo desechable. Mi esperanza es que la solicitud para reemplazar simplemente metadatos no habría soplar versiones, pero ...
t1m0
Hice una prueba y resultó que las versiones permanecen, sin embargo, la versión modificada de metadatos se convierte en la última versión, las versiones anteriores tienen los metadatos anteriores. Estoy tratando de encontrar una manera de modificar recursivamente los metadatos de todas las versiones ahora, sin crear un script complicado que enumere cada versión y luego modifique sus metadatos ...
Joze
Este comando restablece acl. Si necesita un valor no predeterminado, agregue--acl=...
Vasiliy Zverev
3

A menos que desee ensuciarse las manos con boto / python u otra API de AWS, sospecho que su mejor opción sería usar $ aws s3api copy-objectcon la --content-typebandera para copiar un objeto en sí mismo, configurando el nuevo tipo de contenido.

Aquí está la documentación para s3api.

No hace falta decir que debe probar esto primero, antes de ejecutarlo recursivamente en todo su cubo.

EEAA
fuente
1
Con respecto a las pruebas, use el indicador de "ejecución en seco" en Amazon CLI.
Bart
3

Después de cavar un poco, descubrí que la s3cmdherramienta puede hacer esto. Por ejemplo, para establecer archivos JSON en application / json:

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

Como se mencionó anteriormente, puede usar la awsherramienta de Amazon y usar s3api para copiar objetos sobre sí mismo, y usar metadata-directive=REPLACEpara cambiar el tipo de contenido.

Estoy poniendo esto aquí, porque a veces querrás iterar en los nombres de archivo que están almacenados en la base de datos, y así es como puedes hacerlo a través de 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
fuente
Esto reemplaza solo un archivo. ¿Cómo ejecuta este comando contra todos los archivos de tipo .apk?
Bart
@bart mira mi respuesta de manera recursiva.
t1m0