Establecer el control de caché para todo el depósito de S3 automáticamente (¿utiliza políticas de depósito?)

123

Necesito establecer encabezados de control de caché para un depósito s3 completo, tanto los archivos existentes como los futuros, y esperaba hacerlo en una política de depósito. Sé que puedo editar los existentes y sé cómo especificarlos en el lugar si los subo yo mismo, pero desafortunadamente la aplicación que los carga no puede configurar los encabezados ya que usa s3fs para copiar los archivos allí.

Thattommyhall
fuente

Respuestas:

208

Ahora hay 3 formas de hacerlo: a través de la Consola de AWS , a través de la línea de comandos o mediante la herramienta de línea de comandos s3cmd .


Instrucciones de la consola de AWS

Esta es ahora la solución recomendada. Es sencillo, pero puede llevar algún tiempo.

  • Inicie sesión en la consola de administración de AWS
  • Entra en el depósito S3
  • Seleccionar todos los archivos por ruta
  • Elija "Más" en el menú
  • Seleccione "Cambiar metadatos"
  • En el campo "Clave", seleccione "Cache-Control" del menú desplegable max-age = 604800 Ingrese (7 días) para Valor
  • Presione el botón "Guardar"

( gracias a @biplob, por favor dale un poco de amor a continuación )


Solución de línea de comandos de AWS

Originalmente, cuando creé este depósito, las políticas no funcionaban, así que pensé cómo hacerlo usando aws-cli, y es bastante hábil. Al investigar, no pude encontrar ningún ejemplo en la naturaleza, así que pensé en publicar algunas de mis soluciones para ayudar a los necesitados.

NOTA: De forma predeterminada, aws-cli solo copia los metadatos actuales de un archivo, INCLUSO SI ESPECIFICAS NUEVOS METADATOS.

Para usar los metadatos que se especifican en la línea de comando, debe agregar la marca '--metadata-directive REPLACE'. A continuación se muestran algunos ejemplos.

Para un solo archivo

aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Para un depósito completo (nota: bandera recursiva):

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Un pequeño problema que encontré, si solo desea aplicarlo a un tipo de archivo específico, debe excluir todos los archivos y luego incluir los que desee.

Solo jpgs y pngs:

aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public

Aquí hay algunos enlaces al manual si necesita más información:

Problemas conocidos:

"Unknown options: --metadata-directive, REPLACE"

esto puede ser causado por un awscli desactualizado - vea la respuesta de @ eliotRosewater a continuación


Herramienta S3cmd

S3cmd es una "herramienta de línea de comandos para administrar los servicios de Amazon S3 y CloudFront". Si bien esta solución requiere un git pull, podría ser una solución más simple y completa.

Para obtener instrucciones completas, consulte la publicación de @ ashishyadaveee11 a continuación


¡Espero eso ayude!

Dan Williams
fuente
6
Gracias por los ejemplos reales de exactamente qué hacer. Estaba teniendo problemas para descubrir lo que era posible con solo leer los documentos.
danneu
2
Recibo "Opciones desconocidas: --metadata-directive, REPLACE" cuando estoy ejecutando cualquiera de los comandos anteriores. Por favor, ayúdame.
user3722785
1
Tenga en cuenta que AHORA HAY UNA MANERA MÁS FÁCIL. Ahora puede cambiar los metadatos de TODOS los archivos de un depósito a través de la consola de AWS. Vea la respuesta de CoderBoy a continuación: stackoverflow.com/a/47072736/2538952
Martin Tschammer
1
Tenga en cuenta que el uso de --meta-directive REPLACE sobrescribirá cualquier metadato anterior que no se haya copiado en el comando. Por ejemplo, "gzip de codificación de contenido" se eliminará cuando no se agregue explícitamente al comando cp.
Harmen Janssen
1
¿ cpDescarga y vuelve a cargar todo?
mlissner
37

Ahora, puede cambiar fácilmente desde la consola de AWS.

  • Inicie sesión en la consola de administración de AWS
  • Entra en el depósito S3
  • Seleccionar todos los archivos por ruta
  • Elija "Más" en el menú
  • Seleccione "Cambiar metadatos"
  • En el campo "Clave", seleccione "Cache-Control" en el menú desplegable
  • max-age = 604800 Ingrese (7 días) para Valor
  • Presione el botón "Guardar"

La ejecución lleva tiempo dependiendo de los archivos de su depósito. Vuelva a hacer desde el principio si cierra accidentalmente el navegador.

