MercadoFresco tiene ya una red propia, un cortafuegos por capas, un balanceador que reparte el tráfico entre dos zonas de disponibilidad y una CDN que sirve el catálogo desde Madrid por 0,97 USD al mes. Y sin embargo, un cliente no puede comprar nada, porque la tienda responde en alb-mercadofresco-tienda-1234567890.eu-west-1.elb.amazonaws.com y el catálogo en d111111abcdef8.cloudfront.net. Además, los dos certificados de ACM que pedimos en las lecciones 03-03 y 03-04 siguen en PENDING_VALIDATION, esperando unos registros DNS que todavía no existen.

Amazon Route 53 es el servicio de DNS de AWS: traduce nombres a direcciones, sí, pero además comprueba la salud de los destinos y decide a cuál enviar a cada visitante según el peso, la latencia, el país o el estado del sistema. Su nombre viene del puerto 53, el puerto del DNS.

En esta lección Marta pone mercadofresco.example a apuntar a la nube, valida los certificados, cierra el HTTPS pendiente y deja preparadas las políticas de enrutamiento que MercadoFresco va a necesitar: el canario del 10 % para despliegues seguros, la geolocalización para abrir en Portugal y la conmutación por error a una página de mantenimiento. Y con eso cerramos el módulo 3.

Contenido

  1. Repaso práctico de DNS: zonas, delegación, resolución y TTL
  2. Registrar y transferir dominios en Route 53
  3. Zonas alojadas públicas y privadas
  4. Tipos de registro
  5. Registros de alias: la pieza que solo tiene AWS
  6. Validar el certificado de ACM por DNS
  7. Comprobaciones de estado de Route 53
  8. Políticas de enrutamiento, una por una
  9. Configurar el DNS de MercadoFresco por consola y por CLI
  10. Route 53 Resolver y las reglas de reenvío hacia la oficina
  11. Costes de Route 53 y limpieza
  12. Cierre del módulo: la arquitectura de red completa

Repaso práctico de DNS: zonas, delegación, resolución y TTL

El DNS (Domain Name System) es una base de datos distribuida y jerárquica que traduce nombres a direcciones. Su estructura se lee de derecha a izquierda:

                                    . (raíz)
                                    |
                      +-------------+-------------+
                      |             |             |
                    .com          .example      .org        ← dominios de nivel superior (TLD)
                                    |
                            mercadofresco.example            ← dominio de segundo nivel (el nuestro)
                                    |
                +-------------------+-------------------+
                |                   |                   |
        www.mercadofresco   api.mercadofresco   admin.mercadofresco   ← subdominios

Una zona es la porción del árbol de la que alguien es responsable. Cuando MercadoFresco registra mercadofresco.example, se convierte en responsable de esa zona y de todo lo que cuelgue de ella.

La delegación es el mecanismo que conecta los niveles: los servidores de .example no conocen la IP de la tienda; solo saben decir «para todo lo de mercadofresco.example, pregunta a estos cuatro servidores de nombres». Eso se expresa con registros NS.

La resolución recursiva, paso a paso:

sequenceDiagram
    participant N as Navegador<br/>(Sevilla)
    participant R as Resolvedor recursivo<br/>(del operador)
    participant Raiz as Servidor raíz
    participant TLD as Servidores de .example
    participant R53 as Route 53<br/>(autoritativo)

    N->>R: ¿IP de www.mercadofresco.example?
    Note over R: ¿Lo tengo en caché? No
    R->>Raiz: ¿Quién sabe de .example?
    Raiz-->>R: Pregunta a los servidores de .example (NS)
    R->>TLD: ¿Quién sabe de mercadofresco.example?
    TLD-->>R: ns-123.awsdns-45.com y tres más (NS)
    R->>R53: ¿IP de www.mercadofresco.example?
    R53-->>R: 13.32.x.x (con TTL 300)
    R-->>N: 13.32.x.x
    Note over R: Guardado en caché 300 s:<br/>las siguientes consultas no salen de aquí

Cuatro conceptos que salen de este diagrama:

  • Route 53 es el servidor autoritativo: la fuente de la verdad de la zona.
  • El resolvedor recursivo (el del operador, o el 8.8.8.8 de Google) hace el trabajo de ir preguntando y guarda el resultado en caché.
  • El TTL es cuántos segundos puede cachearse esa respuesta. Route 53 solo cobra las consultas que le llegan, así que un TTL alto ahorra dinero, pero ralentiza los cambios.
  • Route 53 usa anycast: los mismos servidores de nombres se anuncian desde muchos puntos del mundo, y cada consulta llega al más cercano.

Cómo elegir el TTL:

Situación TTL Razón
Registro estable (MX, TXT de verificación) 86.400 (1 día) Nunca cambia; ahorra consultas
Producción normal 300 (5 min) El valor por defecto sensato de MercadoFresco
Días antes de una migración 60 Para que el cambio se propague rápido cuando llegue
Durante una migración 60 Poder volver atrás en un minuto
Registros de alias (no aplica) Route 53 lo gestiona solo

La técnica de bajar el TTL a 60 varios días antes de una migración es la que separa una migración tranquila de un domingo largo: el TTL antiguo tiene que caducar en todas las cachés del mundo antes de que el nuevo tenga efecto.

Registrar y transferir dominios en Route 53

Route 53 hace tres cosas distintas que conviene no confundir:

Función Qué es Se paga
Registro de dominios Comprar mercadofresco.example Cuota anual del TLD
DNS autoritativo Responder consultas sobre la zona Por zona alojada y por consulta
Comprobaciones de estado Vigilar destinos y enrutar según su salud Por comprobación

Se pueden usar por separado: es perfectamente válido tener el dominio registrado en otro proveedor y el DNS en Route 53. Solo hay que cambiar los servidores de nombres en el panel del registrador para que apunten a los cuatro que Route 53 asigna a la zona.

# Comprobar disponibilidad (los comandos de dominios son SIEMPRE en us-east-1)
aws route53domains check-domain-availability --profile mercadofresco-dev \
  --region us-east-1 --domain-name mercadofresco.example

# Listar los dominios ya registrados en la cuenta
aws route53domains list-domains --profile mercadofresco-dev --region us-east-1 \
  --query 'Domains[].{Dominio:DomainName,Expira:Expiry,AutoRenovar:AutoRenew}' --output table

Dos ajustes que hay que verificar siempre tras registrar un dominio:

  • Renovación automática activada. Un dominio caducado es una tienda apagada, y recuperarlo puede ser imposible.
  • Bloqueo de transferencia activado. Impide que alguien mueva el dominio a otro registrador sin autorización.

