Cloudflare como IaC¶
Cómo se gestiona Cloudflare con Terraform y cómo reimportar si hace falta.
Estructura¶
- Root:
terraform/cloudflare/, state remoto en R2 (cloudflare.tfstate). - Autosync:
cloudflare-plan.yml(PR) ycloudflare-apply.yml(main).
Credenciales¶
CLOUDFLARE_API_TOKEN(permisos mínimos) por GitHub Secrets /.env.R2_ACCESS_KEY_ID/R2_SECRET_ACCESS_KEYpara el backend (se exportan comoAWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY).GOOGLE_CLIENT_SECRET(Access) por GitHub Secrets /.env.
Rotar el client_secret de Google (Access)¶
El client_secret del IdP es write-only: en access.tf lleva
lifecycle { ignore_changes = [config.client_secret] } (v5) para no ver un diff
perpetuo. Para rotarlo:
- Actualizar
GOOGLE_CLIENT_SECRETen.env(y GitHub Secret) con el nuevo. - Quitar temporalmente el bloque
lifecycle { ignore_changes = ... }decloudflare_zero_trust_access_identity_provider.google. terraform apply(actualiza el secret en Cloudflare).- Volver a poner el bloque
lifecycle { ignore_changes = ... }. terraform planhastaNo changes.y commitear.
Import (solo si hay que recuperar estado)¶
terraform init- Importar cada recurso con
terraform import(formato por recurso, ver plandocs/plans/2026-09-01-cloudflare-iac.md). terraform planhastaNo changes.
Precauciones¶
- Nunca aplicar si el plan muestra destroy/replace de DNS, zona o túnel.
- El bucket R2 y el login method de Zero Trust son manuales (fuera de TF).
Fuera de alcance (deliberado)¶
- Dirección destino de Email Routing (
cloudflare_email_routing_address): ya está verificada y no hace falta gestionarla para el reenvío; requeriría el permiso account-level "Email Routing Addresses" en el token. - Registro DKIM (
cf2024-1._domainkey): lo gestiona Email Routing y no se puede modificar por la API DNS (error 1046). - Settings de zona: se gestionan solo 12 (sin
minify, que da error 1007).