Nenhum cabeçalho de controle de cache para arquivos do AWS CloudFront com origem S3

27

Acabamos de migrar para o Amazon AWS. Atualmente, temos uma instância do EC2 que está funcionando bem. Está executando o Nginx na frente e o Apache no back-end. Está funcionando bem também. Todos os sites são iniciados corretamente e incluem o cabeçalho de controle de cache para arquivos servidos no EC2.

O problema está em TODOS os arquivos estáticos que colocamos no Amazon S3 que estão sendo acessados ​​por meio do CloudFront CDN . Podemos acessar os arquivos corretamente (e não há problema com o CORS), mas aparentemente o CloudFront não serve arquivos com o cabeçalho de controle de cache. Queremos aproveitar o cache do navegador.

Do meu ponto de vista, a instância do EC2 não desempenha um papel aqui, pois os arquivos estáticos estão sendo atendidos diretamente pelo S3 + CloudFront, a solicitação não vai para o servidor Web no EC2.

Estou completamente perdido.

Pergunta: 1) Como defino o Cache-Control neste caso? 2) É possível definir o controle de cache? Do S3 ou CloudFront?

Nota: Encontrei algumas páginas no Google onde é possível definir o cabeçalho no S3 para objetos individuais. Essa não é realmente uma maneira produtiva de fazer isso, especialmente porque, no meu caso, estamos falando de vários objetos.

Obrigado!

jarvis
fonte
Poste um URL para um objeto no S3 e o URL aplicável do CloudFront. Eu gostaria de ver o comportamento que você me descreve. Como alternativa, poste CURLs para ambos, mostrando os cabeçalhos.
Tim
Consegui adicionar um cabeçalho personalizado "Expira: Dom, 15 de outubro de 2027 13:46:07 GMT" editando a origem em console.aws.amazon.com/cloudfront/home . No entanto, parece não funcionar. Como você finalmente fez isso?
Manolo

Respostas:

31

Encontrei algumas páginas no Google onde é possível definir o cabeçalho no S3 para objetos individuais. Essa não é realmente uma maneira produtiva de fazer isso, especialmente porque, no meu caso, estamos falando de vários objetos.

Bem, "produtivo" ou não, é assim que ele é projetado para funcionar.

O CloudFront não adiciona Cache-Control: cabeçalhos.

O CloudFront passa (e também respeita, a menos que seja configurado de outra forma) os Cache-Control:cabeçalhos fornecidos pelo servidor de origem, que neste caso é S3.

Para obter Cache-Control:cabeçalhos fornecidos pelo S3 quando um objeto é buscado, eles devem ser fornecidos quando o objeto é carregado no S3 ou adicionados aos metadados do objeto por uma operação put + copy subsequente, que pode ser usada para copiar internamente um objeto em si. S3, modificando os metadados no processo. É isso que o console faz, nos bastidores, se você editar os metadados do objeto.

Também não há (no caso de você estar se perguntando) nenhuma configuração global no S3 para forçar todos os objetos em um bucket a retornar esses cabeçalhos - é um atributo por objeto.


Atualização: O Lambda @ Edge é um novo recurso do CloudFront que permite disparar gatilhos contra solicitações e / ou respostas, entre visualizador e cache e / ou cache e origem, executando o código escrito no Node.js em uma estrutura simples de objeto de solicitação / resposta exposto pelo CloudFront.

Uma das principais aplicações desse recurso é a manipulação de cabeçalhos ... portanto, enquanto o que precede ainda é preciso - o próprio CloudFront não adiciona Cache-Control- agora é possível que uma função Lambda os adicione à resposta retornada do CloudFront.

Este exemplo é adicionado Cache-Control: public, max-age=86400apenas se ainda não houver Cache-Controlcabeçalho presente na resposta.

O uso desse código em um gatilho de resposta à origem faria com que ele disparasse toda vez que o CloudFront buscar um objeto na origem e modifique a resposta antes que o CloudFront o armazene em cache.

'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);
};

Atualização (20/06/2018): Recentemente, enviei uma solicitação de recurso à equipe do CloudFront para permitir a configuração de cabeçalhos de resposta de origem estática como atributos de origem, semelhante à forma como os cabeçalhos de solicitação estática podem ser adicionados, agora ... mas com um twist, permitindo que cada cabeçalho seja configurado para ser adicionado condicionalmente (somente se a origem não forneceu esse cabeçalho na resposta) ou incondicionalmente (adicionando o cabeçalho e substituindo o cabeçalho da origem, se presente).

Com solicitações de recursos, você normalmente não recebe nenhuma confirmação sobre se eles estão realmente pensando em implementar o novo recurso ... ou mesmo se eles já podem estar trabalhando nele ... é anunciado apenas quando terminar. Então, eu não tenho idéia se estes serão implementados. Existe um argumento a ser argumentado que, como esse recurso já está disponível via Lambda @ Edge, não há necessidade dele na funcionalidade base ... mas meu contra-argumento é que a base funcionalmente não é funcionalmente completa sem a capacidade de faça manipulação simples e estática do cabeçalho de resposta e que, se esse for o único motivo para o acionamento, exigir o acionamento do Lambda é um custo desnecessário, financeiramente e com maior latência (mesmo que nenhum seja necessariamente um custo estranho).

Michael - sqlbot
fonte
Ainda é irritante.
Erica Kane
11
Tada, de fato, @Kunal. Esse é um exemplo do que me referi na resposta como "adicionado aos metadados do objeto por uma operação posterior de colocar + copiar". Use-o com cuidado e teste, porque existem advertências. Ele redefinirá todos os seus carimbos de dados e pode ter implicações na criptografia. Ele também pode alterar as marcações etags dos objetos de formato de várias partes para o formato de peça única, que é um algoritmo diferente, e confundirá qualquer sistema que tenha armazenado as marcações etags em outro local para futuras verificações de integridade. Se a versão estiver ativada no bucket, seu custo de armazenamento dobrará, a menos que você limpe as versões antigas.
Michael - sqlbot
11
The new Lambda@Edge service now also provides a mechanism that does allow Cache-Control response headers (among others) to be added on-the-fly. I've updated the answer with a working example of how that can be done.
Michael - sqlbot
11
@Broshi, a "política de confiança" da função precisa listar os serviços lambda e edgelambda. Dê uma olhada em docs.aws.amazon.com/lambda/latest/dg/… .
Michael - sqlbot