biplob
fuente
6
¿Qué significa "seleccionar todos los archivos por ruta"?
Tamzin Blake
1
Seleccione todos / algunos archivos del directorio que desea configurar meta
biplob
Lo siento por la respuesta tardía. No, no es así. Debe configurarlo desde su aplicación.
biplob
¿Esto reemplaza los metadatos anteriores o se suma a ellos? (¡No quiero perder todos mis tipos de contenido!)
Chris
Acabo de confirmar que NO elimina los valores existentes. Solo establece las claves que especifique (sobrescribiendo la clave si existe)
rynop
21

pasos

  1. git clone https://github.com/s3tools/s3cmd
  2. Ejecutar s3cmd --configure (se le pedirán las dos claves; cópielas y péguelas desde su correo electrónico de confirmación o desde la página de su cuenta de Amazon. ¡Tenga cuidado al copiarlas! Son sensibles a mayúsculas y minúsculas y deben ingresarse con precisión o seguirá recibiendo firmas o similar. Recuerde agregar s3:ListAllMyBucketspermisos a las claves o obtendrá un AccessDeniederror al probar el acceso.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
ashishyadaveee11
fuente
Super respuesta. ¡Gracias! ¿Hay alguna manera de actualizar SOLAMENTE aquellos que aún no tienen esta configuración de encabezado?
PKHunter
¿Alguien tiene una solución similar para usar con S3Express de Windows?
Joe
12

Si mi puntuación de reputación fuera> 50, solo comentaría. Pero no lo es (todavía), así que aquí tienes otra respuesta completa.


Me he estado golpeando la cabeza con este problema desde hace un tiempo. Hasta que encontré y leí los documentos. Compartiendo eso aquí en caso de que ayude a alguien más:

Lo que terminó funcionando de manera confiable para mí fue este comando. Elegí un tiempo de vencimiento de 1 segundo para las pruebas para verificar los resultados esperados:

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACEes necesario cuando " cp" se modifican los metadatos de un archivo existente en S3
  • max-age establece la antigüedad del almacenamiento en caché del navegador, en segundos
  • s-maxage establece el almacenamiento en caché de CloudFront, en segundos

Del mismo modo, si configura estos valores de encabezado de Cache-Control en un archivo mientras se carga a S3, el comando se vería así:

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /local/path/file \
  s3://bucket/path/file
roens
fuente
8

No creo que pueda especificar esto a nivel de depósito, pero hay algunas soluciones para usted.

  1. Copie el objeto a sí mismo en S3 configurando los cache-controlencabezados apropiados para la operación de copia.

  2. Especifique los encabezados de respuesta en la URL de los archivos . Necesita usar URL firmadas previamente para que esto funcione, pero puede especificar ciertos encabezados de respuesta en la cadena de consulta, incluidos cache-controly expires. Para obtener una lista completa de las opciones disponibles, consulte: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

Geoff Appleford
fuente
Gracias Geoff, sabía sobre (1) pero no (2). No es lo que había esperado (aunque me temo que no es posible)
llegará
¿Tiene un comando de la AWS CLI de ejemplo sobre cómo hacer el n. ° 1? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm
3

Siempre puede configurar una lambda con un disparador en PUTOBJECT en S3, la lambda simplemente cambiará el encabezado de este objeto en particular que acaba de colocar.

Luego, puede ejecutar el comando de copia mencionado anteriormente por última vez, y todos los objetos nuevos serán corregidos por lambda.

ACTUALIZAR:

Este es un buen lugar para comenzar: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /

Ibrahim Bou Ncoula
fuente
¿Puede darnos más detalles sobre cómo hacer esta lamba? Suena como una gran solución.
Wouter
1
@Wouter seguro, te encontré un enlace que realmente puede ayudarte a llegar fácilmente, aaronfagan.ca/blog/2017/… Si necesitas ayuda o apoyo, estaré más que feliz de ayudarte.
Ibrahim Bou Ncoula
Sé que esto es antiguo, sin embargo, encontré que este recurso es útil para lo que estaba buscando. gracias por esto. votos a favor para ti mi amigo!
castaway2000
1

Para aquellos que intentan usar la respuesta de Dan y obtienen el error:

"Opciones desconocidas: --metadata-directive, REPLACE"

Me encontré con el problema, y ​​el problema fue que instalé awscli usando

sudo apt-get install awscli

Esto instaló una versión antigua de awscli a la que le falta el comando --metadata-directive. Así que usé sudo apt-get remove awscli para eliminarlo.

Luego reinstale siguiendo el procedimiento de Amazon: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

La única diferencia es que tuve que usar sudo -H debido a problemas de permisos que otros podrían encontrar también.

EliotRosewater
fuente