Crie um AWS CloudFront no modelo Pay-as-You-Go (não no Plano Grátis)
Crie um CloudFront pay-as-you-go via AWS CLI.
O plano gratuito da AWS não está funcionando para mim e
Pay-as-you-go está oculto para novas distribuições CloudFront no console da AWS.
Quando você hosta sites baseados em Hugo na AWS, normalmente coloca o bucket atrás do CloudFront e anexa uma função Lambda@Edge para que solicitações a caminhos de diretório (por exemplo, /blog/) sejam reescritas para /blog/index.html para origens de site da S3. Depois disso, você pode usar hugo deploy ou implantar com o AWS CLI para sincronizar o site construído. O problema: você precisa de uma distribuição CloudFront que use essa Lambda e, se quiser evitar compromissos com planos de tarifa fixa, pay-as-you-go. O console agora não permite que você escolha apenas planos gratuitos ou premium.

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 no diretório scripts deste artigo.
Quando o console oferece apenas planos gratuitos ou premium
A Amazon introduziu planos de tarifa fixa para o CloudFront (gratuito, premium, empresarial, premium) que agrupam o CDN com WAF, proteção contra DDoS, Route 53 e outros serviços para um preço fixo mensal sem cobranças extras. No console do CloudFront, quando você cria uma nova distribuição, agora vê apenas opções de planos gratuitos ou premium (e superiores). O plano premium começa em $15/mês; não há opção visível de pay-as-you-go lá.
Pay-as-you-go ainda é o padrão quando você cria uma distribuição via 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 vincule a um plano de tarifa fixa depois.
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 no console).
- AWS CLI instalado e configurado com credenciais que possam executar
cloudfront:GetDistributionConfigecloudfront:CreateDistribution. - jq (ou similar) para editar a configuração JSON.
Exemplos de scripts usados abaixo estão no diretório 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-a:
# 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 extraímos:
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json
Neste momento, new-distribution-config.json parece o seguinte (resumido). Ele inclui CallerReference, Aliases, Origins, DefaultRootObject e DefaultCacheBehavior com Lambda@Edge. Para o exemplo do domínio do site, eu uso 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 único CallerReference. Reutilizar o mesmo valor de outra distribuição faz com que a API rejeite a solicitação. Use uma nova string ou um carimbo de data/hora:
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 do site do bucket e lista de aliases). Se quiser uma distribuição sem domínio personalizado por enquanto, limpe os aliases:
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
Se precisar apontar para um endpoint diferente do S3, edite a seção Origins no mesmo arquivo (por exemplo, altere Id e DomainName para o hostname do novo bucket e defina DefaultCacheBehavior.TargetOriginId para esse 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 pay-as-you-go por padrão. Depois disso, você pode apontar seu DNS (ou Route 53) para o novo domínio do CloudFront e, se usar para Hugo, implante com Hugo deploy ou AWS CLI como de costume.
Referência rápida: script completo
Colado juntos (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 (pay-as-you-go) distribuição
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
Pay-as-you-go vs. planos de tarifa fixa (resumo)
- Pay-as-you-go: Você paga por transferência de dados e solicitações; o plano gratuito permanente do CloudFront inclui 1 TB de transferência de dados e 10 milhões de solicitações HTTP/HTTPS por mês. Não há taxa mensal.
- Planos de tarifa fixa: Documentados aqui. O plano gratuito tem limites mais baixos (por exemplo, 1 milhão de solicitações, 100 GB); o plano premium começa em $15/mês com mais capacidade e recursos embalados como WAF, Route 53, etc. Não há cobranças extras.
Se seu tráfego se encaixa no plano gratuito de pay-as-you-go e você não precisa dos recursos embalados dos planos de tarifa fixa, criar distribuições via CLI como acima mantém você no pay-as-you-go, enquanto o console apenas mostra planos gratuitos/premium.
Links úteis
- Implante um site gerado pelo Hugo na AWS S3
- Implante um site Hugo na AWS S3 com o AWS CLI
- Preços pay-as-you-go do Amazon CloudFront
- Planos de tarifa fixa do CloudFront (Guia do Desenvolvedor)
- Introdução aos planos de tarifa fixa sem cobranças extras (Blog da AWS)
- create-distribution (AWS CLI)
- get-distribution-config (AWS CLI)