Cambiar recursivamente el tipo de contenido de los archivos de una extensión determinada en Amazon S3

Cambiar recursivamente el tipo de contenido de los archivos de una extensión determinada en Amazon S3

Tengo un depósito S3 grande con una estructura de "carpetas" anidadas que contiene (entre otras cosas) archivos estáticos .json y .md. S3 entrega estos archivos en text/plainlugar de los correctos 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 de los archivos que coinciden con una determinada extensión?

Respuesta1

A continuación se muestra 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/

Respuesta2

Después de investigar un poco, descubrí que la s3cmdherramienta puede hacer esto. Por ejemplo, para configurar archivos JSON en aplicación/json:

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

Respuesta3

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

Aquí esta ladocumentaciónpara s3api.

No hace falta decir que debes probar esto primero, antes de ejecutarlo de forma recursiva en todo tu depósito.

Respuesta4

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

Estoy poniendo esto aquí porque a veces querrás iterar sobre nombres de archivos 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

información relacionada