Crear AWS CloudFront en el plan de pago por uso (no el plan gratuito)
Crear CloudFront pay-as-you-go mediante la CLI de AWS.
El plan gratuito de AWS no funciona para mí y Pay-as-you-go está oculto para nuevas distribuciones de CloudFront en la consola de AWS .
Cuando hosteas sitios basados en Hugo en AWS, generalmente colocas el bucket detrás de CloudFront y adjuntas una función Lambda@Edge para que las solicitudes a rutas de directorio (p. ej. /blog/) se reescriban a /blog/index.html para orígenes de estilo sitio web de S3. Luego puedes usar hugo deploy o implementar con el CLI de AWS para sincronizar el sitio construido. La excepción: necesitas una distribución de CloudFront que utilice esa Lambda y, si quieres evitar compromisos con planes de tarifa plana, pay-as-you-go. La consola ya no te permite elegir ese—solo planes gratuitos o premium.

Este post muestra cómo crear una distribución pay-as-you-go reutilizando la configuración de una distribución existente mediante el CLI de AWS y los scripts en la carpeta scripts de este artículo.
Cuando la consola solo ofrece planes gratuitos o premium
Amazon introdujo planes de tarifa plana para CloudFront (Gratuito, Premium, Empresarial, Premium) que empaquetan el CDN con WAF, protección contra DDoS, Route 53 y otros servicios a un precio fijo mensual sin sobrecostos. En la consola de CloudFront, cuando creas una nueva distribución, ahora ves solo opciones de gratuito o premium (y superiores). El plan premium comienza en $15/mes; no hay una opción visible de “pay-as-you-go” allí.
Pay-as-you-go sigue siendo el valor predeterminado cuando creas una distribución a través de la API de CloudFront o el CLI de AWS (create-distribution). Entonces, si ya tienes una distribución creada anteriormente (o mediante CLI) y quieres otra con el mismo comportamiento—p. ej. origen de sitio web de S3 más Lambda@Edge para index.html—puedes exportar la configuración de esa distribución, ajustarla y crear una nueva distribución. La nueva será pay-as-you-go a menos que luego la vincules a un plan de tarifa plana.
Lo que necesitas
- Una distribución de CloudFront existente cuya configuración puedas copiar (p. ej. una utilizada para otro sitio de Hugo, o una creada antes del cambio en la consola).
- CLI de AWS instalado y configurado con credenciales que puedan ejecutar
cloudfront:GetDistributionConfigycloudfront:CreateDistribution. - jq (o similar) para editar la configuración JSON.
Los scripts de ejemplo utilizados a continuación viven en la carpeta scripts de este post: current-distribution-config.json, new-distribution-config.json, updated-distribution-config.json, y final-distribution-config.json.
Paso 1: Obtener la configuración de la distribución existente
Obtén la configuración completa de la distribución (incluyendo ETag) y guárdala:
# Reemplaza ABCDEFG con el ID de tu distribución existente
aws cloudfront get-distribution-config --id ABCDEFG > current-distribution-config.json
get-distribution-config devuelve un objeto envoltorio con ETag y DistributionConfig. Para crear una nueva distribución solo pasas la parte interna DistributionConfig, por lo que lo extraemos:
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json
En este punto, new-distribution-config.json se ve como lo siguiente (resumido).
Incluye CallerReference, Aliases, Origins, DefaultRootObject, y DefaultCacheBehavior con Lambda@Edge.
Para el ejemplo del dominio del sitio, he salido 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
}
]
}
}
}
Paso 2: Establecer un CallerReference único
Cada distribución debe tener un único CallerReference. Reutilizar el mismo valor que otra distribución hace que la API rechace la solicitud. Usa una nueva cadena o un timestamp:
NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json
Paso 3: Ajustar alias y orígenes (opcional)
Si el nuevo sitio utiliza un dominio o bucket de S3 diferente, actualiza Aliases y Origins en updated-distribution-config.json para que coincidan (p. ej. punto final de sitio web del nuevo bucket y lista de alias). Si deseas una distribución sin dominio personalizado por ahora, elimina los alias:
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
Si necesitas apuntar a un punto final de sitio web de S3 diferente, edita la sección Origins en el mismo archivo (p. ej. cambia Id y DomainName al nuevo hostname del bucket de sitio web, y establece DefaultCacheBehavior.TargetOriginId a ese mismo Id).
Paso 4: Crear la nueva distribución
Crea la distribución desde la configuración final:
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
La respuesta incluye el Id, ARN, DomainName y Status de la nueva distribución. La nueva distribución utiliza pay-as-you-go por defecto. Luego puedes apuntar tu DNS (o Route 53) al nuevo dominio de CloudFront y, si lo usas para Hugo, implementa con Hugo deploy o AWS CLI como de costumbre.
Referencia rápida: script completo
Pegado juntos (usando un ID de distribución existente y eliminando alias), el flujo es:
# 1) Exportar e extraer 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: sin dominio personalizado
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
# 4) Crear (pay-as-you-go) distribución
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
Pay-as-you-go vs tarifa plana (resumen)
- Pay-as-you-go: Paga por transferencia de datos y solicitudes; el nivel gratuito perpetuo de CloudFront incluye 1 TB de transferencia de datos y 10 millones de solicitudes HTTP/HTTPS por mes. No hay tarifa mensual.
- Planes de tarifa plana: Documentados aquí. El plan gratuito tiene menores límites (p. ej. 1 millón de solicitudes, 100 GB); el plan premium comienza en $15/mes con más capacidad y servicios empaquetados como WAF, Route 53, etc. Sin sobrecostos.
Si tu tráfico encaja dentro del nivel gratuito de pay-as-you-go y no necesitas las características empaquetadas de los planes de tarifa plana, crear distribuciones a través del CLI como se describe mantiene tu uso en pay-as-you-go mientras la consola solo muestra planes gratuitos/premium.
Enlaces útiles
- Implementar un sitio generado por Hugo en AWS S3
- Implementar un sitio de Hugo en AWS S3 con el CLI de AWS
- Precios de CloudFront pay-as-you-go
- Planes de tarifa plana de CloudFront (Guía del desarrollador)
- Introduciendo planes de tarifa plana sin sobrecostos (Blog de AWS)
- create-distribution (CLI de AWS)
- get-distribution-config (CLI de AWS)