Pregunta Sin encabezado de control de caché para archivos de AWS CloudFront con S3 Origin


Acabamos de migrar a Amazon AWS. Actualmente tenemos una instancia de EC2 que está funcionando bien. Se está ejecutando Nginx al frente y Apache en el back-end. Eso está funcionando bien también. Todos los sitios se inician correctamente e incluyen el encabezado Cache-Control para los archivos que se sirven desde el EC2.

El problema es con TODOS los archivos estáticos que colocamos en Amazon S3 que se accede a través de CloudFront CDN. Podemos acceder a los archivos bien (y no hay problema con CORS), pero aparentemente CloudFront no sirve archivos con encabezado Cache-Control. Queremos aprovechar el almacenamiento en caché del navegador.

De la forma en que lo veo, la instancia de EC2 no desempeña un papel aquí, ya que los archivos estáticos están siendo atendidos directamente por S3 + CloudFront, la solicitud no va al servidor web en EC2.

Estoy completamente perdido.

Pregunta: 1) ¿Cómo configuro el Cache-Control en este caso? 2) ¿Es posible configurar el Cache-Control? ¿Desde S3 o CloudFront?

Nota: He llegado a algunas páginas en Google, donde puede configurar el encabezado en S3 para objetos individuales. Realmente no es una forma productiva de hacerlo especialmente ya que en mi caso estamos hablando de varios objetos.

¡Gracias!


20
2018-04-14 12:32


origen


Publique una URL para un objeto en S3 y la URL de CloudFront aplicable. Me gustaría ver el comportamiento que me describes. Alternativamente publicar CURLs para ambos, mostrando los encabezados. - Tim
He podido agregar un encabezado personalizado "Expires: Sun, 15 Oct 2027 13:46:07 GMT" editando el origen en console.aws.amazon.com/cloudfront/home. Sin embargo, no parece funcionar. ¿Cómo lo hiciste finalmente? - Manolo


Respuestas:


He llegado a unas pocas páginas en Google donde puede configurar el encabezado en S3 para objetos individuales. Realmente no es una forma productiva de hacerlo especialmente ya que en mi caso estamos hablando de varios objetos.

Bueno, "productivo" o no, así es como está diseñado para funcionar.

CloudFront no lo hace añadir  Cache-Control: encabezados

CloudFront atravesar  (y también respeta, a menos que se configure lo contrario) la Cache-Control: encabezados proporcionados por el servidor de origen, que en este caso es S3.

Llegar Cache-Control: los encabezados proporcionados por S3 cuando se busca un objeto, deben proporcionarse cuando el objeto se carga en S3, o se agregan a los metadatos del objeto mediante una operación posterior de poner + copiar, que se puede usar para copiar internamente un objeto en sí mismo en S3, Modificando los metadatos en el proceso. Esto es lo que hace la consola, detrás de escena, si edita metadatos de objetos.

Tampoco existe (en caso de que se lo pregunte) ninguna configuración global en S3 para forzar a todos los objetos en un grupo a devolver estos encabezados, es un atributo por objeto.


Actualizar:  Lambda @ Edge es una nueva característica en CloudFront que le permite disparar activadores contra solicitudes y / o respuestas, entre el visor y el caché y / o caché y origen, ejecutando el código escrito en Node.js contra una estructura simple de objeto de solicitud / respuesta expuesta por CloudFront.

Una de las aplicaciones principales para esta función es la manipulación de encabezados ... así que mientras lo anterior sigue siendo preciso, CloudFront no agrega Cache-Control - ahora es posible que una función Lambda los agregue a la respuesta que devuelve CloudFront.

Este ejemplo agrega Cache-Control: public, max-age=86400 solo si no hay Cache-ControlEncabezado ya presente en la respuesta.

El uso de este código en un activador de respuesta de origen provocaría que se activara cada vez que CloudFront recupera un objeto desde el origen y modifica la respuesta antes de que CloudFront lo almacene en caché.

'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    if(!response.headers['cache-control'])
    {
        response.headers['cache-control'] = [{ 
            key:   'Cache-Control', 
            value: 'public, max-age=86400' 
        }];
    }

    callback(null, response);
};

Actualizar (2018-06-20): Recientemente, envié una solicitud de función al equipo de CloudFront para permitir la configuración del origen estático respuesta Los encabezados como atributos de origen, similar a la forma estática. solicitud los encabezados pueden agregarse ahora ... pero con un giro, permitiendo que cada encabezado se configure para agregarse condicionalmente (solo si el origen no proporcionó ese encabezado en la respuesta) o incondicionalmente (agregando el encabezado y sobrescribiendo el encabezado desde luego origen, si está presente).

Con las solicitudes de características, por lo general, no recibe ninguna confirmación de si realmente están considerando implementar la nueva función ... o incluso de que ya hayan estado trabajando en ella ... se acaba de anunciar cuando terminen. Por lo tanto, no tengo idea de si estos serán implementados. Se debe argumentar que, dado que esta capacidad ya está disponible a través de Lambda @ Edge, no es necesario en la funcionalidad básica ... pero mi argumento contrario es que la base no está funcionalmente completa sin la capacidad de realice una manipulación de encabezado de respuesta simple y estática, y si esta es la única razón por la que se necesita un desencadenante, entonces requerir desencadenadores Lambda es un costo innecesario, financieramente y en latencia adicional (aunque ninguno es necesariamente un costo extravagante).


22
2018-04-15 00:49



Aunque sigue siendo molesto. - Erica Kane
stackoverflow.com/a/30225271/846727 - TADA !! - Kunal
Tada, de hecho, @Kunal. Ese es un ejemplo de lo que mencioné en la respuesta como "añadido a los metadatos del objeto mediante una operación de copia + puesta posterior". Úsalo con precaución, y prueba, porque hay advertencias. Se restablecerán todas sus marcas de datos y pueden tener implicaciones para el cifrado. También puede cambiar las etiquetas de objeto de multiparte a formato de parte única, que es un algoritmo diferente, y confundirá cualquier sistema que haya almacenado las etiquetas en otro lugar para futuras verificaciones de integridad. Si el control de versiones está habilitado en el depósito, su costo de almacenamiento se duplica a menos que limpie las versiones anteriores. - Michael - sqlbot
El nuevo servicio Lambda @ Edge ahora también proporciona un mecanismo que permite agregar encabezados de respuesta de Cache-Control (entre otros) sobre la marcha. He actualizado la respuesta con un ejemplo práctico de cómo se puede hacer eso. - Michael - sqlbot
@Broshi la "política de confianza" del rol debe incluir los servicios lambda y edgelambda. Echa un vistazo a docs.aws.amazon.com/lambda/latest/dg/…. - Michael - sqlbot