Route 53 Alias vs CNAME: Cuándo usar cada uno y por qué el Alias es obligatorio en el apex de zona
Estás configurando tu dominio raíz example.com para que apunte a un Application Load Balancer y Route 53 te ofrece dos opciones: CNAME o Alias. Si eliges CNAME, el registro simplemente no funcionará en el apex de zona — y Route 53 ni siquiera te lo permite. Este es uno de esos casos donde la restricción del DNS estándar obliga a usar una funcionalidad específica de AWS, y entender el porqué evita horas de depuración.
TL;DR: Alias vs CNAME en Route 53
| Característica | CNAME | Alias (Route 53) |
|---|---|---|
Funciona en apex de zona (example.com) |
❌ No permitido por RFC | ✅ Sí |
Funciona en subdominios (www.example.com) |
✅ Sí | ✅ Sí |
| Coste de consultas DNS | Se cobra por query | Sin coste adicional para destinos AWS |
| Responde con IPs del destino | No (devuelve el nombre) | Sí (resolución directa) |
| Health check integrado | No | Sí (hereda el health del destino) |
| Destinos soportados | Cualquier hostname | Solo recursos AWS específicos |
Cómo funciona el DNS en el apex de zona — la raíz del problema con CNAME
El apex de zona (también llamado 'zone apex' o 'naked domain') es el nombre de dominio sin prefijo: example.com. El RFC 1034 define que en el apex de zona deben existir registros SOA y NS. La restricción crítica es que un registro CNAME no puede coexistir con ningún otro tipo de registro en el mismo nombre. Como el apex siempre tiene SOA y NS, un CNAME en example.com violaría el estándar DNS — por eso los servidores DNS conformes al RFC lo prohíben.
Route 53 resuelve esto con los registros Alias, que son una extensión propietaria de AWS al protocolo DNS. Desde la perspectiva del cliente DNS, un registro Alias se comporta como un registro A o AAAA: devuelve directamente las direcciones IP del recurso destino. La resolución del nombre del ALB ocurre dentro de la infraestructura de Route 53, no en el cliente.
Viola RFC 1034"] end
- CNAME en subdominio: El cliente recibe el hostname del ALB y debe hacer una segunda consulta DNS para resolver las IPs. Dos round-trips.
- Alias en apex: Route 53 resuelve internamente el hostname del ALB y devuelve las IPs directamente al cliente. Un solo round-trip, sin violar el RFC.
- CNAME en apex: Bloqueado. Route 53 no permite crear este registro.
Cuándo usar Alias vs CNAME — guía de decisión
ej: example.com sin prefijo"} Q1 -->|"Sí"| Q2{"¿El destino es un
recurso AWS soportado?"} Q1 -->|"No — es subdominio
ej: www.example.com"| Q3{"¿El destino es un
recurso AWS soportado?"} Q2 -->|"Sí"| R1["✅ Usa registro ALIAS
Obligatorio en apex"] Q2 -->|"No — destino externo"| R2["⚠️ Problema arquitectural
CNAME no válido en apex
Revisar diseño DNS"] Q3 -->|"Sí — ALB, CloudFront, etc."| R3["✅ Usa registro ALIAS
Recomendado: IPs auto-actualizadas
y health check integrado"] Q3 -->|"No — servicio externo"| R4["✅ Usa CNAME
Configura TTL apropiado"]
Configurar un registro Alias hacia un ALB en Route 53
Cuando creas un registro Alias, necesitas el nombre DNS del ALB y su Hosted Zone ID. Estos dos valores son distintos: el nombre DNS es el hostname del balanceador, y el Hosted Zone ID es el identificador de la zona hospedada de Route 53 del ALB — no el de tu zona hospedada. AWS publica estos Hosted Zone IDs por región en su documentación oficial.
Con la CLI, crear el registro Alias en el apex de zona se hace mediante un change-resource-record-sets con un bloque AliasTarget:
aws route53 change-resource-record-sets \
--hosted-zone-id Z1PA6795UKMFR9 \
--change-batch '{
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "Z35SXDOTRQ7X7K",
"DNSName": "my-alb-1234567890.us-east-1.elb.amazonaws.com",
"EvaluateTargetHealth": true
}
}
}
]
}'
El campo HostedZoneId dentro de AliasTarget corresponde al Hosted Zone ID del ALB en la región donde está desplegado, no al ID de tu zona hospedada. El valor Z35SXDOTRQ7X7K del ejemplo es el Hosted Zone ID documentado por AWS para ALBs en us-east-1 — verifica siempre el valor correcto para tu región en la documentación oficial de Route 53.
Para obtener el nombre DNS y el Hosted Zone ID de tu ALB directamente:
aws elbv2 describe-load-balancers \
--names my-alb \
--query 'LoadBalancers[0].{DNSName:DNSName,CanonicalHostedZoneId:CanonicalHostedZoneId}' \
--output table
El campo CanonicalHostedZoneId de la respuesta es exactamente el valor que necesitas en AliasTarget.HostedZoneId.
EvaluateTargetHealth: el parámetro que la mayoría ignora
El campo EvaluateTargetHealth en el bloque AliasTarget controla si Route 53 evalúa el estado de salud del recurso destino antes de responder consultas DNS. Cuando se establece en true, Route 53 deja de devolver el registro si el destino está marcado como no saludable.
Esto es especialmente relevante en configuraciones de failover: si tienes un registro Alias primario apuntando a un ALB y un registro secundario de respaldo, EvaluateTargetHealth: true es lo que activa el failover automático. Sin él, Route 53 sigue respondiendo con las IPs del ALB aunque todos sus targets estén caídos.
Piensa en
EvaluateTargetHealthcomo el interruptor que conecta la inteligencia de Route 53 con el estado real de tu infraestructura. Sin él, el DNS no sabe que el ALB está caído — solo sabe que existe.
Verifica el estado actual de un registro con health check habilitado:
aws route53 list-resource-record-sets \
--hosted-zone-id Z1PA6795UKMFR9 \
--query "ResourceRecordSets[?Name=='example.com.']" \
--output json
Configurar un registro CNAME para subdominios
Para subdominios como www.example.com, un CNAME es perfectamente válido y en algunos casos preferible si el destino no es un recurso AWS — por ejemplo, un servicio SaaS externo. La sintaxis es más directa:
aws route53 change-resource-record-sets \
--hosted-zone-id Z1PA6795UKMFR9 \
--change-batch '{
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "www.example.com",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [
{
"Value": "my-alb-1234567890.us-east-1.elb.amazonaws.com"
}
]
}
}
]
}'
A diferencia del Alias, el CNAME tiene un TTL configurable que controla cuánto tiempo los resolvers cachean la respuesta. Los registros Alias no tienen TTL configurable — Route 53 gestiona el TTL internamente basándose en el recurso destino.
El error que todos cometen al migrar de CNAME a Alias
Escenario real: tienes www.example.com apuntando al ALB con un CNAME y decides mover también el apex example.com. Creas el registro Alias en el apex, verificas que resuelve, y asumes que todo está correcto. Tres días después empiezan a llegar reportes de usuarios que no pueden acceder.
El problema no estaba en el Alias — estaba en que el registro CNAME de www seguía activo con un TTL de 3600 segundos, y algunos resolvers tenían cacheado un hostname del ALB que AWS había reemplazado durante un evento de mantenimiento. El CNAME apuntaba al hostname correcto, pero el hostname ya no resolvía a IPs activas.
Con un registro Alias, esto no habría ocurrido: Route 53 actualiza la resolución interna automáticamente cuando AWS cambia las IPs del ALB. El CNAME delega esa responsabilidad al resolver del cliente, que puede tener una entrada obsoleta en caché.
La lección operacional: cuando migras de CNAME a Alias para subdominios que apuntan a recursos AWS, reduce el TTL del CNAME a 60 segundos al menos 24 horas antes de hacer el cambio. Así el tiempo de propagación es predecible.
Destinos soportados por registros Alias en Route 53
Los registros Alias solo funcionan con un conjunto específico de recursos AWS. No puedes usar un Alias para apuntar a un servidor externo o a un hostname arbitrario. Los destinos documentados incluyen:
- Application Load Balancers, Network Load Balancers y Classic Load Balancers
- Distribuciones de CloudFront
- Entornos de Elastic Beanstalk
- Buckets de S3 configurados como sitios web estáticos
- Aceleradores de AWS Global Accelerator
- Registros de la misma zona hospedada de Route 53
- Endpoints de Amazon API Gateway
- Endpoints de Amazon VPC Interface
Si tu destino no está en esta lista, CNAME es tu única opción — y si necesitas usarlo en el apex de zona con un servicio externo, tendrás que reevaluar tu arquitectura DNS.
IAM: permisos necesarios para gestionar registros Route 53
Para crear o modificar registros en Route 53 desde CLI o código, la identidad IAM necesita al menos estos permisos:
🔽 Ver política IAM mínima para gestión de registros Route 53
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets",
"route53:ListResourceRecordSets",
"route53:GetHostedZone"
],
"Resource": "arn:aws:route53:::hostedzone/Z1PA6795UKMFR9"
},
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:GetChange"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"elasticloadbalancing:DescribeLoadBalancers"
],
"Resource": "*"
}
]
}
Las acciones ListHostedZones y GetChange requieren Resource: * porque no admiten restricción a nivel de recurso específico según la Service Authorization Reference de AWS. Verifica siempre los permisos actuales en esa referencia antes de aplicar restricciones de ARN.
Verificar la resolución DNS del registro Alias
Una vez creado el registro, verifica que resuelve correctamente usando dig o nslookup. Un registro Alias bien configurado devuelve directamente registros A con las IPs del ALB, no un CNAME intermedio:
dig example.com A +short
Si ves una respuesta con IPs directamente (sin un CNAME en la cadena de resolución), el Alias está funcionando correctamente. Si ves un CNAME en la respuesta, probablemente creaste un registro CNAME en lugar de un Alias, o hay un registro conflictivo en la zona.
Para confirmar el estado del cambio en Route 53 (los cambios son asíncronos y pasan por estados PENDING → INSYNC):
aws route53 get-change \
--id /change/C2682N5HXP0BZ4
Reemplaza el ID con el valor Id devuelto por change-resource-record-sets. El registro está activo cuando el estado es INSYNC.
Conclusión y próximos pasos con Route 53 Alias
El registro Alias de Route 53 no es solo una alternativa al CNAME — es la única opción válida para apuntar el apex de zona a un ALB, CloudFront u otros recursos AWS. Para subdominios que apuntan a recursos AWS, el Alias también es preferible por la resolución automática de IPs y la integración con health checks.
Pasos recomendados:
- Audita tus zonas hospedadas existentes:
aws route53 list-resource-record-sets --hosted-zone-id <ID>y busca CNAMEs apuntando a hostnames*.elb.amazonaws.como*.cloudfront.net— son candidatos a migrar a Alias. - Habilita
EvaluateTargetHealth: trueen todos los registros Alias que participen en configuraciones de failover. - Consulta la documentación oficial de Route 53 para la lista actualizada de Hosted Zone IDs por región para ALBs y otros recursos.
- Revisa la documentación de políticas de enrutamiento de Route 53 si necesitas combinar Alias con Weighted, Latency o Failover routing.
Glosario de términos clave
| Término | Definición |
|---|---|
| Apex de zona | El nombre de dominio raíz sin prefijo (ej: example.com). Siempre contiene registros SOA y NS por definición del RFC. |
| Registro Alias | Extensión propietaria de Route 53 que se comporta como un registro A/AAAA pero resuelve internamente el hostname de un recurso AWS destino. |
| CNAME | Registro DNS estándar que mapea un nombre a otro nombre. No puede coexistir con otros registros en el mismo nombre, lo que lo hace incompatible con el apex de zona. |
| EvaluateTargetHealth | Parámetro del bloque AliasTarget que indica a Route 53 si debe considerar el estado de salud del recurso destino al responder consultas DNS. |
| Hosted Zone ID (ALB) | Identificador de la zona hospedada de Route 53 asociada al ALB, específico por región. Distinto al Hosted Zone ID de tu propia zona hospedada. |
Comentarios
Publicar un comentario