Saltar a contenido

CDN módulo

infra/modules/cdn-static-site/ empaqueta el patrón S3 privado + OAC + CloudFront + ACM (us-east-1) + Route53 alias para sitios estáticos. Es el módulo usado por widget, admin, auth y docs.

Inputs principales

Variable Tipo Notas
name string nombre lógico (widget, admin, auth, docs)
env string dev, qa, prod
domain_name string FQDN público
hosted_zone_id string Zone Route53 donde crear el alias
kms_key_arn string CMK de la plataforma para encrypt S3
account_id string para policies S3
spa_mode bool true → reescribe 403/404 a index.html (SPA routing)
default_root_object string normalmente index.html
enable_waf bool activa WebACL (qa/prod)
enable_distribution bool toggle para destruir tráfico sin perder bucket

Providers requeridos:

providers = {
  aws           = aws
  aws.us_east_1 = aws.us_east_1   # ACM debe vivir en us-east-1
}

Recursos creados

  • aws_s3_bucket privado con versionado + SSE-KMS.
  • aws_s3_bucket_public_access_block (todo bloqueado).
  • aws_cloudfront_origin_access_control (OAC).
  • aws_cloudfront_distribution con behavior default + SPA reescrituras opcionales.
  • aws_acm_certificate en us_east_1.
  • aws_acm_certificate_validation con DNS auto.
  • aws_route53_record alias A/AAAA.
  • (opcional) aws_wafv2_web_acl regla básica AWSManagedRulesCommonRuleSet.

SPA mode

Con spa_mode = true se crea una CloudFront Function que reescribe errores 403/404 a index.html (NO el viejo custom_error_response, que también devuelve 200 pero rompe los assets reales 404).

Outputs

  • domain_name — FQDN final.
  • bucket_name — para sync de assets.
  • distribution_id — para invalidations.
  • distribution_domain_name*.cloudfront.net (debug).

Instancias actuales (envs/dev/cdn.tf)

Módulo Dominio spa_mode
cdn_widget cdn.zen.zervizdev.com false (widget.js suelto)
cdn_admin admin.dev.zen.zervizdev.com true
cdn_auth auth.dev.zen.zervizdev.com false (3 HTMLs estáticos)
cdn_docs (nuevo) docs.dev.zen.zervizdev.com false (MkDocs build estático)

Cómo agregar un CDN nuevo

  1. Editar infra/envs/dev/cdn.tf con un nuevo bloque module "cdn_<name>".
  2. Reutilizar hosted_zone_id y kms_key_arn.
  3. Decidir spa_mode según si es SPA con routing client-side o sitio estático plano.
  4. Aplicar via cd-dev.yml (push a main).
  5. Agregar el dominio al CNAME / DNS approval del cliente si va fuera de *.zen.zervizdev.com.

Deploy de assets

Patrón estándar (también usado por widget y admin):

aws s3 sync ./site/ s3://zen-dev-docs-cdn-450972188274/ \
  --delete \
  --cache-control "public, max-age=300, s-maxage=300"

aws cloudfront create-invalidation \
  --distribution-id $DOCS_DISTRIBUTION_ID \
  --paths "/*"