Route 53 incluye además la privacidad del registro sin coste adicional: los datos de contacto de MercadoFresco no aparecen en las consultas WHOIS públicas.

Zonas alojadas públicas y privadas

Una zona alojada (hosted zone) es el contenedor de todos los registros de un dominio. Hay dos tipos y su diferencia es fundamental:

Zona pública Zona privada
Quién la consulta Todo internet Solo las VPC asociadas
Servidores de nombres Cuatro públicos de AWS El resolvedor interno (10.0.0.2)
Requiere dominio registrado No: puede inventarse
Coste 0,50 USD/mes 0,50 USD/mes
Uso en MercadoFresco mercadofresco.example interno.mercadofresco.example

La zona privada resuelve un problema muy concreto. Hoy la aplicación se conecta a la base de datos con un nombre horrible como mercadofresco-pedidos.abc123xyz.eu-west-1.rds.amazonaws.com. Con una zona privada asociada a vpc-mercadofresco, ese nombre puede sustituirse por bd.interno.mercadofresco.example, que además puede repuntarse a otra instancia sin tocar la configuración de la aplicación.

# Zona PÚBLICA del dominio principal
ZONA_PUB=$(aws route53 create-hosted-zone --profile mercadofresco-dev \
  --name mercadofresco.example \
  --caller-reference "mercadofresco-publica-$(date +%s)" \
  --hosted-zone-config Comment="Zona publica de MercadoFresco",PrivateZone=false \
  --query 'HostedZone.Id' --output text | sed 's|/hostedzone/||')

# Los cuatro servidores de nombres que hay que configurar en el registrador
aws route53 get-hosted-zone --profile mercadofresco-dev --id "$ZONA_PUB" \
  --query 'DelegationSet.NameServers' --output table

# Zona PRIVADA, asociada a la VPC de la lección 03-01
ZONA_PRIV=$(aws route53 create-hosted-zone --profile mercadofresco-dev \
  --name interno.mercadofresco.example \
  --caller-reference "mercadofresco-privada-$(date +%s)" \
  --vpc VPCRegion=eu-west-1,VPCId="$VPC_ID" \
  --hosted-zone-config Comment="Nombres internos de la VPC",PrivateZone=true \
  --query 'HostedZone.Id' --output text | sed 's|/hostedzone/||')

Requisito importante: para que una zona privada funcione, la VPC debe tener enableDnsSupport y enableDnsHostnames a true. Es exactamente el ajuste que activamos en 03-01 y cuyo olvido es la causa número uno de que una zona privada «no resuelva».

Tipos de registro

Los registros son las entradas de la zona. Estos son los que MercadoFresco necesita:

Tipo Qué asocia Ejemplo en mercadofresco.example Notas
A Nombre → IPv4 oficina.mercadofresco.example → 81.45.20.7 El más común
AAAA Nombre → IPv6 www → 2600:9000:... Necesario si el ALB o CloudFront tienen IPv6
CNAME Nombre → otro nombre blog → mercadofresco.wordpress.com No puede usarse en el vértice del dominio
MX Correo 10 mail1.proveedor.example El número es la prioridad: menor gana
TXT Texto libre "v=spf1 include:_spf.proveedor.example ~all" SPF, DKIM, verificaciones de propiedad
NS Servidores de nombres de la zona ns-123.awsdns-45.com Se crea solo; no borrarlo
SOA Metadatos de la zona ns-123... awsdns-hostmaster... Se crea solo; uno por zona
CAA Qué autoridades pueden emitir certificados 0 issue "amazon.com" Recomendado: impide que otra CA emita para tu dominio
SRV Servicio, protocolo, puerto _sip._tcp 10 60 5060 sip.example Telefonía y servicios especiales
PTR IP → nombre (DNS inverso) Lo gestiona el propietario del rango IP

Dos que merecen un comentario:

CAA. Con este registro, MercadoFresco declara que solo Amazon puede emitir certificados para su dominio. Si un atacante consiguiera engañar a otra autoridad certificadora, esa autoridad consultaría el CAA y se negaría a emitir. Cuesta cero y evita una clase entera de ataques:

mercadofresco.example.  CAA  0 issue "amazon.com"
mercadofresco.example.  CAA  0 issuewild "amazon.com"
mercadofresco.example.  CAA  0 iodef "mailto:[email protected]"

CNAME y su limitación. Un CNAME dice «este nombre es en realidad aquel otro». El RFC 1034 prohíbe que un nombre con un CNAME tenga cualquier otro registro. Y el vértice del dominio (mercadofresco.example, sin www) tiene obligatoriamente registros SOA y NS. Por tanto:

El vértice de un dominio NO puede tener un registro CNAME. Nunca.

Esto es un problema serio, porque un ALB y una distribución de CloudFront no tienen IP fija: solo tienen nombres. No se puede poner un registro A, porque no hay IP que poner, y no se puede poner un CNAME, porque es el vértice. La solución es lo que viene ahora.

Registros de alias: la pieza que solo tiene AWS

Un registro de alias es una extensión propia de Route 53. Por fuera se comporta como un registro A (o AAAA): devuelve una IP. Por dentro, Route 53 resuelve en el momento cuál es la IP actual del recurso de AWS al que apunta.

CNAME Registro de alias
Es estándar DNS No: es propio de Route 53
Se puede usar en el vértice No
Qué devuelve al cliente Otro nombre (obliga a una segunda consulta) La IP directamente
Coste de las consultas Se cobran Gratuitas
Puede apuntar a Cualquier nombre DNS Recursos de AWS y otros registros de la misma zona
TTL Lo defines tú Lo gestiona AWS
Se adapta si el recurso cambia de IP Sí (el nombre no cambia) Sí, automáticamente
Comprueba el estado del destino No , con EvaluateTargetHealth

Tres ventajas concretas y medibles:

  1. Funciona en el vértice. mercadofresco.example puede apuntar a CloudFront. Con CNAME sería imposible.
  2. Es gratis. Route 53 no cobra las consultas resueltas por alias hacia recursos de AWS. Con 1,2 millones de consultas al mes, son unos 0,48 USD que no se pagan; a escala, mucho más.
  3. Es más rápido. Un CNAME obliga al resolvedor a hacer dos consultas: primero el nombre original, luego el destino. Un alias devuelve la IP en una.

A qué puede apuntar un alias:

Destino Ejemplo en MercadoFresco
Distribución de CloudFront mercadofresco.exampled111111abcdef8.cloudfront.net
Balanceador (ALB o NLB) directo.mercadofresco.example → el ALB
Bucket de S3 como sitio web mantenimiento.mercadofresco.example
API Gateway, VPC endpoint, Global Accelerator
Otro registro de la misma zona www → el vértice

