amazon web services home Force a distribuição do arquivo/distribuição do CloudFront




https console aws amazon com cloudfront home region us east 1 (10)

Eu estou usando o CloudFront da Amazon para servir arquivos estáticos dos meus aplicativos da web.

Não há como dizer a uma distribuição em cloudfront que ela precisa atualizar seu arquivo ou apontar um único arquivo que deve ser atualizado?

A Amazon recomenda que você edite seus arquivos como logo_1.gif, logo_2.gif e assim por diante, como uma solução alternativa para esse problema, mas isso parece uma solução bastante estúpida. Não há absolutamente nenhum outro caminho?


a invalidação de suporte atual do AWS CLI no modo de visualização. Execute o seguinte no seu console uma vez:

aws configure set preview.cloudfront true

Eu implantar meu projeto da web usando npm. Eu tenho os seguintes scripts no meu package.json :

{
    "build.prod": "ng build --prod --aot",
    "aws.deploy": "aws s3 sync dist/ s3://www.mywebsite.com --delete --region us-east-1",
    "aws.invalidate": "aws cloudfront create-invalidation --distribution-id [MY_DISTRIBUTION_ID] --paths /",
    "deploy": "npm run build.prod && npm run aws.deploy && npm run aws.invalidate"
}

Com os scripts acima, você pode implantar seu site com:

npm run deploy

O Bucket Explorer tem uma interface do usuário que facilita bastante isso agora. Veja como:

Clique com o botão direito no seu balde. Selecione "Gerenciar distribuições".
Clique com o botão direito na sua distribuição. Selecione "Obter lista de invalidação da Cloudfront". Em seguida, selecione "Criar" para criar uma nova lista de invalidação. Selecione os arquivos a serem invalidados e clique em "Invalidar". Aguarde 5-15 minutos.


Em rubi, usando a gema de nevoeiro

AWS_ACCESS_KEY = ENV['AWS_ACCESS_KEY_ID']
AWS_SECRET_KEY = ENV['AWS_SECRET_ACCESS_KEY']
AWS_DISTRIBUTION_ID = ENV['AWS_DISTRIBUTION_ID']

conn = Fog::CDN.new(
    :provider => 'AWS',
    :aws_access_key_id => AWS_ACCESS_KEY,
    :aws_secret_access_key => AWS_SECRET_KEY
)

images = ['/path/to/image1.jpg', '/path/to/another/image2.jpg']

conn.post_invalidation AWS_DISTRIBUTION_ID, images

mesmo com a invalidação, ainda leva de 5 a 10 minutos para a invalidação processar e atualizar em todos os servidores de borda da Amazon


Basta postar para informar qualquer pessoa que esteja visitando essa página (primeiro resultado em 'Atualização de arquivo em nuvem') de que há um invalidador on-line de fácil acesso + disponível em swook.net

Este novo invalidador é:

  • Totalmente online (sem instalação)
  • Disponível 24x7 (hospedado pelo Google) e não requer nenhuma associação.
  • Há suporte a histórico e verificação de caminhos para permitir que você invalide seus arquivos com facilidade. (Muitas vezes com apenas alguns cliques depois de invalidar pela primeira vez!)
  • Também é muito seguro, como você descobrirá ao ler seu post de lançamento .

Divulgação completa: eu fiz isso. Diverta-se!



A partir de 19 de março, a Amazon agora permite que o TTL do cache do Cloudfront seja de 0 segundos, assim você (teoricamente) nunca deve ver objetos obsoletos. Portanto, se você tiver seus recursos no S3, basta acessar o AWS Web Panel => S3 => Editar propriedades => Metadados e, em seguida, definir seu valor de "Cache-Control" como "max-age = 0".

Isso é direto da documentação da API :

Para controlar se o CloudFront armazena em cache um objeto e por quanto tempo, recomendamos que você use o cabeçalho Cache-Control com a diretiva max-age =. O CloudFront armazena em cache o objeto para o número especificado de segundos. (O valor mínimo é 0 segundos.)


Se você tem boto instalado (que não é apenas para python, mas também instala um monte de utilitários de linha de comando úteis), ele oferece um utilitário de linha de comando especificamente chamado cfadmin ou 'cloud front admin' que oferece a seguinte funcionalidade:

Usage: cfadmin [command]
cmd - Print help message, optionally about a specific function
help - Print help message, optionally about a specific function
invalidate - Create a cloudfront invalidation request
ls - List all distributions and streaming distributions

Você invalida as coisas executando:

$sam# cfadmin invalidate <distribution> <path>

Boas notícias. A Amazon finalmente adicionou um Recurso de Invalidação. Veja a referência da API .

Esta é uma solicitação de amostra da referência da API:

POST /2010-08-01/distribution/[distribution ID]/invalidation HTTP/1.0
Host: cloudfront.amazonaws.com
Authorization: [AWS authentication string]
Content-Type: text/xml

