Crie o AWS CloudFront no modelo Pay-as-You-Go (não no Plano Gratuito).

Crie CloudFront sob demanda via AWS CLI.

Conteúdo da página

O plano gratuito da AWS não está funcionando para mim e Pay-as-you-go está oculto para novas Distribuições do CloudFront no Console da AWS.

Quando você hospeda sites baseados em Hugo na AWS, normalmente coloca o bucket atrás do CloudFront e anexa uma função Lambda@Edge para que as solicitações de caminhos de diretório (por exemplo, /blog/) sejam reescritas para /blog/index.html para origens no estilo de site S3. Em seguida, você pode usar hugo deploy ou implantar com o AWS CLI para sincronizar o site compilado. Para implantações automatizadas, você também pode usar Gitea Actions. O problema: você precisa de uma distribuição CloudFront que use aquele Lambda e, se quiser evitar compromissos de planos de taxa fixa, pagamento conforme o uso (pay-as-you-go). O console não permite mais escolher isso – apenas planos Free ou Pro.

Documentação não corresponde às entregas reais da fonte

Este post mostra como criar uma distribuição pay-as-you-go reutilizando a configuração de uma distribuição existente via AWS CLI e os scripts na pasta scripts deste artigo.

Para mais tópicos de infraestrutura web, veja o cluster de infraestrutura web.

Quando o console oferece apenas Free ou Pro

A Amazon introduziu planos de preços de taxa fixa do CloudFront (Free, Pro, Business, Premium) que agrupam o CDN com WAF, proteção DDoS, Route 53 e outros serviços por um preço mensal fixo sem excedentes. No console do CloudFront, ao criar uma nova distribuição, você agora vê apenas as opções de planos Free ou Pro (e superiores). O plano Pro começa em US$ 15/mês; não há opção visível de “pay-as-you-go” ali.

Pay-as-you-go ainda é o padrão ao criar uma distribuição através da API do CloudFront ou AWS CLI (create-distribution). Então, se você já tem uma distribuição criada anteriormente (ou via CLI) e quer outra com o mesmo comportamento – por exemplo, origem do site S3 mais Lambda@Edge para index.html – você pode exportar a configuração dessa distribuição, ajustá-la e criar uma nova distribuição. A nova será pay-as-you-go a menos que você a anexe a um plano de taxa fixa posteriormente.

O que você precisa

  • Uma distribuição CloudFront existente cuja configuração você possa copiar (por exemplo, uma usada para outro site Hugo, ou uma criada antes da mudança do console).
  • AWS CLI instalado e configurado com credenciais que possam executar cloudfront:GetDistributionConfig e cloudfront:CreateDistribution.
  • jq (ou similar) para editar a configuração JSON.

Os scripts de exemplo usados abaixo vivem na pasta scripts deste post: current-distribution-config.json, new-distribution-config.json, updated-distribution-config.json e final-distribution-config.json.

Etapa 1: Obter a configuração da distribuição existente

Obtenha a configuração completa da distribuição (incluindo ETag) e salve:

# Substitua ABCDEFG pelo ID da sua distribuição existente
aws cloudfront get-distribution-config --id ABCDEFG > current-distribution-config.json

get-distribution-config retorna um objeto wrapper com ETag e DistributionConfig. Para criar uma nova distribuição, você passa apenas o DistributionConfig interno, então o extraímos:

jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json

Neste ponto, new-distribution-config.json parece o seguinte (abreviado). Inclui CallerReference, Aliases, Origins, DefaultRootObject e DefaultCacheBehavior com Lambda@Edge. Para o domínio do site de exemplo, coloquei micro.com:

{
  "CallerReference": "8b2b19eb-6d41-4fc0-8d04-a1313e23e2d7",
  "Aliases": {
    "Quantity": 1,
    "Items": ["micro.com"]
  },
  "DefaultRootObject": "index.html",
  "Origins": {
    "Quantity": 1,
    "Items": [
      {
        "Id": "micro.com.s3.us-west-2.amazonaws.com",
        "DomainName": "micro.com.s3-website-us-west-2.amazonaws.com",
        "OriginPath": "",
        "CustomOriginConfig": {
          "HTTPPort": 80,
          "HTTPSPort": 443,
          "OriginProtocolPolicy": "http-only"
        }
      }
    ]
  },
  "DefaultCacheBehavior": {
    "TargetOriginId": "micro.com.s3.us-west-2.amazonaws.com",
    "ViewerProtocolPolicy": "redirect-to-https",
    "LambdaFunctionAssociations": {
      "Quantity": 1,
      "Items": [
        {
          "LambdaFunctionARN": "arn:aws:lambda:us-east-1:...your-lambda-arn",
          "EventType": "origin-request",
          "IncludeBody": false
        }
      ]
    }
  }
}

Etapa 2: Definir um CallerReference único

Cada distribuição deve ter um CallerReference único. Reutilizar o mesmo valor de outra distribuição faz com que a API rejeite a solicitação. Use uma nova string ou um timestamp:

NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json

Etapa 3: Ajustar aliases e origens (opcional)

Se o novo site usar um domínio ou bucket S3 diferente, atualize Aliases e Origins em updated-distribution-config.json para corresponder (por exemplo, novo endpoint de site bucket e lista de aliases). Se você quiser uma distribuição sem um domínio personalizado por agora, limpe os aliases:

jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json

Se você precisar apontar para um endpoint de site S3 diferente, edite a seção Origins no mesmo arquivo (por exemplo, altere Id e DomainName para o hostname do site do novo bucket e defina DefaultCacheBehavior.TargetOriginId para aquele mesmo Id).

Etapa 4: Criar a nova distribuição

Crie a distribuição a partir da configuração final:

aws cloudfront create-distribution --distribution-config file://final-distribution-config.json

A resposta inclui o Id, ARN, DomainName e Status da nova distribuição. A nova distribuição usa preços pay-as-you-go por padrão. Você pode então apontar seu DNS (ou Route 53) para o novo domínio CloudFront e, se usá-lo para Hugo, implantar com Hugo deploy ou AWS CLI como de costume.

Referência rápida: script completo

Colado junto (usando um ID de distribuição existente e limpando aliases), o fluxo é:

# 1) Exportar e extrair DistributionConfig
aws cloudfront get-distribution-config --id EABCDEFGZ > current-distribution-config.json
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json

# 2) CallerReference único
NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json

# 3) Opcional: sem domínio personalizado
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json

# 4) Criar distribuição (pay-as-you-go)
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json

Pay-as-you-go vs taxa fixa (resumo)

  • Pay-as-you-go: Você paga pela transferência de dados de saída e solicitações; a camada gratuita perpétua do CloudFront inclui 1 TB de transferência de dados e 10 milhões de solicitações HTTP/HTTPS por mês. Sem taxa mensal do plano.
  • Planos de taxa fixa: Documentados aqui. O plano Free tem limites menores (por exemplo, 1 milhão de solicitações, 100 GB); o Pro começa em US$ 15/mês com mais capacidade e WAF, Route 53, etc., agrupados. Sem excedentes.

Se seu tráfice couber dentro da camada gratuita pay-as-you-go e você não precisar das funcionalidades agrupadas de taxa fixa, criar distribuições via CLI como acima mantém você em pay-as-you-go enquanto o console mostra apenas Free/Pro.

Assinar

Receba novos artigos sobre sistemas, infraestrutura e engenharia de IA.