La regla práctica: si el destino es un recurso de AWS, usa alias siempre. CNAME solo para servicios de terceros.

Validar el certificado de ACM por DNS

Ahora se cierra lo que quedó pendiente en 03-03 y 03-04. ACM necesita comprobar que el dominio es tuyo, y la forma de demostrarlo es crear un registro CNAME concreto que solo puede crear quien controle la zona.

# Ver qué registro CNAME pide ACM (uno por cada nombre del certificado)
aws acm describe-certificate --profile mercadofresco-dev --region eu-west-1 \
  --certificate-arn "$CERT_ARN_ALB" \
  --query 'Certificate.DomainValidationOptions[].{
      Dominio:DomainName, Estado:ValidationStatus,
      Nombre:ResourceRecord.Name, Tipo:ResourceRecord.Type, Valor:ResourceRecord.Value}' \
  --output table

Devuelve algo como:

Nombre: _a79865eb4cd1a6ab990a45779b53961d.mercadofresco.example
Tipo:   CNAME
Valor:  _424c7224e9b0146f9a8808af955727d0.acm-validations.aws.

Hay un atajo que crea el registro automáticamente si el dominio está en Route 53 en la misma cuenta:

# El camino largo (educativo): construir el fichero de cambios
cat > validacion-acm.json <<'JSON'
{
  "Comment": "Validacion DNS del certificado de la tienda",
  "Changes": [{
    "Action": "UPSERT",
    "ResourceRecordSet": {
      "Name": "_a79865eb4cd1a6ab990a45779b53961d.mercadofresco.example",
      "Type": "CNAME",
      "TTL": 300,
      "ResourceRecords": [
        { "Value": "_424c7224e9b0146f9a8808af955727d0.acm-validations.aws." }
      ]
    }
  }]
}
JSON

aws route53 change-resource-record-sets --profile mercadofresco-dev \
  --hosted-zone-id "$ZONA_PUB" --change-batch file://validacion-acm.json

# Esperar a que ACM lo detecte y emita el certificado (suele tardar 5-30 minutos)
aws acm wait certificate-validated --profile mercadofresco-dev --region eu-west-1 \
  --certificate-arn "$CERT_ARN_ALB"

Hay que repetirlo con el certificado de us-east-1 que pedimos para CloudFront. Detalle útil: como ambos certificados cubren los mismos dominios, el registro CNAME de validación es idéntico, así que en la práctica basta con crearlo una vez y ambos se validan.

Dos propiedades de la validación por DNS que la hacen muy superior a la validación por correo:

  • La renovación es automática. Mientras el registro CNAME siga existiendo, ACM renueva el certificado solo, cada año, para siempre. No borres nunca ese registro.
  • No depende de que alguien lea un correo. La validación por correo se envía a [email protected] y caduca en 72 horas; si nadie lo abre, hay que empezar de nuevo.

Con los certificados emitidos, ya puedes crear de verdad el escuchador HTTPS del ALB de 03-03 y asociar el dominio propio a la distribución de CloudFront de 03-04. El HTTPS de MercadoFresco queda cerrado.

Comprobaciones de estado de Route 53

Route 53 puede vigilar destinos desde una red global de comprobadores y usar el resultado para decidir qué responde. Son la base de la política de conmutación por error.

Tipo Qué comprueba Cuándo
Endpoint Un destino concreto por HTTP, HTTPS o TCP Vigilar el ALB o un servidor externo
Calculada Combina otras comprobaciones con AND, OR, NOT «Sano si al menos 2 de 3 lo están»
Alarma de CloudWatch El estado de una alarma Enrutar según una métrica de negocio (05-01)
HC_ID=$(aws route53 create-health-check --profile mercadofresco-dev \
  --caller-reference "hc-alb-mercadofresco-$(date +%s)" \
  --health-check-config '{
    "Type": "HTTPS",
    "FullyQualifiedDomainName": "alb-mercadofresco-tienda-1234567890.eu-west-1.elb.amazonaws.com",
    "Port": 443,
    "ResourcePath": "/salud",
    "RequestInterval": 30,
    "FailureThreshold": 3,
    "MeasureLatency": true,
    "EnableSNI": true
  }' \
  --query 'HealthCheck.Id' --output text)

aws route53 change-tags-for-resource --profile mercadofresco-dev \
  --resource-type healthcheck --resource-id "$HC_ID" \
  --add-tags Key=Name,Value=hc-mercadofresco-tienda Key=Proyecto,Value=mercadofresco \
             Key=Entorno,Value=produccion Key=Componente,Value=tienda \
             Key=Propietario,Value=marta Key=CentroCoste,Value=operaciones

Detalles importantes:

  • Usa la misma ruta /salud que el ALB de 03-03, y por las mismas razones: debe ser rápida y local.
  • Los comprobadores de Route 53 vienen de internet, desde unas 15 ubicaciones. El destino tiene que ser públicamente accesible; una comprobación contra una instancia en subred privada nunca pasará.
  • Con RequestInterval: 30 y FailureThreshold: 3, un fallo se detecta en unos 90 segundos. Hay una opción de 10 segundos (fast interval) que cuesta más.
  • MeasureLatency: true añade gráficas de latencia por región, muy útiles y sin coste extra.
  • Coste: 0,50 USD al mes por comprobación de un destino de AWS, 0,75 USD si es externo.

Políticas de enrutamiento, una por una

Aquí Route 53 deja de ser «una tabla de nombres» y se convierte en una herramienta de arquitectura. Cada política responde una pregunta distinta.

flowchart TD
    Q{"¿Cuántos destinos<br/>para el mismo nombre?"}
    Q -->|Uno| S["<b>Simple</b><br/>Devuelve siempre lo mismo"]
    Q -->|Varios| Q2{"¿Qué decide<br/>a cuál va cada visitante?"}
    Q2 -->|"Un % que yo fijo"| P["<b>Ponderada</b><br/>Canario del 10 %"]
    Q2 -->|"El más rápido"| L["<b>Latencia</b><br/>Multirregión"]
    Q2 -->|"Su país"| G["<b>Geolocalización</b><br/>Portugal en portugués"]
    Q2 -->|"El principal, si vive"| F["<b>Conmutación por error</b><br/>Página de mantenimiento"]
    Q2 -->|"Todos los sanos"| M["<b>Multivalor</b><br/>Reparto simple con salud"]

Simple

Un nombre, un destino. Es la política por defecto y la que usa MercadoFresco para casi todo.

Nombre Tipo Destino
mercadofresco.example A (alias) Distribución de CloudFront
www.mercadofresco.example A (alias) Distribución de CloudFront

No admite comprobaciones de estado. Si el destino cae, Route 53 sigue devolviéndolo.

Ponderada: el canario del 10 %