<InvalidationBatch>
   <Path>/image1.jpg</Path>
   <Path>/image2.jpg</Path>
   <Path>/videos/movie.flv</Path>
   <CallerReference>my-batch</CallerReference>
</InvalidationBatch>

Uma maneira muito fácil de fazer isso é o versionamento de FOLDER.

Então, se seus arquivos estáticos são centenas, por exemplo, basta colocar todos eles em uma pasta chamada por ano + versionamento.

por exemplo eu uso uma pasta chamada 2014_v1 onde dentro eu tenho todos os meus arquivos estáticos ...

Então dentro do meu HTML eu sempre coloco a referência na pasta. (claro que eu tenho um PHP que inclui onde eu defini o nome da pasta.) Então mudando em 1 arquivo ele realmente muda em todos os meus arquivos PHP.

Se eu quiser uma atualização completa, basta renomear a pasta para 2014_v2 na minha fonte e alterar dentro do php include para 2014_v2

todo o HTML muda automaticamente e pergunta o novo caminho, o cache MISS do cloudfront e o solicita à fonte.

Exemplo: SOURCE.mydomain.com é minha fonte, cloudfront.mydomain.com é CNAME para distribuição em cloudfront.

Então o PHP chamou este arquivo cloudfront.mydomain.com/2014_v1/javascript.js e quando eu quero uma atualização completa, simplesmente eu renomeio a pasta para a fonte para "2014_v2" e eu mudo o PHP incluindo configurando a pasta para "2014_v2" .

Assim não há demora para invalidação e sem custo!

Este é o meu primeiro post no , espero que eu tenha feito isso bem!


Configuração de atualização automatizada em 5 minutos

Ok pessoal. A melhor maneira possível de executar a atualização automática do CloudFront (invalidação) é criar uma função do Lambda que será acionada sempre que qualquer arquivo for carregado no bucket do S3 (um novo ou reescrito).

Mesmo que você nunca tenha usado funções lambda antes, é realmente fácil - basta seguir minhas instruções passo a passo e levará apenas 5 minutos:

Passo 1

Vá para https://console.aws.amazon.com/lambda/home e clique em Criar uma função lambda

Passo 2

Clique na função Blank (custom)

etapa 3

Clique na caixa vazia (stroked) e selecione S3 from combo

Passo 4

Selecione seu bucket (o mesmo que para a distribuição do CloudFront)

Passo 5

Definir um tipo de evento para "Objeto criado (todos)"

Passo 6

Defina o prefixo e o sufixo ou deixe-o vazio se você não souber o que é.

Passo 7

Marque a caixa de seleção Ativar gatilho e clique em Avançar

Passo 8

Nomeie sua função (algo como: YourBucketNameS3ToCloudFrontOnCreateAll )

Passo 9

Selecione Python 2.7 (ou posterior) como tempo de execução

Passo 10

Cole o seguinte código em vez do código python padrão:

from __future__ import print_function

import boto3
import time

def lambda_handler(event, context):
    for items in event["Records"]:
        path = "/" + items["s3"]["object"]["key"]
        print(path)
        client = boto3.client('cloudfront')
        invalidation = client.create_invalidation(DistributionId='_YOUR_DISTRIBUTION_ID_',
            InvalidationBatch={
            'Paths': {
            'Quantity': 1,
            'Items': [path]
            },
            'CallerReference': str(time.time())
            })

Passo 11

Abra https://console.aws.amazon.com/cloudfront/home em uma nova guia do navegador e copie seu ID de distribuição do CloudFront para usar na próxima etapa.

Passo 12

Retorne à guia lambda e cole seu ID de distribuição em vez de _YOUR_DISTRIBUTION_ID_ no código Python. Continue circulando aspas.

Etapa 13

Definir manipulador : lambda_function.lambda_handler

Passo 14

Clique na caixa de combinação da função e selecione Criar uma função personalizada . Nova aba no navegador será aberta.

Etapa 15

Clique em visualizar documento de política , clique em editar , clique em OK e substitua a definição de função pelo seguinte (como está):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
          "cloudfront:CreateInvalidation"
      ],
      "Resource": [
          "*"
      ]
    }
  ]
}

Passo 16

Clique em permitir . Isso irá retornar você para um lambda. Verifique se o nome da função que você acabou de criar está selecionado na combobox Existing role .

17º passo

Defina Memória (MB) para 128 e Tempo Limite para 5 seg.

Passo 18

Clique em Avançar e , em seguida, clique em Criar função

19º passo

Você está pronto para ir! Agora, cada vez que você fizer upload / recarregar qualquer arquivo para o S3, ele será avaliado em todos os locais do CloudFront Edge.

PS - quando você está testando, verifique se o seu navegador está carregando imagens do CloudFront, não do cache local.

PSS - Por favor, note que apenas a primeira invalidação de 1000 arquivos por mês é gratuita, cada invalidação acima do limite custa $ 0,005 USD. Também podem ser aplicadas taxas adicionais para a função Lambda, mas é extremamente barato.





amazon-cloudfront