Defina o controle de cache para todo o bucket S3 automaticamente (usando políticas de bucket?)


123

Preciso definir cabeçalhos de controle de cache para um bucket s3 inteiro, tanto arquivos existentes quanto futuros, e esperava fazer isso em uma política de bucket. Eu sei que posso editar os existentes e sei como especificá-los no local se eu mesmo carregá-los, mas infelizmente o aplicativo que os carrega não pode definir os cabeçalhos, pois usa s3fs para copiar os arquivos lá.

Respostas:


208

Agora existem três maneiras de fazer isso: por meio do AWS Console , da linha de comando ou da ferramenta de linha de comando s3cmd .


Instruções do console AWS

Esta agora é a solução recomendada. É simples, mas pode levar algum tempo.

  • Faça login no AWS Management Console
  • Vá para o balde S3
  • Selecione todos os arquivos por rota
  • Escolha "Mais" no menu
  • Selecione "Alterar metadados"
  • No campo "Chave", selecione "Cache-Control" no menu suspenso max-age = 604800Enter (7 dias) para Valor
  • Pressione o botão "Salvar"

( obrigado a @biplob - por favor, dê a ele um pouco de amor abaixo )


Solução de linha de comando AWS

Originalmente, quando criei este balde, as políticas eram proibidas, então descobri como fazê-lo usando o aws-cli, e é muito inteligente. Ao pesquisar, não consegui encontrar nenhum exemplo na natureza, então pensei em postar algumas das minhas soluções para ajudar os necessitados.

NOTA: Por padrão, o aws-cli copia apenas os metadados atuais de um arquivo, MESMO QUE VOCÊ ESPECIFICAR NOVOS METADADOS.

Para usar os metadados especificados na linha de comando, você precisa adicionar o sinalizador '--metadata-Directive REPLACE'. Aqui estão alguns exemplos.

Para um único arquivo

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 um intervalo inteiro (observe - sinalizador recursivo):

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

Descobri um pequeno problema, se você deseja aplicá-lo apenas a um tipo de arquivo específico, é necessário excluir todos os arquivos e incluir os que deseja.

Apenas jpgs e 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

Aqui estão alguns links para o manual se você precisar de mais informações:

Problemas conhecidos:

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

isso pode ser causado por um awscli desatualizado - veja a resposta de @eliotRosewater abaixo


Ferramenta S3cmd

S3cmd é uma "ferramenta de linha de comando para gerenciar serviços do Amazon S3 e do CloudFront". Embora essa solução exija um git pull, ela pode ser uma solução mais simples e abrangente.

Para obter instruções completas, consulte a postagem de @ ashishyadaveee11 abaixo


Espero que ajude!


6
Obrigado pelos exemplos reais de exatamente o que fazer. Eu estava tendo problemas para descobrir o que era possível apenas lendo os documentos.
— danneu

2
Estou recebendo "Opções desconhecidas: - diretiva de metadados, REPLACE" quando estou executando qualquer um dos comandos acima. Por favor, ajude-me.
— user3722785

1
Observe, AGORA HÁ UMA MANEIRA MAIS FÁCIL. Agora você pode alterar os metadados para TODOS os arquivos em um bucket por meio do AWS Console. Veja a resposta de CoderBoy abaixo: stackoverflow.com/a/47072736/2538952
— Martin Tschammer

1
Observe que usar --meta-Directive REPLACE sobrescreverá quaisquer metadados anteriores que não tenham sido copiados no comando! Por exemplo, "content-encoding gzip" será removido quando não for adicionado explicitamente ao comando cp.
— Harmen Janssen

1
Faz o cpdownload e reenvio de tudo?
— mlissner 01 de

37

Agora, ele pode mudar facilmente no console da AWS.

  • Faça login no AWS Management Console
  • Vá para o balde S3
  • Selecione todos os arquivos por rota
  • Escolha "Mais" no menu
  • Selecione "Alterar metadados"
  • No campo "Chave", selecione "Cache-Control" no menu suspenso
  • max-age = 604800Enter (7 dias) para valor
  • Pressione o botão "Salvar"

Demora para executar depende de seus arquivos de bucket. Refaça desde o início se você acidentalmente fechar o navegador.


6
O que significa "selecionar todos os arquivos por rota"?
— Tamzin Blake