Se asigna un peso a cada destino y Route 53 reparte proporcionalmente: peso del destino ÷ suma de todos los pesos.

Caso de MercadoFresco: Luis va a desplegar la versión nueva de la tienda y quiere que solo el 10 % de los clientes la reciba, para poder medir errores antes de exponerla a todos.

Identificador Peso Destino % del tráfico
tienda-estable 90 tg-mercadofresco-tienda (versión actual) 90 %
tienda-canario 10 tg-mercadofresco-tienda-nueva 10 %
{
  "Comment": "Despliegue canario al 10 % de la nueva version de la tienda",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "tienda.mercadofresco.example",
        "Type": "A",
        "SetIdentifier": "tienda-estable",
        "Weight": 90,
        "AliasTarget": {
          "HostedZoneId": "Z32O12XQLNTSW2",
          "DNSName": "alb-mercadofresco-tienda-1234567890.eu-west-1.elb.amazonaws.com",
          "EvaluateTargetHealth": true
        }
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "tienda.mercadofresco.example",
        "Type": "A",
        "SetIdentifier": "tienda-canario",
        "Weight": 10,
        "AliasTarget": {
          "HostedZoneId": "Z32O12XQLNTSW2",
          "DNSName": "alb-mercadofresco-nueva-9876543210.eu-west-1.elb.amazonaws.com",
          "EvaluateTargetHealth": true
        }
      }
    }
  ]
}

Tres detalles del JSON:

  • SetIdentifier es obligatorio en toda política que no sea simple: es lo que distingue dos registros con el mismo nombre y tipo.
  • HostedZoneId: Z32O12XQLNTSW2 no es la zona de MercadoFresco: es el identificador de zona del servicio ELB en eu-west-1, un valor fijo publicado por AWS. Cada servicio y región tiene el suyo, y confundirlo con la zona propia es un error habitual. Para CloudFront siempre es Z2FDTNDATAQYW2.
  • EvaluateTargetHealth: true hace que, si un ALB no tiene destinos sanos, Route 53 deje de devolverlo y mande todo el tráfico al otro.

Poner un peso a 0 retira un destino sin borrar el registro: la forma más rápida de abortar un canario. Este mecanismo reaparece en la lección 08-03, cuando CodeDeploy automatice el despliegue progresivo.

Latencia

Route 53 responde con el destino de la región que menor latencia mide para el resolvedor que pregunta. No es «el más cercano geográficamente», sino el más rápido según mediciones reales de AWS.

Escenario futuro de MercadoFresco: si la expansión funciona y se abre una región en eu-central-1 para Alemania, un cliente de Múnich iría a Fráncfort y uno de Sevilla a Irlanda, con el mismo nombre. Hoy, con una sola región, esta política no aporta nada.

Geolocalización

Enruta según de dónde es el visitante: continente, país o, en Estados Unidos, estado. Es una decisión de contenido, no de rendimiento.

Caso de MercadoFresco: abrir en Portugal con la tienda en portugués y precios en su IVA.

SetIdentifier Ubicación Destino
es País ES tg-mercadofresco-tienda (español)
pt País PT tg-mercadofresco-tienda-pt (portugués)
defecto * (por defecto) tg-mercadofresco-tienda (español)
# El registro por defecto es OBLIGATORIO: sin él, un visitante de un país
# no contemplado no recibe NINGUNA respuesta (NXDOMAIN)
aws route53 change-resource-record-sets --profile mercadofresco-dev \
  --hosted-zone-id "$ZONA_PUB" --change-batch '{
    "Changes": [{
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "mercadofresco.example",
        "Type": "A",
        "SetIdentifier": "defecto",
        "GeoLocation": { "CountryCode": "*" },
        "AliasTarget": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "DNSName": "d111111abcdef8.cloudfront.net",
          "EvaluateTargetHealth": false
        }
      }
    }]
  }'

El registro por defecto es la parte que se olvida y provoca la incidencia más difícil de reproducir: todo funciona en la oficina y un cliente de Andorra recibe «servidor no encontrado».

Existe además el enrutamiento por proximidad geográfica (geoproximity), que permite desplazar el reparto con un sesgo numérico —«amplía un 30 % el radio de la región de Irlanda»— y que solo se puede configurar con Route 53 Traffic Flow.

Conmutación por error: la página de mantenimiento

Un destino primario y otro secundario. Route 53 devuelve el primario mientras su comprobación de estado esté sana; si falla, devuelve el secundario.

Caso de MercadoFresco: si el ALB cae entero, en vez de un error de conexión, los clientes ven una página estática alojada en S3 explicando la situación y con el teléfono de atención.

