15 — Dominio personalizado y SSL
← Anterior: 14 — Primer Despliegue
Cloud Run te da una URL como https://mycoolproject-abc123-uc.a.run.app con HTTPS ya habilitado. Este capítulo muestra cómo usar tu propio dominio en su lugar.
Cómo funciona SSL con Cloud Run
Cloud Run maneja SSL automáticamente vía certificados gestionados por Google. Solo apuntas tu dominio a Cloud Run y GCP aprovisiona y renueva el certificado gratis.
Dos opciones:
| Configuración | Quién gestiona SSL | Notas |
|---|---|---|
| Solo DNS de Cloudflare (nube gris) | GCP | Simple, gratis, certificado de Google |
| Cloudflare proxied (nube naranja) | Cloudflare | Añade protección WAF/DDoS, pero más complejo |
Esta guía usa DNS solo (nube gris) — configuración más simple.
Mapear dominio a Cloud Run
# Mapear tu dominio al servicio Cloud Run
gcloud run domain-mappings create \
--service=mycoolproject \
--domain=mycoolproject.com \
--region=southamerica-east1
Esto outputa un registro DNS para agregar. Algo como:
Agregar registro DNS
Agrega el registro DNS en tu registrador o en Cloudflare.
Configuración de Cloudflare
- Agrega tu dominio a Cloudflare (plan gratuito)
- Establece los nameservers en los de Cloudflare
- Agrega el registro CNAME que Cloud Run te dio
- Establece el modo proxy a Solo DNS (nube gris) ☁️
Importante: Usa nube gris (Solo DNS), no naranja (proxied). La nube naranja hace que Cloudflare termine SSL, lo que rompe el aprovisionamiento de certificados de GCP y causa errores.
Configuración de registrador directo
Agrega el registro CNAME o A que gcloud run domain-mappings create te indicó.
Esperar el certificado SSL
El aprovisionamiento de SSL toma unos minutos hasta una hora después de que el DNS se propaga.
Verificar estado:
Busca certificateMode: AUTOMATIC y mappingStatus: ACTIVE.
Actualizar ALLOWED_HOSTS
Una vez que el dominio esté activo, actualiza Cloud Run para aceptar solicitudes desde él:
gcloud run services update mycoolproject \
--region=southamerica-east1 \
--update-env-vars=ALLOWED_HOSTS="mycoolproject.com,www.mycoolproject.com,mycoolproject-abc123-uc.a.run.app"
El ALLOWED_HOSTS de Django rechaza solicitudes con Host headers desconocidos — esto previene ataques de HTTP Host header.
Agregar subdominio www
Para manejar también www.mycoolproject.com:
gcloud run domain-mappings create \
--service=mycoolproject \
--domain=www.mycoolproject.com \
--region=southamerica-east1
Agrega otro registro CNAME: www.mycoolproject.com → mycoolproject.com (o el mismo objetivo ghs.googlehosted.com).
Configuración de Terraform para mapeo de dominio
Lamentablemente, los mapeos de dominio no pueden crearse con Terraform (GCP no los soporta aún en el provider de Google). Usa la CLI de gcloud o la Consola de GCP para este paso.
Pero puedes agregar el registro DNS vía Terraform si usas Cloudflare:
# Cloudflare provider (separate from GCP)
provider "cloudflare" {
api_token = var.cloudflare_api_token
}
resource "cloudflare_record" "www" {
zone_id = var.cloudflare_zone_id
name = "www"
value = "ghs.googlehosted.com"
type = "CNAME"
proxied = false # Grey cloud — DNS only
}
Notas de costo
| Elemento | Costo |
|---|---|
| Registro de dominio | ~$10–15/año (pagado al registrador, no a GCP) |
| Certificado SSL | Gratis (gestionado por GCP) |
| Cloudflare DNS | Gratis (en plan gratuito) |
| Cloudflare proxied | Gratis (pero rompe SSL de GCP — usa nube gris) |
Verificar que el sitio funciona
Debería retornar {"status": "ok"}.
Navegación
- 01 — Introducción: Qué vamos a construir
- 02 — Visión general de Terraform
- 03 — Servicios en la nube explicados
- 04 — Base de datos PlanetScale explicada
- 05 — Configuración del proyecto y estado de Terraform
- 06 — Proyecto GCP y APIs
- 07 — Artifact Registry
- 08 — Gestión de Secretos
- 09 — Cloud Storage
- 10 — Service Accounts e IAM
- 11 — Cloud Run
- 12 — Cloud Tasks y Scheduler
- 13 — Dockerfile
- 14 — Primer Despliegue
- 15 — Dominio personalizado y SSL (Capítulo actual)
- 16 — Workload Identity Federation
- 17 — GitHub Actions CI/CD
- 18 — Referencia Rápida