1
Selecione todos / alguns arquivos do diretório que você deseja definir meta
— biplob

Desculpe pela resposta tardia. Não, não importa. Você deve configurá-lo em seu aplicativo.
— biplob de

Isso substitui os metadados anteriores ou adiciona a eles? (Não quero perder todos os meus tipos de conteúdo!)
— Chris

Acabei de confirmar que NÃO remove os valores existentes. Apenas define as chaves que você especificar (chave de substituição, se houver)
— rynop

21

passos

  1. git clone https://github.com/s3tools/s3cmd
  2. Executar s3cmd --configure (serão solicitadas as duas chaves - copie e cole do seu e-mail de confirmação ou da página da sua conta da Amazon. Tenha cuidado ao copiá-las! Elas diferenciam maiúsculas de minúsculas e devem ser digitadas com precisão ou você continuará recebendo erros sobre inválidos assinaturas ou similar. Lembre-se de adicionar s3:ListAllMyBucketspermissões às chaves ou você receberá um AccessDeniederro ao testar o acesso.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/

Super resposta. Obrigado! Existe uma maneira de atualizar SOMENTE aqueles que ainda não têm essa configuração de cabeçalho?
— PKHunter

Alguém tem uma solução semelhante para usar com o S3Express do Windows?
— Joe

12

Se minha pontuação de reputação fosse> 50, eu apenas comentaria. Mas (ainda) não é, então aqui está outra resposta completa.


Eu tenho batido minha cabeça neste problema há um tempo. Até que eu encontrei e li os documentos. Compartilhar isso aqui caso ajude mais alguém:

O que acabou funcionando de forma confiável para mim foi este comando. Eu escolhi um tempo de expiração de 1 segundo para teste para verificar os 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é necessário ao " cp" modificar metadados em um arquivo existente no S3
  • max-age define a idade do cache do navegador, em segundos
  • s-maxage define o cache do CloudFront, em segundos

Da mesma forma, se definir esses valores de cabeçalho Cache-Control em um arquivo durante o upload para S3, o comando ficaria assim:

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

8

Não acho que você possa especificar isso no nível do intervalo, mas existem algumas soluções alternativas para você.

  1. Copie o objeto para ele mesmo no S3, definindo os cache-controlcabeçalhos apropriados para a operação de cópia.

  2. Especifique os cabeçalhos de resposta no url dos arquivos . Você precisa usar urls pré-assinadas para que isso funcione, mas você pode especificar certos cabeçalhos de resposta na string de consulta, incluindo cache-controle expires. Para obter uma lista completa das opções disponíveis, consulte: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225


Obrigado Geoff, eu sabia sobre (1) mas não (2). Não é o que eu esperava (embora eu tema que não seja possível)
— thattommyhall

Você tem um comando AWS CLI de exemplo sobre como fazer o nº 1? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
— dpegasusm

3

Você sempre pode configurar um lambda com um gatilho em PUTOBJECT no S3, o lambda simplesmente mudará o cabeçalho deste objeto específico que acabou de ser colocado.

Em seguida, você pode executar o comando de cópia mencionado acima uma última vez, e todos os novos objetos serão corrigidos pelo lambda.

ATUALIZAR:

Este é um bom lugar para começar: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /


Você pode fornecer mais alguns detalhes sobre como fazer este lamba? Parece uma ótima solução.
— Wouter

1
@Wouter claro, encontrei um link que realmente pode ajudá-lo a chegar lá facilmente, aaronfagan.ca/blog/2017/… Se você precisar de qualquer ajuda ou suporte , ficarei feliz em ajudar.
— Ibrahim Bou Ncoula

Eu sei que isso é antigo, mas achei este recurso útil para o que eu estava procurando. Obrigado por isso. votos positivos para você, meu cara!
— castaway2000

1

Para aqueles que tentam usar a resposta de Dan e obtêm o erro:

"Opções desconhecidas: --metadata-diretiva, REPLACE"

Eu encontrei o problema, e o problema é que instalei o awscli usando

sudo apt-get install awscli

Isso instalou uma versão antiga do awscli que não tem o comando --metadata-Directive. Portanto, usei sudo apt-get remove awscli para removê-lo.

Em seguida, reinstalado seguindo o procedimento da amazon: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

A única diferença é que tive que usar sudo -H por causa de problemas de permissão que outras pessoas também podem ter.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.