flowchart LR
    C["Cliente"] --> R53["Route 53<br/>mercadofresco.example"]
    HC{{"Comprobación de estado<br/>hc-mercadofresco-tienda<br/>/salud cada 30 s"}}
    R53 -.consulta.-> HC
    HC -->|"Sano"| ALB["PRIMARIO<br/>alb-mercadofresco-tienda"]
    HC -->|"No sano"| S3["SECUNDARIO<br/>mercadofresco-mantenimiento<br/>(sitio estático en S3)"]
{
  "Comment": "Conmutacion por error hacia la pagina de mantenimiento",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "directo.mercadofresco.example",
        "Type": "A",
        "SetIdentifier": "primario-alb",
        "Failover": "PRIMARY",
        "HealthCheckId": "abcdef01-2345-6789-abcd-ef0123456789",
        "AliasTarget": {
          "HostedZoneId": "Z32O12XQLNTSW2",
          "DNSName": "alb-mercadofresco-tienda-1234567890.eu-west-1.elb.amazonaws.com",
          "EvaluateTargetHealth": true
        }
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "directo.mercadofresco.example",
        "Type": "A",
        "SetIdentifier": "secundario-mantenimiento",
        "Failover": "SECONDARY",
        "AliasTarget": {
          "HostedZoneId": "Z1BKCTXD74EZPE",
          "DNSName": "s3-website-eu-west-1.amazonaws.com",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}

La página de mantenimiento vive en un bucket de sitio estático (técnica de 02-03) que debe llamarse exactamente igual que el nombre DNS: directo.mercadofresco.example. Es un requisito de S3 para alojar sitios web con dominio propio.

Y la limitación honesta: el DNS tiene caché. Si el TTL es de 300 segundos, algunos clientes seguirán yendo al ALB caído durante cinco minutos. Por eso la conmutación por error de DNS es una red de seguridad de último recurso, y la alta disponibilidad de verdad es la que ya montamos: dos zonas de disponibilidad detrás de un mismo ALB, que conmuta en segundos y sin depender del DNS.

Multivalor

Devuelve hasta ocho registros sanos a la vez, elegidos al azar, y el cliente prueba uno. Es como el reparto por turnos clásico del DNS, pero con comprobaciones de estado: los destinos caídos no se devuelven.

No es un balanceador: no mide carga, no drena conexiones y depende de que el cliente reintente. Sirve para destinos que no están detrás de un ALB, por ejemplo un conjunto de servidores de correo o de API internas. MercadoFresco no lo necesita, teniendo un ALB.

Tabla resumen

Política Decide según Necesita SetIdentifier Usa comprobaciones de estado Caso en MercadoFresco
Simple Nada No No mercadofresco.example → CloudFront
Ponderada Porcentaje fijado Canario del 10 % (reaparece en 08-03)
Latencia Región más rápida Futuro multirregión
Geolocalización País del visitante Apertura en Portugal
Geoproximidad Distancia con sesgo Requiere Traffic Flow
Conmutación por error Salud del primario Obligatorias Página de mantenimiento en S3
Multivalor Azar entre los sanos No aplica: hay ALB

Las políticas se pueden anidar con Traffic Flow: primero geolocalización por país y, dentro de cada país, ponderada para el canario. Es la forma de combinar «Portugal ve la tienda portuguesa» con «el 10 % de los portugueses ve la versión nueva».

Configurar el DNS de MercadoFresco por consola y por CLI

Por consola, en resumen

  1. Route 53 → Zonas alojadas → mercadofresco.example.
  2. Crear registro. Nombre en blanco para el vértice.
  3. Activar Alias, elegir «Alias a distribución de CloudFront» y seleccionar la distribución.
  4. Política de enrutamiento: Simple. Guardar.
  5. Repetir con www, esta vez «Alias a otro registro de esta zona» → el vértice.
  6. Para los registros MX, TXT y CAA: desactivar Alias e introducir los valores, uno por línea.

La consola tiene una ventaja real aquí: al elegir un destino de alias lo ofrece en una lista, así que no hay forma de equivocarse con el HostedZoneId del servicio.

Por CLI, con el fichero de cambios completo

change-resource-record-sets aplica un lote de cambios de forma atómica: o se aplican todos o ninguno.

{
  "Comment": "Configuracion DNS completa de MercadoFresco",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "mercadofresco.example",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "DNSName": "d111111abcdef8.cloudfront.net",
          "EvaluateTargetHealth": false
        }
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "mercadofresco.example",
        "Type": "AAAA",
        "AliasTarget": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "DNSName": "d111111abcdef8.cloudfront.net",
          "EvaluateTargetHealth": false
        }
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "www.mercadofresco.example",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "DNSName": "d111111abcdef8.cloudfront.net",
          "EvaluateTargetHealth": false
        }
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "admin.mercadofresco.example",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z32O12XQLNTSW2",
          "DNSName": "alb-mercadofresco-tienda-1234567890.eu-west-1.elb.amazonaws.com",
          "EvaluateTargetHealth": true
        }
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "mercadofresco.example",
        "Type": "MX",
        "TTL": 3600,
        "ResourceRecords": [
          { "Value": "10 mx1.proveedorcorreo.example" },
          { "Value": "20 mx2.proveedorcorreo.example" }
        ]
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "mercadofresco.example",
        "Type": "TXT",
        "TTL": 3600,
        "ResourceRecords": [
          { "Value": "\"v=spf1 include:_spf.proveedorcorreo.example -all\"" }
        ]
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "mercadofresco.example",
        "Type": "CAA",
        "TTL": 3600,
        "ResourceRecords": [
          { "Value": "0 issue \"amazon.com\"" },
          { "Value": "0 issuewild \"amazon.com\"" },
          { "Value": "0 iodef \"mailto:[email protected]\"" }
        ]
      }
    }
  ]
}
CAMBIO=$(aws route53 change-resource-record-sets --profile mercadofresco-dev \
  --hosted-zone-id "$ZONA_PUB" \
  --change-batch file://dns-mercadofresco.json \
  --query 'ChangeInfo.Id' --output text)

# Esperar a que el cambio se propague a todos los servidores de Route 53
aws route53 wait resource-record-sets-changed --profile mercadofresco-dev --id "$CAMBIO"

# Verificar el resultado
aws route53 list-resource-record-sets --profile mercadofresco-dev \
  --hosted-zone-id "$ZONA_PUB" \
  --query 'ResourceRecordSets[].{Nombre:Name,Tipo:Type,TTL:TTL,
           Alias:AliasTarget.DNSName,Valores:ResourceRecords[].Value}' \
  --output table

Notas sobre este lote:

  • UPSERT crea el registro si no existe y lo actualiza si existe. Es idempotente, lo que lo hace seguro de reejecutar. CREATE fallaría en la segunda ejecución y DELETE exige que los valores coincidan exactamente.
  • Los registros de alias no llevan TTL: lo gestiona AWS.
  • El registro TXT lleva comillas dentro del valor, escapadas en el JSON. Es un error habitual omitirlas.
  • Z2FDTNDATAQYW2 es el identificador de zona de CloudFront, idéntico en el mundo entero; Z32O12XQLNTSW2 es el de ELB en eu-west-1.

Comprobación desde fuera, que es lo único que confirma que funciona de verdad:

# Consultar directamente a los servidores autoritativos, saltándose las cachés
dig +short mercadofresco.example @ns-123.awsdns-45.com

# Ver la cadena completa de resolución
dig +trace www.mercadofresco.example

# Confirmar que el HTTPS ya funciona con el certificado correcto
curl -sI https://mercadofresco.example | head -5
openssl s_client -connect mercadofresco.example:443 -servername mercadofresco.example </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -dates

Route 53 Resolver y las reglas de reenvío hacia la oficina

El Route 53 Resolver es el resolvedor que vive en la dirección .2 de la VPC (10.0.0.2) y que ya conocimos en 03-01. Además de resolver nombres de AWS y de las zonas privadas, admite dos tipos de regla para conectarse con la red de la oficina:

Tipo Dirección Qué hace
Endpoint de salida (outbound) + regla de reenvío VPC → oficina Las consultas sobre mercadofresco.local se reenvían al DNS de la oficina
Endpoint de entrada (inbound) Oficina → VPC La oficina puede resolver bd.interno.mercadofresco.example

Su uso real requiere la conectividad de red que solo aporta una VPN o Direct Connect, que mencionamos en 03-01 y que queda fuera del alcance de este curso. Coste orientativo: cada endpoint son dos ENI y cuesta unos 0,125 USD por hora por ENI, así que no es un recurso para dejar encendido por curiosidad.

Costes de Route 53 y limpieza

⚠️ Aviso de coste

