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.

Índice

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.

La documentación no coincide con las entregas reales de la fuente

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:GetDistributionConfig y cloudfront: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