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.