Concepto Precio MercadoFresco
Zona alojada 0,50 USD/mes cada una (las 25 primeras) 2 zonas → 1,00 USD/mes
Consultas estándar 0,40 USD por millón (primeros 1.000 M) ~1,2 M → 0,48 USD
Consultas resueltas por alias a recursos de AWS Gratuitas La mayoría → 0,00 USD
Consultas de enrutamiento especial (latencia, geo) 0,60 USD por millón Marginal
Comprobación de estado (destino de AWS) 0,50 USD/mes 1 → 0,50 USD/mes
Comprobación de estado (destino externo) 0,75 USD/mes
Registro del dominio Según el TLD, anual
Total estimado ≈ 1,60 USD/mes

Route 53 es, con diferencia, lo más barato del módulo. Pero hay un detalle desagradable: la zona alojada se cobra desde el momento en que se crea, aunque no tenga registros, y se cobran las 12 primeras horas aunque la borres. Crear y borrar zonas para practicar no sale gratis.

Limpieza (hay que vaciar la zona antes de borrarla; los registros NS y SOA se van solos):

# Borrar todos los registros que no sean NS ni SOA
aws route53 list-resource-record-sets --profile mercadofresco-dev \\
  --hosted-zone-id "$ZONA_PUB" \\
  --query 'ResourceRecordSets[?Type!=`NS` && Type!=`SOA`]' > registros.json
# (construir el change-batch con "Action": "DELETE" para cada uno y aplicarlo)

aws route53 delete-hosted-zone --profile mercadofresco-dev --id "$ZONA_PUB"
aws route53 delete-health-check --profile mercadofresco-dev --health-check-id "$HC_ID"

Lo que no se puede deshacer: el registro de un dominio no es reembolsable y no se puede cancelar. Solo se registra un dominio cuando se va a usar de verdad.

Cierre del módulo: la arquitectura de red completa

flowchart TB
    U["Clientes<br/>España y Portugal"]
    R53(["<b>Route 53</b><br/>mercadofresco.example<br/>alias A/AAAA · TTL gestionado"])
    CF["<b>CloudFront</b> · PriceClass_100<br/>~700 edge locations · HTTP/3<br/>certificado ACM (us-east-1)"]

    subgraph AWS["Cuenta 111122223333 — eu-west-1 (Irlanda)"]
        subgraph VPC["vpc-mercadofresco — 10.0.0.0/16"]
            subgraph PUB["Subredes públicas · 10.0.0.0/20 y 10.0.16.0/20"]
                ALB["<b>alb-mercadofresco-tienda</b><br/>sg-mercadofresco-alb<br/>HTTPS 443 · TLS 1.2/1.3<br/>redirección 80 → 443"]
                NAT["NAT Gateway ×2"]
            end
            subgraph APP["Subredes de aplicación · 10.0.32.0/20 y 10.0.48.0/20"]
                A1["asg-mercadofresco-tienda<br/>eu-west-1a<br/>sg-mercadofresco-tienda"]
                A2["asg-mercadofresco-tienda<br/>eu-west-1b<br/>sg-mercadofresco-tienda"]
            end
            subgraph DAT["Subredes de datos · 10.0.64.0/20 y 10.0.80.0/20 — sin salida a internet"]
                DB[("<b>mercadofresco-pedidos</b><br/>PostgreSQL 16 Multi-AZ<br/>sg-mercadofresco-basedatos")]
                EFS["efs-mercadofresco-fotos"]
            end
            VPCE(["vpce-mercadofresco-s3<br/>(gratuito)"])
        end
        S3[("<b>mercadofresco-catalogo-fotos</b><br/>cerrado con OAC<br/>solo la distribución E2QWERTY123ABC")]
        LOG[("mercadofresco-registros-web<br/>ALB + CloudFront + Flow Logs")]
    end

    U --> R53 --> CF
    CF -->|"/productos/* · /miniaturas/*<br/>90 % desde caché"| S3
    CF -->|"HTML y /api/*<br/>https-only"| ALB
    ALB --> A1
    ALB --> A2
    A1 --> DB
    A2 --> DB
    A1 --> EFS
    A1 --> VPCE --> S3
    A1 -.-> NAT
    ALB -.-> LOG
    CF -.-> LOG

Qué queda resuelto al terminar el módulo 3

Problema del curso Estado Cómo
1. Caídas de los viernes Resuelto ASG en 2 AZ + ALB con comprobaciones de estado: 2.400 ped/h de capacidad frente a 900 de demanda, y se aguanta perdiendo una AZ entera
2. Copias no fiables Resuelto (módulo 2) Snapshots DLM, versionado de S3, PITR de RDS
3. No poder crecer a más ciudades Encaminado Red multi-AZ reproducible, CloudFront global, geolocalización lista para Portugal
4. Despliegues arriesgados Encaminado Enrutamiento ponderado para el canario del 10 %; falta la automatización (módulo 8)

Y en dinero, la red completa de MercadoFresco:

Componente Coste mensual aproximado
2 NAT Gateway ≈ 70 USD
ALB (horas + LCU) ≈ 37 USD
CloudFront (dentro de la capa gratuita) ≈ 0 USD
Route 53 (2 zonas + 1 comprobación) ≈ 1,60 USD
Endpoint de S3 de puerta de enlace 0 USD
Total de red ≈ 109 USD/mes
Ahorro conseguido en transferencia de S3 −27 USD/mes

Los dos NAT Gateway son el 64 % del gasto de red y serán el primer candidato a revisar en la lección 11-03 con Cost Explorer.

Qué queda pendiente

La red está construida y protegida a nivel de paquetes, pero quedan cuatro huecos que son exactamente el contenido del módulo 4:

  • Permisos finos: quién puede hacer qué en la cuenta. Hoy hay un usuario admin y roles creados a medida, sin política de mínimo privilegio sistemática → 04-01, IAM.
  • Cifrado gestionado: la clave alias/mercadofresco-datos existe, pero no se ha estudiado cómo se gobierna, se rota ni se comparte → 04-02, KMS.
  • Secretos: la contraseña de mfadmin sigue estando donde no debería → 04-03, Secrets Manager y Parameter Store.
  • Protección frente a ataques: la NACL con la que bloqueamos una IP en 03-02 no escala, y una denegación de servicio distribuida tumbaría la tienda pese a todo lo montado → 04-04, Shield y 04-05, WAF, ambos aplicados en el borde de CloudFront.

Errores Comunes y Consejos

Intentar poner un CNAME en el vértice del dominio. Está prohibido por el estándar. La respuesta siempre es un registro de alias.

Olvidar el registro por defecto en geolocalización. Un visitante de un país no contemplado no recibe respuesta. Crea siempre el registro con CountryCode: "*".

