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=86400
apenas se ainda não houver Cache-Control
cabeç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).