Pregunta Establezca el control de caché para el depósito S3 completo de forma automática (¿utilizando políticas de depósito?)


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


75
2018-05-03 16:15


origen


Respuestas:


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


Instrucciones de la consola AWS

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

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

(gracias a @CoderBoy - por favor, dale algo de amor debajo)


Solución de línea de comandos de AWS

Originalmente, cuando creé este cubo, las políticas eran un no ir, 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 ESPECIFICA METADATOS NUEVOS. 

Para usar los metadatos que se especifican en la línea de comandos, debe agregar el indicador '--metadata-directive REPLACE'. Aquí hay 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 cubo completo (nota - bandera de respuesta):

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

Encontré un poco, si solo quieres aplicarlo a un tipo de archivo específico, debes excluir todos los archivos, y luego incluir los que quieras.

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 obsoleto - ver @ 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 instrucciones completas, vea la publicación de @ ashishyadaveee11 a continuación


¡Espero eso ayude!


120
2018-03-26 14:13



pasos

  1. git clone https://github.com/s3tools/s3cmd
  2. correr s3cmd --configure  (Se le solicitarán las dos claves: cópielas y péguelas de su correo electrónico de confirmación o desde la página de su cuenta de Amazon. Ten cuidado cuando copiándolos! Son sensibles a mayúsculas y deben ingresarse con precisión o seguirás recibiendo errores sobre firmas no válidas o similares. Recuerde agregar s3:ListAllMyBuckets permisos a las teclas o obtendrá un AccessDenied error al probar el acceso.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/

18
2018-02-04 13:27



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

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

Lleva tiempo ejecutar depende de tus archivos de cubetas. Rehaga desde el principio si cierra accidentalmente el navegador.


11
2017-11-02 10:17



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

  1. Copia el objeto a sí mismo en S3 configurando el apropiado cache-control encabezados para la operación de copia.

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


7
2018-05-04 08:28



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


He estado golpeando mi cabeza en 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 expiración 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 REPLACE es requerido cuando "cp"modificación de metadatos en un archivo existente en S3
  • max-age establece la edad de almacenamiento en caché del navegador, en segundos
  • s-maxage configura el almacenamiento en caché de CloudFront, en segundos

Del mismo modo, si establece estos valores de encabezado de control de caché en un archivo mientras se carga en 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

4
2018-02-01 21:53



Para aquellos que intentan usar la respuesta de Dan y obtener 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 anterior del awscli al que le falta el comando --metadata-directive. Así que utilicé sudo apt-get remove awscli para eliminarlo.

Luego reinstalado 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 con los que otros podrían toparse también.


1
2017-10-16 21:11



Siempre puedes configurar una lambda con un disparador en PUTOBJECT en S3, la lambda simplemente cambiará el encabezado de este objeto en particular que acabamos de poner.

Luego puede ejecutar el comando de copia mencionado anteriormente una última vez, y todos los objetos nuevos serán arreglados por el 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/


1
2018-06-03 21:35