Confundir el HostedZoneId del alias con el de tu zona. El del AliasTarget es el del servicio de destino (Z2FDTNDATAQYW2 para CloudFront, uno distinto por región para ELB), no el de mercadofresco.example.

Pedir el certificado de CloudFront en la región equivocada. Debe estar en us-east-1. Ya salió en 03-04 y sigue siendo la trampa más repetida.

Borrar el registro CNAME de validación de ACM. Parece basura y no lo es: sin él, ACM no puede renovar el certificado y este caducará en un año, silenciosamente.

No bajar el TTL antes de una migración. Si migras con TTL de 86.400, algunos clientes irán al destino antiguo durante un día entero. Bájalo a 60 con días de antelación.

Confiar la alta disponibilidad al DNS. La conmutación por error de Route 53 está limitada por la caché de los resolvedores. La disponibilidad real la da el ALB entre dos AZ, en segundos y sin depender del DNS.

Usar CNAME donde cabe un alias. Cuesta dinero en consultas, añade una consulta extra de latencia y no evalúa la salud del destino.

Olvidar la renovación automática del dominio. Un dominio caducado es una empresa desaparecida de internet, y recuperarlo puede ser imposible si alguien lo registra.

Consejo de oro: después de cada cambio de DNS, verifica con dig +short <nombre> @<servidor autoritativo> en vez de abrir el navegador. El navegador y el sistema operativo tienen sus propias cachés y te harán creer que el cambio no ha funcionado durante minutos.

Ejercicios

Ejercicio 1: diseñar el DNS de la apertura en Portugal

MercadoFresco abre en Portugal. Requisitos: los visitantes de Portugal deben ver la tienda portuguesa (un grupo de destino distinto en el mismo ALB), los de España la española, y cualquier otro país la española; además, el 10 % de los visitantes portugueses debe recibir la versión nueva de la tienda para probarla; y si el ALB cae, todo el mundo debe ver la página de mantenimiento. Diseña la estructura de registros indicando políticas, identificadores y anidamiento.

Ejercicio 2: diagnosticar un dominio que no resuelve

Marta ha creado la zona alojada, ha añadido el alias al vértice y mercadofresco.example sigue sin funcionar 24 horas después, mientras que dig @ns-123.awsdns-45.com mercadofresco.example sí responde correctamente. Explica qué está pasando y escribe las comprobaciones, en orden, para confirmarlo.

Ejercicio 3: calcular el coste anual del DNS y decidir el TTL

MercadoFresco recibe 5 millones de consultas DNS al mes, de las cuales el 80 % se resuelven por alias hacia CloudFront. Tiene 2 zonas alojadas y 3 comprobaciones de estado, una de ellas contra un proveedor externo. Calcula el coste anual, y estima cuánto ahorraría subiendo el TTL de los registros no-alias de 300 a 3.600 segundos.

Soluciones

Solución 1

Hacen falta dos niveles anidados, y como Route 53 no permite anidar políticas directamente en un mismo nombre, se resuelve con nombres intermedios (que es exactamente lo que hace Traffic Flow por dentro).

Nivel 1 — geolocalización en mercadofresco.example:

SetIdentifier GeoLocation Destino
geo-es CountryCode: ES alias → es.mercadofresco.example
geo-pt CountryCode: PT alias → pt.mercadofresco.example
geo-defecto CountryCode: * alias → es.mercadofresco.example

Nivel 2 — ponderación en pt.mercadofresco.example (solo Portugal lleva canario):

SetIdentifier Peso Destino
pt-estable 90 alias → ALB (grupo de destino portugués actual)
pt-canario 10 alias → ALB (grupo de destino portugués nuevo)

Nivel 2 — es.mercadofresco.example: política simple, alias al ALB con EvaluateTargetHealth: true.

Conmutación por error: se aplica en el nivel 2, en es y en pt, cada uno con su par primario/secundario apuntando al bucket de mantenimiento. Ponerla en el nivel 1 no funcionaría, porque geolocalización y conmutación por error no se pueden combinar en el mismo conjunto de registros.

Detalles que hacen que esto funcione de verdad:

  • El registro geo-defecto es imprescindible: sin él, un cliente de Andorra o de Francia no recibe respuesta.
  • Los alias a es. y pt. son alias a otro registro de la misma zona, que también son gratuitos.
  • Un canario del 10 % limitado a Portugal expone unos pocos cientos de clientes a la versión nueva: suficiente para detectar errores, poco para causar daño. Poner el peso de pt-canario a 0 aborta el despliegue en un minuto.
  • En la práctica, y para más de dos niveles, se usaría Route 53 Traffic Flow, que permite dibujar el árbol de decisión y versionar la política.

Solución 2

El síntoma es inequívoco: Route 53 responde correctamente cuando se le pregunta directamente, pero el mundo no llega a preguntárselo. Eso significa que la delegación no está hecha: los servidores de nombres del registrador siguen apuntando a otro sitio.

# 1. ¿Qué servidores de nombres tiene asignados la zona en Route 53?
aws route53 get-hosted-zone --profile mercadofresco-dev --id "$ZONA_PUB" \
  --query 'DelegationSet.NameServers' --output text
# 2. ¿Qué servidores de nombres publica realmente el TLD? (la comprobación decisiva)
dig NS mercadofresco.example @a.gtld-servers.net

Si los cuatro nombres de los pasos 1 y 2 no coinciden, ahí está el problema.

# 3. Si el dominio está registrado en Route 53, comprobar y corregir
aws route53domains get-domain-detail --profile mercadofresco-dev --region us-east-1 \
  --domain-name mercadofresco.example --query 'Nameservers[].Name'

aws route53domains update-domain-nameservers --profile mercadofresco-dev --region us-east-1 \
  --domain-name mercadofresco.example \
  --nameservers Name=ns-123.awsdns-45.com Name=ns-456.awsdns-78.net \
                Name=ns-789.awsdns-01.org Name=ns-012.awsdns-34.co.uk

Segunda causa posible, si los NS sí coinciden: existen dos zonas alojadas para el mismo dominio (es fácil crear una duplicada), y los registros se añadieron a la que no está delegada. Cada zona tiene servidores de nombres distintos.

aws route53 list-hosted-zones --profile mercadofresco-dev \
  --query 'HostedZones[?Name==`mercadofresco.example.`].{Id:Id,Registros:ResourceRecordSetCount}'

Si devuelve más de una, hay que quedarse con la delegada y borrar la otra.

Tercera causa: una zona privada con el mismo nombre que la pública, asociada a la VPC. Desde dentro de la VPC se resolvería la privada y desde fuera la pública, dando resultados contradictorios según desde dónde se pruebe. Es el llamado split-horizon DNS, útil cuando es intencionado y muy confuso cuando no lo es.

Cuarta causa, la más trivial: la caché local. Se descarta comparando dig +short mercadofresco.example (con caché) con dig +short mercadofresco.example @8.8.8.8 (resolvedor externo).

Solución 3

Coste mensual:

Concepto Cálculo Coste
Zonas alojadas 2 × 0,50 USD 1,00 USD
Consultas por alias (80 % de 5 M = 4 M) Gratuitas 0,00 USD
Consultas estándar (20 % = 1 M) 1 × 0,40 USD/millón 0,40 USD
Comprobaciones de destino AWS 2 × 0,50 USD 1,00 USD
Comprobación de destino externo 1 × 0,75 USD 0,75 USD
Total mensual 3,15 USD

Coste anual: 37,80 USD.

Efecto de subir el TTL de 300 a 3.600 segundos. Solo afecta al millón de consultas no-alias, que son las que se cobran. Multiplicar el TTL por 12 reduce las consultas que llegan a Route 53 aproximadamente en la misma proporción, aunque no exactamente: hay muchos resolvedores distintos, cada uno con su propia caché, y algunos clientes ignoran los TTL largos. Con una reducción conservadora del 70 %:

  • Consultas facturables: 1.000.000 → ~300.000
  • Coste de consultas: 0,40 → 0,12 USD/mes
  • Ahorro: 0,28 USD/mes, 3,36 USD al año.

Conclusión honesta del ejercicio: no merece la pena. Ahorrar 3 dólares al año a cambio de que cualquier cambio de DNS tarde una hora en propagarse es un mal negocio. El TTL debe elegirse por criterios operativos —cuánto tardas en poder revertir un cambio— y no por coste, salvo a escalas de cientos de millones de consultas.

Donde sí hay una decisión económica real es en las comprobaciones de estado: 2,10 USD al mes en tres comprobaciones es más que las consultas y las zonas juntas. Y donde de verdad se ahorra dinero es en el 80 % de consultas resueltas por alias: si esos 4 millones fueran CNAME, costarían 1,60 USD al mes adicionales, cinco veces más que todas las consultas facturables actuales.

Conclusión

MercadoFresco está en internet. mercadofresco.example responde, con HTTPS válido, servido desde la edge location más cercana a cada cliente, sobre una red diseñada, filtrada y repartida en dos zonas de disponibilidad. Sabes cómo funciona el DNS de verdad —zonas, delegación por registros NS, resolución recursiva y el papel de la caché—, sabes que Route 53 solo cobra las consultas que le llegan y que el TTL es una decisión operativa: 300 segundos en producción y 60 con días de antelación antes de una migración. Distingues las tres funciones separadas del servicio: registro de dominios, DNS autoritativo y comprobaciones de estado.

Has creado la zona pública de mercadofresco.example y la zona privada interno.mercadofresco.example asociada a vpc-mercadofresco, que solo funciona porque en 03-01 activamos enableDnsHostnames. Conoces los tipos de registro y has añadido un CAA que impide que ninguna autoridad distinta de Amazon emita certificados para el dominio. Y entiendes la limitación que lo explica todo: el vértice de un dominio no puede tener un CNAME, porque ya tiene SOA y NS. De ahí los registros de alias, que son propios de Route 53, funcionan en el vértice, devuelven la IP en una sola consulta, son gratuitos y evalúan la salud del destino con EvaluateTargetHealth. Sabes que el HostedZoneId de un alias es el del servicio de destinoZ2FDTNDATAQYW2 para CloudFront— y no el de tu zona.

Has creado el registro CNAME que valida los certificados de ACM y has cerrado el HTTPS que quedaba pendiente de 03-03 y 03-04, sabiendo que ese registro no debe borrarse nunca porque es lo que permite la renovación automática. Has montado una comprobación de estado contra /salud y has recorrido las políticas de enrutamiento con un caso real de MercadoFresco para cada una: simple para el vértice, ponderada para el canario del 10 % que reaparecerá en 08-03, latencia para el futuro multirregión, geolocalización para la apertura en Portugal —con el registro por defecto que casi todo el mundo olvida—, conmutación por error hacia la página de mantenimiento en S3, y multivalor para destinos sin balanceador. Has aplicado el DNS completo con change-resource-record-sets y UPSERT, has verificado con dig contra los servidores autoritativos, y sabes que Route 53 cuesta a MercadoFresco 1,60 USD al mes: lo más barato de todo el módulo.

Con esto el módulo 3 queda cerrado. La arquitectura de MercadoFresco es hoy: cliente → Route 53 → CloudFront → ALB → grupo de Auto Scaling en dos zonas de disponibilidad → RDS Multi-AZ en subredes privadas sin salida a internet, con el catálogo en S3 cerrado por Origin Access Control y todos los registros en mercadofresco-registros-web. El problema 1, las caídas de los viernes, está resuelto con 2.400 pedidos/hora de capacidad frente a 900 de demanda, incluso perdiendo una zona entera. El problema 3, crecer a más ciudades, tiene ya la infraestructura preparada, y el problema 4, los despliegues arriesgados, tiene el mecanismo de canario listo a la espera de la automatización del módulo 8.

Pero toda esta arquitectura descansa sobre supuestos que aún no hemos examinado. Hay un usuario administrador con permisos amplios y roles creados sobre la marcha sin una política sistemática de mínimo privilegio. La contraseña de mfadmin sigue estando donde no debería. La clave KMS alias/mercadofresco-datos existe pero nadie ha decidido quién puede usarla ni cada cuánto rota. Y la regla DENY numerada 50 con la que bloqueamos una IP abusiva es completamente inútil frente a un ataque distribuido desde diez mil direcciones. En el módulo 4, «Seguridad e identidad», empezando por la lección 04-01 «AWS Identity and Access Management (IAM)», construiremos la capa que falta: identidades, políticas y permisos mínimos; después el cifrado gestionado con KMS, la custodia de secretos con Secrets Manager y Parameter Store, y la protección del borde con Shield y WAF, aplicada justo delante de la distribución de CloudFront que acabas de montar.

Curso de AWS

Módulo 1: Introducción a AWS

Módulo 2: Servicios principales de AWS

Módulo 3: Redes y entrega de contenido

Módulo 4: Seguridad e identidad

Módulo 5: Monitorización y gestión

Módulo 6: Bases de datos

Módulo 7: Integración de aplicaciones

Módulo 8: Herramientas para desarrolladores

Módulo 9: Infraestructura como código y gobierno de cuentas

Módulo 10: Contenedores en AWS

Módulo 11: Mejores prácticas y gestión de costos

© Copyright 2026. Todos los derechos reservados