AWS Config cerró la lección anterior con una limitación honesta: comprueba las reglas que tú le has dicho. Es exacto y es potente, pero no puede avisarte de lo que no se te ha ocurrido preguntar.

Nadie ha escrito una regla que diga «avísame si tengo volúmenes EBS huérfanos costando dinero», porque para escribirla habría que sospechar primero que existen. Nadie ha escrito una regla sobre las IP elásticas sin asociar, que se facturan precisamente por no usarse. Y desde luego nadie ha escrito una regla sobre el límite de vCPU de la cuenta, que —como veremos en esta lección— es la razón real por la que asg-mercadofresco-tienda no puede pasar de cuatro instancias.

AWS Trusted Advisor hace ese repaso. Compara tu cuenta con un catálogo de buenas prácticas que AWS ha destilado de millones de clientes, y te dice lo que no habías pensado en preguntar. No es una herramienta de detección en tiempo real ni un sustituto de nada de lo anterior: es el repaso automático, el equivalente a que alguien con mucha experiencia mire tu cuenta una vez al mes y te señale las cosas obvias que llevas sin ver desde hace meses porque estás demasiado cerca.

Con esta lección se cierra el módulo 5, y con él la capa de observabilidad de MercadoFresco.

Contenido

  1. Qué es Trusted Advisor y en qué se diferencia de Config
  2. Y en qué se diferencia de Well-Architected
  3. Las cinco categorías
  4. Qué comprueba cada categoría
  5. Qué ves según el plan de soporte
  6. Cómo suplir lo que el plan Basic no da
  7. Recorrido comentado de un informe de MercadoFresco
  8. Cuotas de servicio: el límite invisible
  9. El caso del ASG que no pasa de cuatro instancias
  10. Solicitar un aumento de cuota
  11. Alarmar antes de chocar con una cuota
  12. Automatización: API, exportación y notificaciones
  13. Integración con EventBridge
  14. Compute Optimizer y Cost Optimization Hub
  15. La rutina de revisión mensual de Marta
  16. Cierre del módulo: la capa de observabilidad completa
  17. Las cinco preguntas del módulo 4, respondidas
  18. Coste total añadido
  19. Lo que viene: el cuello de botella se ha movido

Qué es Trusted Advisor y en qué se diferencia de Config

AWS Config (05-04) Trusted Advisor
Qué evalúa Tus reglas Las buenas prácticas de AWS
Quién define los criterios AWS
Personalizable , totalmente Muy poco (algunos umbrales)
Alcance Los recursos que grabas Toda la cuenta, siempre
Latencia Minutos Refresco cada 24 h (o manual)
Remedia No
Detecta lo que no previste No
Coste Por CI y evaluación Incluido en el plan de soporte
Historial , línea temporal No

La diferencia de fondo: Config responde preguntas; Trusted Advisor las hace.

Un ejemplo que lo aclara. MercadoFresco tiene una regla de Config que comprueba que todos los volúmenes EBS están cifrados. Perfecto. Pero ninguna regla comprueba si un volumen sirve para algo, porque a nadie se le ocurrió. Trusted Advisor lo señala sin que nadie se lo pida: «tienes 3 volúmenes en estado available, sin conectar a nada, que llevan costando 24 USD al mes desde marzo».

No compiten. Trusted Advisor te da el hallazgo; Config lo convierte en una regla permanente. El flujo natural es: Trusted Advisor descubre un problema que no habías previsto → escribes una regla de Config para que no vuelva a pasar → la remediación lo corrige sola. Ese es el ciclo completo.

Y en qué se diferencia de Well-Architected

Trusted Advisor Well-Architected (11-01)
Naturaleza Automático Cuestionario guiado
Frecuencia Continuo, refresco 24 h Revisión puntual, trimestral o anual
Nivel Recursos concretos Decisiones de arquitectura
Ejemplo «Este volumen está huérfano» «¿Cómo gestionas la recuperación ante desastres?»
Quién participa Nadie: sale solo El equipo, en una sesión de horas
Resultado Lista de hallazgos Plan de mejora con riesgos priorizados
Coste Incluido en el soporte La herramienta es gratuita

Trusted Advisor mira hacia abajo, a los recursos. Well-Architected mira hacia arriba, a las decisiones. Trusted Advisor te dice que una instancia está infrautilizada; Well-Architected te pregunta si tu estrategia de escalado es adecuada para tu patrón de tráfico. Los dos usan los mismos cinco o seis pilares como marco conceptual, y de hecho las categorías de Trusted Advisor son casi los pilares de Well-Architected, pero operan a alturas distintas.

Well-Architected se estudia en 11-01, abriendo el módulo de buenas prácticas y costes.

Las cinco categorías

flowchart TD
    TA["AWS Trusted Advisor"]
    TA --> C1["OPTIMIZACION DE COSTES<br/>Recursos infrautilizados<br/>o sin usar"]
    TA --> C2["RENDIMIENTO<br/>Configuraciones que<br/>limitan la velocidad"]
    TA --> C3["SEGURIDAD<br/>Exposicion, permisos,<br/>cifrado, MFA"]
    TA --> C4["TOLERANCIA A FALLOS<br/>Puntos unicos de fallo,<br/>copias, Multi-AZ"]
    TA --> C5["LIMITES DE SERVICIO<br/>Uso frente a cuota,<br/>aviso al 80%"]
    C1 --> R["Informe con estado por comprobacion"]
    C2 --> R
    C3 --> R
    C4 --> R
    C5 --> R
    R --> V["Verde: correcto"]
    R --> A["Amarillo: investigar"]
    R --> RJ["Rojo: accion recomendada"]

Los tres estados posibles de cada comprobación:

Estado Significa Qué hacer
Verde (sin problemas) No se ha detectado nada Nada
Amarillo (investigar) Puede haber un problema Revisar con criterio
Rojo (acción recomendada) Hay un problema claro Actuar

Y una advertencia que ahorra frustraciones: el amarillo no siempre es un problema. Trusted Advisor no conoce tu contexto. Una instancia al 5 % de CPU puede ser un servidor de respaldo perfectamente justificado. Un bucket sin versionado puede ser un bucket de ficheros temporales. Los hallazgos son hipótesis que hay que evaluar, no órdenes.

Qué comprueba cada categoría

Optimización de costes:

Comprobación Qué busca
Instancias EC2 de baja utilización CPU < 10 % y red baja durante 4+ días de los últimos 14
Volúmenes EBS sin asociar Estado available: se pagan y no sirven para nada
Direcciones IP elásticas sin asociar Se facturan por no usarse
Balanceadores de carga inactivos ALB/NLB sin destinos registrados o sin tráfico
Instancias RDS inactivas Sin conexiones durante 7 días
Uso de instancias reservadas / Savings Plans Recomendaciones de compra (módulo 11)
Snapshots de RDS antiguos Manuales, muy viejos
Redshift y otros servicios inactivos Clústeres sin uso

Rendimiento:

Comprobación Qué busca
Instancias EC2 de alta utilización CPU > 90 % de forma sostenida: falta capacidad
Volúmenes EBS con rendimiento limitado IOPS al máximo del volumen
Aciertos de caché de CloudFront Configuración que impide cachear
CloudFront sin compresión activada Transferencia innecesaria
Grupos de seguridad con muchas reglas Latencia de evaluación
Límites de servicio próximos También aparece aquí

Seguridad:

Comprobación Qué busca
Grupos de seguridad con puertos abiertos sin restricción 0.0.0.0/0 en puertos sensibles
Permisos de bucket de S3 Lectura o escritura pública
MFA en la cuenta raíz La comprobación más importante de todas
Uso de la cuenta raíz Actividad reciente de la raíz
Claves de acceso de IAM expuestas Buscadas en repositorios públicos
Rotación de claves de acceso Claves de más de 90 días
Registro de acceso de S3 y de CloudTrail Activados o no
Certificados ACM próximos a caducar 30 días de antelación
Instantáneas de RDS y EBS públicas Compartidas con «todos»
Política de contraseñas de IAM Requisitos mínimos

Tolerancia a fallos:

Comprobación Qué busca
RDS sin Multi-AZ Punto único de fallo en la base de datos
ASG en una sola zona de disponibilidad Sin tolerancia a fallo de AZ
Balanceadores con destinos en una sola AZ Idem
Volúmenes EBS sin instantáneas recientes Sin copia de seguridad
Retención de copias de RDS Periodo insuficiente
Comprobaciones de estado de Route 53 Sin health checks configurados
Versionado de buckets de S3 Recuperación ante borrados
Túneles VPN redundantes Un solo túnel

Límites de servicio (cuotas):

Comprueba el uso frente a la cuota de decenas de servicios y avisa cuando se supera el 80 %. Es la categoría más infravalorada y la que más caídas ha causado en la historia de AWS. Tiene sección propia más abajo.

Qué ves según el plan de soporte

Aquí toca ser completamente honesto, porque es donde más decepciones hay:

Plan de soporte Coste Comprobaciones de Trusted Advisor
Basic 0 USD Un subconjunto: seguridad básica + límites de servicio
Developer 29 USD/mes o 3 % El mismo subconjunto que Basic
Business Desde 100 USD/mes (o ~10 % del gasto) Todas (~115 comprobaciones) + API + notificaciones
Enterprise On-Ramp Desde 5.500 USD/mes Todas + gestor técnico compartido
Enterprise Desde 15.000 USD/mes Todas + gestor técnico dedicado + Well-Architected guiado

Lo que MercadoFresco ve con el plan Basic (0 USD):

Comprobación ¿Disponible?
Grupos de seguridad: puertos específicos sin restricción
Permisos de bucket de S3
MFA en la cuenta raíz
Política de contraseñas de IAM
Instantáneas de RDS públicas
Instantáneas de EBS públicas
Uso de IAM (existencia de usuarios/roles)
Límites de servicio
Claves de acceso expuestas públicamente
Instancias EC2 infrautilizadas No
Volúmenes EBS sin asociar No
IP elásticas sin asociar No
Balanceadores inactivos No
RDS sin Multi-AZ No
ASG en una sola AZ No
Aciertos de caché de CloudFront No
Certificados ACM próximos a caducar No
Recomendaciones de instancias reservadas No
API de Trusted Advisor No
Notificaciones semanales por correo No

Es decir: con el plan Basic, MercadoFresco ve seguridad básica y límites de servicio, que no es poco —son las dos categorías que más caídas evitan— pero no ve nada de coste, rendimiento ni tolerancia a fallos, ni tiene API para automatizar.

¿Merece la pena subir a Business? El cálculo honesto para MercadoFresco:

Concepto Cifra
Gasto mensual en AWS ~600 USD
Coste del plan Business 100 USD/mes (mínimo)
Ahorro potencial detectado por las comprobaciones de coste 30-60 USD/mes
Valor del soporte técnico (respuesta en 1 h para producción caída) Difícil de cuantificar

Con 600 USD de gasto, pagar 100 USD por Trusted Advisor no sale a cuenta solo por las recomendaciones. Pero el plan Business incluye mucho más que Trusted Advisor: soporte técnico 24×7 con respuesta en una hora para producción caída, acceso a arquitectos de soluciones, y la posibilidad de abrir casos técnicos. Esa es la razón real para contratarlo, y hay que decidirlo con ese criterio, no por las comprobaciones.

La decisión de MercadoFresco: seguir en Basic por ahora y suplir lo que falta con lo ya aprendido, con revisión de la decisión cuando el gasto supere los 2.000 USD mensuales o cuando la tienda sea crítica para el negocio hasta el punto de necesitar soporte con SLA. Está anotado en el registro de decisiones, con fecha, igual que la decisión sobre Shield Advanced en 04-04.

Cómo suplir lo que el plan Basic no da

Aquí es donde el módulo entero se paga. Cada comprobación que Trusted Advisor no da en Basic se puede reproducir con lo que ya sabes:

Comprobación que falta Cómo suplirla Lección
Volúmenes EBS sin asociar Consulta avanzada de Config 05-04
IP elásticas sin asociar describe-addresses + script 01-05
Instancias infrautilizadas Métrica CPUUtilization + Compute Optimizer 05-01
RDS sin Multi-AZ Regla de Config rds-multi-az-support 05-04
ASG en una sola AZ Regla de Config personalizada con Guard 05-04
Balanceadores inactivos Métrica RequestCount = 0 05-01
Certificados ACM caducando describe-certificate + alarma 03-03
Aciertos de caché bajos Alarma mercadofresco-cdn-aciertos-bajos 04-04
Recomendaciones de reservas Cost Explorer 11-03
Volúmenes sin instantáneas Política de DLM ya montada 02-02

Los scripts concretos. Volúmenes huérfanos, con Config:

aws configservice select-resource-config \
  --expression "
    SELECT resourceId, configuration.size, configuration.createTime, tags
    WHERE resourceType = 'AWS::EC2::Volume'
      AND configuration.state.value = 'available'
  " \
  --profile mercadofresco-dev --region eu-west-1

IP elásticas sin asociar, que se facturan por no usarse:

aws ec2 describe-addresses \
  --query 'Addresses[?AssociationId==`null`].[PublicIp,AllocationId,Tags[?Key==`Componente`].Value|[0]]' \
  --output table \
  --profile mercadofresco-dev --region eu-west-1

Balanceadores sin tráfico en los últimos 7 días:

"""Detecta balanceadores inactivos: el hallazgo de coste que Basic no da."""
import boto3
from datetime import datetime, timedelta, timezone

elb = boto3.client("elbv2", region_name="eu-west-1")
cw = boto3.client("cloudwatch", region_name="eu-west-1")

fin = datetime.now(timezone.utc)
inicio = fin - timedelta(days=7)

for balanceador in elb.describe_load_balancers()["LoadBalancers"]:
    nombre = balanceador["LoadBalancerName"]
    # La dimension del ALB es la parte del ARN a partir de "loadbalancer/"
    dimension = balanceador["LoadBalancerArn"].split("loadbalancer/")[1]

    datos = cw.get_metric_statistics(
        Namespace="AWS/ApplicationELB",
        MetricName="RequestCount",
        Dimensions=[{"Name": "LoadBalancer", "Value": dimension}],
        StartTime=inicio, EndTime=fin,
        Period=86400, Statistics=["Sum"],
    )
    total = sum(p["Sum"] for p in datos["Datapoints"])
    if total == 0:
        print(f"INACTIVO: {nombre} — 0 peticiones en 7 dias (~16 USD/mes)")
    else:
        print(f"activo:   {nombre} — {int(total):,} peticiones")

Certificados de ACM próximos a caducar (recuerda: los de CloudFront están en us-east-1):

for REGION in eu-west-1 us-east-1; do
  aws acm list-certificates --region "$REGION" \
    --query 'CertificateSummaryList[].CertificateArn' --output text \
    --profile mercadofresco-dev \
  | tr '\t' '\n' | while read -r ARN; do
      aws acm describe-certificate --certificate-arn "$ARN" --region "$REGION" \
        --query 'Certificate.[DomainName,NotAfter,Status,RenewalEligibility]' \
        --output text --profile mercadofresco-dev
    done
done

Los certificados emitidos por ACM y validados por DNS se renuevan solos (03-03), pero los importados no, y un certificado caducado tumba la tienda entera. Esta comprobación merece estar en la rutina mensual.

La conclusión que importa: con Config, CloudWatch y un puñado de scripts, MercadoFresco reproduce la mayor parte de lo que daría el plan Business, gratis. Lo que no puede reproducir es el soporte técnico con SLA, y ese es el verdadero producto que se compra.

Recorrido comentado de un informe de MercadoFresco

Este es el informe completo, incluyendo las comprobaciones que MercadoFresco no ve con Basic pero que hemos reproducido con las técnicas de la sección anterior. Comentado hallazgo a hallazgo.

Seguridad

Comprobación Estado Detalle
MFA en la cuenta raíz Verde Activado en 01-02
Uso de la cuenta raíz Verde Sin actividad desde febrero
Política de contraseñas de IAM Verde 04-01
Grupos de seguridad: puertos sin restricción Rojo 1 grupo con el 22 abierto a 0.0.0.0/0
Permisos de bucket de S3 Verde Bloqueo público en los 7 buckets
Instantáneas de RDS públicas Verde Ninguna
Claves de acceso expuestas Verde Ninguna detectada
Rotación de claves de acceso Amarillo 1 clave de 412 días
Registro de CloudTrail Verde trail-mercadofresco (05-03)

Comentario. El rojo del puerto 22 es exactamente el mismo hallazgo que dio la regla mercadofresco-ssh-restringido de Config en 05-04. Dos herramientas independientes señalando lo mismo es la mejor confirmación posible de que es real. La diferencia: Config lo remedia solo; Trusted Advisor solo lo señala.

La clave de 412 días es la del usuario integracion-proveedor del ejercicio 2 de 05-03. El arreglo de fondo no es rotarla: es sustituirla por un rol asumible con sts:ExternalId (04-01).

Tolerancia a fallos

Comprobación Estado Detalle
RDS Multi-AZ Verde mercadofresco-pedidos es Multi-AZ (02-04)
Copias automáticas de RDS Verde 7 días de retención
ASG en varias AZ Verde eu-west-1a y eu-west-1b (03-01)
Destinos del ALB en varias AZ Verde
Volúmenes EBS con instantáneas Amarillo 2 volúmenes sin instantánea en 30 días
Versionado de buckets de S3 Amarillo 2 buckets sin versionado
Health checks de Route 53 Amarillo Sin health checks en el registro principal

Comentario. Los tres amarillos son ejemplos perfectos de hallazgos que hay que evaluar, no obedecer:

  • Los 2 volúmenes sin instantánea son los volúmenes raíz de las instancias del ASG. No necesitan copia: son efímeros por diseño, se recrean desde lt-mercadofresco-tienda, y hacerles instantáneas sería pagar por copiar algo que ya está en la AMI. Se marca como aceptado y se documenta.
  • Los 2 buckets sin versionado son mercadofresco-registros-web (registros del ALB) y mercadofresco-catalogo-fotos. El primero, correcto: los registros no se sobrescriben. El segundo sí es un hallazgo real: si alguien sube una foto equivocada sobre una buena, no hay vuelta atrás. Se corrige.
  • Los health checks de Route 53 son un hallazgo real y valioso. MercadoFresco tiene un registro alias hacia CloudFront (03-05) sin comprobación de estado. No hay conmutación por error configurada hacia nada. Es una decisión pendiente que merece discusión, no una corrección inmediata.

Rendimiento

Comprobación Estado Detalle
Instancias EC2 de alta utilización Verde El ASG escala antes de llegar
Volúmenes EBS con rendimiento limitado Verde gp3 con IOPS suficientes (02-02)
Aciertos de caché de CloudFront Verde 96,6 % (03-04)
Compresión en CloudFront Amarillo Sin compresión en 1 comportamiento de caché
Grupos de seguridad con muchas reglas Verde

Comentario. El amarillo de la compresión es dinero directo: activar la compresión automática en CloudFront para las respuestas de la API reduce la transferencia de salida, que es la partida más cara de CloudFront. Es un cambio de una casilla. Se corrige el mismo día.

Optimización de costes

Comprobación Estado Detalle Ahorro
Volúmenes EBS sin asociar Rojo 3 volúmenes available, 100 GiB en total 8 USD/mes
IP elásticas sin asociar Rojo 2 IP sin asociar 7,30 USD/mes
Instancias EC2 infrautilizadas Amarillo mercadofresco-tienda-01 al 4 % de CPU ~30 USD/mes
Balanceadores inactivos Verde El ALB tiene tráfico
Instantáneas de RDS antiguas Amarillo 4 manuales de más de 6 meses 3,50 USD/mes
Instancias reservadas / Savings Plans Amarillo Recomendación de compra ~90 USD/mes

Comentario, hallazgo por hallazgo:

  • Los 3 volúmenes huérfanos quedaron de instancias terminadas manualmente durante las pruebas de 02-01 y 02-02. Nadie los borró porque al terminar una instancia, los volúmenes adicionales no se borran salvo que DeleteOnTermination esté activo. Es el hallazgo de coste más común de AWS. Se borran, tras comprobar que no contienen nada.
  • Las 2 IP elásticas son de las pruebas del NAT y de la instancia inicial. Una IP elástica es gratis mientras esté asociada a una instancia en ejecución; cuando no lo está, se factura precisamente para desincentivar el acaparamiento. Se liberan.
  • mercadofresco-tienda-01 al 4 % es un hallazgo especialmente interesante. Esa instancia es la original de 02-01, anterior al ASG. Ya no sirve para nada: el tráfico va al ALB y de ahí al grupo. Está encendida desde entonces porque nadie se acordó de apagarla. Es exactamente el tipo de cosa que solo se detecta con un repaso automático.
  • Las 4 instantáneas manuales de más de 6 meses son de las pruebas de 02-04. Aquí hay que aplicar criterio: antes de borrarlas conviene comprobar que no hay ninguna obligación de conservación, y esa comprobación es la regla personalizada del ejercicio 2 de 05-04.
  • La recomendación de Savings Plans es la de mayor impacto de todo el informe, y deliberadamente no se trata aquí: el análisis de compromisos de uso es la lección 11-05. Trusted Advisor lo señala; la decisión se toma con Cost Explorer delante.

Límites de servicio

Servicio Cuota Uso % Estado
EC2: vCPU bajo demanda (estándar) 16 8 50 % Verde
VPC por región 5 1 20 % Verde
Grupos de seguridad por VPC 2.500 6 0 % Verde
Reglas por grupo de seguridad 60 8 13 % Verde
IP elásticas por región 5 5 100 % Rojo
Instancias RDS 40 2 5 % Verde
Funciones Lambda: concurrencia 1.000 ~40 4 % Verde
Buckets de S3 100 7 7 % Verde
Distribuciones de CloudFront 200 1 0 % Verde
Zonas alojadas de Route 53 500 1 0 % Verde
Certificados de ACM 2.500 2 0 % Verde

El rojo de las IP elásticas al 100 % es el hallazgo más urgente del informe, y es doblemente interesante: es la misma causa que el hallazgo de coste. Las 2 IP sin asociar están consumiendo 2 de las 5 plazas de la cuota. Si mañana hiciera falta un tercer NAT gateway o una IP para algo, la llamada a la API fallaría con AddressLimitExceeded y nadie entendería por qué. Liberarlas resuelve las dos cosas a la vez.

Y la fila de vCPU es la que lleva al caso siguiente.

Cuotas de servicio: el límite invisible

Toda cuenta de AWS tiene cuotas (antes «límites de servicio») en prácticamente todo: cuántas vCPU puedes tener corriendo, cuántas VPC, cuántas reglas por grupo de seguridad, cuánta concurrencia de Lambda.

Existen para proteger a AWS de un uso descontrolado —accidental o malicioso— y para protegerte a ti de una factura sorpresa. La mayoría son ajustables; algunas no.

Cuota ajustable Cuota no ajustable
Ejemplo vCPU bajo demanda, IP elásticas, VPC Reglas por NACL (20), tamaño máximo de objeto en S3
Cómo se sube Solicitud desde Service Quotas No se puede
Tiempo Minutos a días

Lo que hace peligrosas a las cuotas es cuándo te enteras: cuando ya has chocado, en el peor momento posible. Una cuenta que funciona perfectamente durante meses puede fallar de golpe el viernes en que necesita escalar.

Service Quotas es la consola donde se ven y se gestionan:

# Ver la cuota de vCPU bajo demanda
aws service-quotas get-service-quota \
  --service-code ec2 \
  --quota-code L-1216C47A \
  --query 'Quota.[QuotaName,Value,Adjustable]' \
  --output table \
  --profile mercadofresco-dev --region eu-west-1

# Listar todas las cuotas de un servicio
aws service-quotas list-service-quotas \
  --service-code ec2 \
  --query 'Quotas[?Adjustable==`true`].[QuotaCode,QuotaName,Value]' \
  --output table \
  --profile mercadofresco-dev --region eu-west-1

# Los codigos de servicio disponibles
aws service-quotas list-services \
  --query 'Services[].[ServiceCode,ServiceName]' --output table \
  --profile mercadofresco-dev --region eu-west-1

Las cuotas que MercadoFresco vigila y por qué:

Cuota Código Valor Por qué importa
vCPU bajo demanda (estándar) L-1216C47A 16 Techo real del ASG
IP elásticas por región L-0263D0A3 5 NAT gateways y salidas
Concurrencia de Lambda L-B99A9384 1.000 Pico de miniaturas
Instancias RDS L-7B6409FD 40 Réplicas de lectura
Grupos de destino por ALB L-B22855CB 100 Rutas de la tienda
Reglas por Web ACL de WAF L-C4144F1D 1.500 WCU 04-05

El caso del ASG que no pasa de cuatro instancias

Aquí está el caso concreto que anunciábamos, y es un ejemplo perfecto de por qué esta categoría importa.

asg-mercadofresco-tienda está configurado con mínimo 2, deseado 2, máximo 4. Marta siempre había asumido que ese 4 era una decisión de diseño. Al mirar las cuotas descubre que no del todo:

  • Las instancias son t3.large: 2 vCPU cada una.
  • La cuota de vCPU bajo demanda estándar de la cuenta es 16.
  • Otras cargas de la cuenta consumen 8 vCPU.
  • Quedan 8 vCPU disponibles = 4 instancias t3.large.

El máximo del ASG no está limitado por el diseño: está limitado por la cuota. Y esto tiene una consecuencia muy concreta y muy fea.

El viernes a las 19:00, con 900 pedidos por hora y una capacidad de 600 pedidos por hora por instancia, MercadoFresco necesita al menos 2 instancias solo para el tráfico normal. Si llega un pico del doble —una campaña, una mención en redes, un viernes de puente— el ASG intenta escalar. Y si otra cosa de la cuenta hubiera consumido vCPU entre medias:

Launch failed: You have requested more vCPU capacity than your current
vCPU limit of 16 allows for the instance bucket that the specified
instance type belongs to.

El ASG no escala. Los clientes ven errores. Y la causa no está en ninguna alarma de CloudWatch, ni en ninguna regla de Config, ni en ninguna traza de X-Ray. Está en una cuota de la cuenta que nadie ha mirado nunca.

Peor aún: el fallo se produce en el peor momento posible, porque es precisamente cuando escalas cuando chocas con el límite. Es el fallo latente perfecto.

La alarma mercadofresco-asg-al-maximo de 04-04 avisa cuando el grupo llega a su máximo, que es una buena señal de que hace falta más capacidad. Pero avisa cuando ya estás en el techo; no avisa de que el techo es más bajo de lo que creías.

Solicitar un aumento de cuota

# 1. Ver el valor actual y si es ajustable
aws service-quotas get-service-quota \
  --service-code ec2 --quota-code L-1216C47A \
  --profile mercadofresco-dev --region eu-west-1

# 2. Solicitar el aumento
aws service-quotas request-service-quota-increase \
  --service-code ec2 \
  --quota-code L-1216C47A \
  --desired-value 64 \
  --profile mercadofresco-dev --region eu-west-1

# 3. Seguir el estado de la solicitud
aws service-quotas list-requested-service-quota-change-history \
  --service-code ec2 \
  --query 'RequestedQuotas[].[QuotaName,DesiredValue,Status,Created]' \
  --output table \
  --profile mercadofresco-dev --region eu-west-1

Los estados posibles: PENDING, CASE_OPENED, APPROVED, DENIED, CASE_CLOSED.

Consejos prácticos, aprendidos a base de disgustos:

  1. Solicita con antelación. Los aumentos pequeños se aprueban automáticamente en minutos; los grandes pasan a un caso de soporte y pueden tardar días. Solicitar el viernes por la tarde porque estás chocando ahora mismo es exactamente el escenario que hay que evitar.
  2. Pide con margen, pero razonable. Pedir 64 vCPU cuando usas 8 es razonable si esperas crecer. Pedir 10.000 sin justificación se deniega.
  3. Justifica. Si el aumento pasa a soporte, explicar el caso de uso —«tienda de comercio electrónico con picos los viernes, ASG que necesita escalar a 12 instancias»— acelera mucho.
  4. Las cuotas son por región. Subirla en eu-west-1 no la sube en us-east-1. Si tienes plan de recuperación ante desastres en otra región, súbela también allí, o descubrirás el problema el día del desastre.
  5. Algunas cuotas son por cuenta, no por región: IAM, S3, CloudFront.
  6. Solicita con Organizations cuando tengas varias cuentas (09-04): las plantillas de cuota aplican valores por defecto a las cuentas nuevas.

Y la aritmética que hay que hacer antes de decidir el valor:

Escenario Instancias vCPU necesarias
Normal (2 instancias) 2 × t3.large 4
Pico del viernes (4) 4 × t3.large 8
Pico doble (8) 8 × t3.large 16
Durante un despliegue azul/verde (×2) 16 × t3.large 32
Margen para otras cargas +16
Cuota recomendada 64

Fíjate en la cuarta fila: un despliegue azul/verde duplica temporalmente el número de instancias. Es un caso que se olvida sistemáticamente al calcular cuotas, y es la causa de que muchos primeros despliegues sin interrupción fallen. Se estudia en 08-03.

Alarmar antes de chocar con una cuota

Service Quotas publica métricas de uso en CloudWatch en el espacio AWS/Usage. Eso permite alarmar antes de llegar al límite, que es lo que convierte una cuota de trampa en un dato gestionado.

aws cloudwatch put-metric-alarm \
  --alarm-name mercadofresco-cuota-vcpu \
  --alarm-description "Uso de vCPU por encima del 70% de la cuota de la cuenta" \
  --namespace AWS/Usage \
  --metric-name ResourceCount \
  --dimensions Name=Service,Value=EC2 \
               Name=Resource,Value=vCPU \
               Name=Type,Value=Resource \
               Name=Class,Value=Standard/OnDemand \
  --statistic Maximum --period 300 --evaluation-periods 2 --datapoints-to-alarm 2 \
  --threshold 11 --comparison-operator GreaterThanThreshold \
  --treat-missing-data notBreaching \
  --alarm-actions arn:aws:sns:eu-west-1:111122223333:alertas-mercadofresco \
  --profile mercadofresco-dev --region eu-west-1

Ese umbral de 11 es el 70 % de 16. La forma elegante de expresarlo, que se ajusta sola si la cuota cambia, es una expresión de métrica con la función SERVICE_QUOTA():

aws cloudwatch put-metric-alarm \
  --alarm-name mercadofresco-cuota-vcpu-porcentaje \
  --alarm-description "Uso de vCPU por encima del 70% de la cuota, se ajusta sola" \
  --evaluation-periods 2 --datapoints-to-alarm 2 \
  --threshold 70 --comparison-operator GreaterThanThreshold \
  --treat-missing-data notBreaching \
  --metrics '[
    {
      "Id": "uso",
      "MetricStat": {
        "Metric": {
          "Namespace": "AWS/Usage",
          "MetricName": "ResourceCount",
          "Dimensions": [
            {"Name":"Service","Value":"EC2"},
            {"Name":"Resource","Value":"vCPU"},
            {"Name":"Type","Value":"Resource"},
            {"Name":"Class","Value":"Standard/OnDemand"}
          ]
        },
        "Period": 300,
        "Stat": "Maximum"
      },
      "ReturnData": false
    },
    { "Id": "cuota", "Expression": "SERVICE_QUOTA(uso)", "ReturnData": false },
    { "Id": "porcentaje", "Expression": "100 * (uso / cuota)",
      "Label": "% de la cuota de vCPU usada", "ReturnData": true }
  ]' \
  --alarm-actions arn:aws:sns:eu-west-1:111122223333:alertas-mercadofresco \
  --profile mercadofresco-dev --region eu-west-1

SERVICE_QUOTA() es la función que hace que esto funcione bien: devuelve el valor actual de la cuota para esa métrica. Si mañana AWS aprueba el aumento a 64, la alarma se recalibra sola sin que nadie toque nada. Es exactamente el tipo de detalle que separa una alarma que envejece bien de una que hay que mantener.

La misma técnica para la concurrencia de Lambda, que es la otra cuota que puede morder a MercadoFresco en el pico de subida de fotos al catálogo:

aws cloudwatch put-metric-alarm \
  --alarm-name mercadofresco-cuota-lambda-concurrencia \
  --namespace AWS/Lambda --metric-name ConcurrentExecutions \
  --statistic Maximum --period 60 --evaluation-periods 3 --datapoints-to-alarm 2 \
  --threshold 700 --comparison-operator GreaterThanThreshold \
  --treat-missing-data notBreaching \
  --alarm-actions arn:aws:sns:eu-west-1:111122223333:alertas-mercadofresco \
  --profile mercadofresco-dev --region eu-west-1

Coste: 0,10 USD por alarma. Dos alarmas de cuota, 0,20 USD al mes, para evitar un fallo de escalado en el pico de un viernes. Es probablemente la mejor relación coste-beneficio de todo el módulo.

Automatización: API, exportación y notificaciones

Importante: la API de Trusted Advisor (support y trustedadvisor) requiere plan Business o superior. Con Basic, estos comandos devuelven un error de suscripción. Se incluyen porque es lo que usarás en cuanto tu organización tenga ese plan.

# Listar todas las comprobaciones disponibles
aws support describe-trusted-advisor-checks \
  --language es \
  --query 'checks[].[id,category,name]' --output table \
  --region us-east-1 --profile mercadofresco-dev

# El resultado de una comprobacion concreta
# (0Xc6LMYG8P = volumenes EBS infrautilizados)
aws support describe-trusted-advisor-check-result \
  --check-id 0Xc6LMYG8P --language es \
  --region us-east-1 --profile mercadofresco-dev

# Forzar el refresco de una comprobacion
aws support refresh-trusted-advisor-check \
  --check-id 0Xc6LMYG8P \
  --region us-east-1 --profile mercadofresco-dev

# Resumen del estado de todas
aws support describe-trusted-advisor-check-summaries \
  --check-ids 0Xc6LMYG8P Qch7DwouX1 hjLMh88uM8 \
  --region us-east-1 --profile mercadofresco-dev

La API de support está solo en us-east-1. Es global y se atiende desde ahí, igual que ACM para CloudFront (03-04) o las Web ACL de CloudFront (04-05). Es un patrón recurrente en AWS que ya reconoces.

Un script que exporta el informe completo a CSV para la revisión mensual:

"""Exporta los hallazgos de Trusted Advisor a CSV. Requiere plan Business."""
import boto3
import csv
from datetime import date

soporte = boto3.client("support", region_name="us-east-1")

comprobaciones = soporte.describe_trusted_advisor_checks(language="es")["checks"]
fichero = f"trusted-advisor-mercadofresco-{date.today()}.csv"

with open(fichero, "w", newline="", encoding="utf-8") as f:
    escritor = csv.writer(f)
    escritor.writerow(["Categoria", "Comprobacion", "Estado",
                       "Recursos marcados", "Ahorro estimado USD"])

    for comprobacion in comprobaciones:
        resultado = soporte.describe_trusted_advisor_check_result(
            checkId=comprobacion["id"], language="es"
        )["result"]

        if resultado["status"] == "ok":
            continue   # Solo interesan warning y error

        ahorro = 0
        if "costOptimizing" in resultado.get("categorySpecificSummary", {}):
            ahorro = resultado["categorySpecificSummary"]["costOptimizing"] \
                              .get("estimatedMonthlySavings", 0)

        escritor.writerow([
            comprobacion["category"],
            comprobacion["name"],
            resultado["status"],                            # warning / error
            resultado["resourcesSummary"]["resourcesFlagged"],
            round(ahorro, 2),
        ])

print(f"Informe escrito en {fichero}")

Notificaciones semanales por correo: con plan Business o Enterprise, Trusted Advisor envía un resumen semanal a los contactos configurados. Se activan en las preferencias de la consola, y los destinatarios son los contactos alternativos de la cuenta —el contacto de operaciones, el de seguridad, el de facturación—, que configuramos en 01-02. Si no los configuraste entonces, este es el momento: [email protected].

Integración con EventBridge

Trusted Advisor emite eventos cuando el estado de una comprobación cambia. Con EventBridge (07-03) se puede reaccionar automáticamente:

{
  "source": ["aws.trustedadvisor"],
  "detail-type": ["Trusted Advisor Check Item Refresh Notification"],
  "detail": {
    "status": ["ERROR", "WARN"],
    "check-name": [
      "Security Groups - Specific Ports Unrestricted",
      "Amazon S3 Bucket Permissions",
      "MFA on Root Account",
      "Service Limits",
      "Exposed Access Keys"
    ]
  }
}
aws events put-rule \
  --name regla-mercadofresco-trusted-advisor \
  --description "Hallazgos criticos de Trusted Advisor hacia alertas" \
  --event-pattern file://patron-trusted-advisor.json \
  --profile mercadofresco-dev --region us-east-1

aws events put-targets \
  --rule regla-mercadofresco-trusted-advisor \
  --targets 'Id=1,Arn=arn:aws:sns:us-east-1:111122223333:alertas-mercadofresco-global' \
  --profile mercadofresco-dev --region us-east-1

Dos detalles: los eventos de Trusted Advisor se emiten en us-east-1, así que la regla va ahí; y el filtro por check-name es imprescindible, porque sin él recibirías un aviso cada vez que cambia cualquiera de las ~115 comprobaciones.

Lo que EventBridge habilita, y que es el patrón a copiar: no solo notificar, sino actuar. Una regla puede invocar una Lambda que, ante un hallazgo de «clave de acceso expuesta», desactive la clave inmediatamente. Cuando una clave aparece en un repositorio público, cada minuto cuenta. El detalle completo de EventBridge —patrones, objetivos, buses, reintentos— es la lección 07-03.

Compute Optimizer y Cost Optimization Hub

Dos servicios complementarios que se mencionan aquí y se desarrollan en el módulo 11:

AWS Compute Optimizer analiza las métricas de CloudWatch de los últimos 14 días —más si activas las métricas de memoria del agente que instalamos en 05-01— y recomienda el tipo de instancia óptimo para cada carga. Es gratis para las recomendaciones básicas.

aws compute-optimizer get-ec2-instance-recommendations \
  --query 'instanceRecommendations[].[instanceName,currentInstanceType,finding,recommendationOptions[0].instanceType,recommendationOptions[0].performanceRisk]' \
  --output table \
  --profile mercadofresco-dev --region eu-west-1

Salida típica para MercadoFresco:

Instancia Tipo actual Hallazgo Recomendado Riesgo
mercadofresco-tienda-01 t3.large Over-provisioned t3.small Muy bajo
Instancias del ASG t3.large Optimized

Y aquí conviene una advertencia importante: Compute Optimizer no sabe que mercadofresco-tienda-01 no debería existir. Recomienda reducirla a t3.small y ahorrar 20 USD. La respuesta correcta es apagarla, y ahorrar 60. Las herramientas automáticas optimizan lo que hay; la pregunta de si debe haberlo la sigue haciendo una persona.

Compute Optimizer analiza también volúmenes EBS, funciones Lambda —recomendando la memoria óptima, que en Lambda determina también la CPU— y servicios de ECS en Fargate (módulo 10).

Cost Optimization Hub consolida en un solo sitio las recomendaciones de coste de Compute Optimizer, Trusted Advisor, Cost Explorer y las recomendaciones de reservas, con el ahorro estimado agregado y sin duplicar. Es la lección 11-03.

Esta lección no entra en costes. El módulo 11 entero está dedicado a ello: etiquetado y asignación (11-02), Cost Explorer (11-03), Budgets (11-04) y Savings Plans (11-05).

La rutina de revisión mensual de Marta

Esta es la lista de comprobación concreta que Marta ejecuta el primer lunes de cada mes, en una hora. Es el producto operativo de todo el módulo 5.

Seguridad (15 minutos)

  • [ ] Trusted Advisor, categoría de seguridad: ningún rojo.
  • [ ] Cuadro de cumplimiento de Config: número de reglas no conformes frente al mes pasado.
  • [ ] aws cloudtrail validate-logs sobre el mes anterior; guardar la salida.
  • [ ] Consulta de Athena: IP de origen desconocidas y AccessDenied agrupados (05-03).
  • [ ] Revisar usuarios IAM con claves de más de 90 días.
  • [ ] Comprobar que no hay actividad de la cuenta raíz.

Coste (10 minutos)

  • [ ] Volúmenes EBS available (consulta de Config).
  • [ ] IP elásticas sin asociar.
  • [ ] Balanceadores sin tráfico en 7 días.
  • [ ] Recomendaciones de Compute Optimizer.
  • [ ] Comparar la factura del mes con la del anterior; investigar cualquier desviación mayor del 20 %.
  • [ ] Instantáneas manuales de RDS y EBS de más de 6 meses.

Fiabilidad (10 minutos)

  • [ ] Trusted Advisor, tolerancia a fallos.
  • [ ] Cuotas de servicio: nada por encima del 70 %.
  • [ ] Certificados de ACM: ninguno a menos de 60 días de caducar (en las dos regiones).
  • [ ] Comprobar que el canario canario-mercadofresco-compra no ha fallado.
  • [ ] Revisar que las políticas de DLM han creado las instantáneas previstas (02-02).

Observabilidad (15 minutos) — el más importante y el que más se salta

  • [ ] Simulacro trimestral: set-alarm-state sobre una alarma crítica y confirmar que el aviso llega al teléfono de guardia.
  • [ ] Suscripciones de SNS: ninguna en PendingConfirmation.
  • [ ] Grupos de registros sin retención (regla de Config, debería dar cero).
  • [ ] Coste de CloudWatch del mes: ¿ha crecido? ¿por qué?
  • [ ] Alarmas que han saltado este mes: ¿alguna fue un falso positivo? Ajustar umbral o borrarla.
  • [ ] Alarmas que no saltaron cuando debían: añadir la que falta.

Ese penúltimo punto es el que mantiene vivo el sistema. Una alarma que da falsos positivos repetidos acaba siendo ignorada, y el día que sea real nadie la mirará. Una alarma que se ignora es peor que no tener alarma, porque da una falsa sensación de cobertura. Borrar alarmas es tan importante como crearlas.

Deuda técnica (10 minutos)

  • [ ] Revisar el registro de decisiones: ¿alguna con fecha de revisión vencida? (Shield Advanced en 04-04, plan de soporte en esta lección, migración a ADOT en 05-02).
  • [ ] Reglas de WAF marcadas como temporales durante un incidente (04-05).
  • [ ] Excepciones aceptadas de Config y de Trusted Advisor: ¿siguen siendo válidas?

Cierre del módulo: la capa de observabilidad completa

flowchart TD
    subgraph INFRA["Infraestructura de MercadoFresco - modulos 1 a 4"]
        A["ASG + EC2"]
        B["ALB + CloudFront"]
        C["RDS + replica"]
        D["Lambdas + S3"]
        E["VPC + SG + WAF + KMS"]
    end

    INFRA --> M["05-01 CLOUDWATCH<br/>metricas, registros, alarmas<br/>panel mercadofresco-produccion"]
    INFRA --> X["05-02 X-RAY<br/>trazas de extremo a extremo<br/>mapa de servicios"]
    INFRA --> T["05-03 CLOUDTRAIL<br/>quien llamo a la API<br/>trail-mercadofresco"]
    INFRA --> G["05-04 AWS CONFIG<br/>estado y cumplimiento<br/>+ remediacion automatica"]
    INFRA --> V["05-05 TRUSTED ADVISOR<br/>buenas practicas<br/>y cuotas de servicio"]

    M --> SNS["alertas-mercadofresco<br/>correo + SMS COMPROBADO"]
    X --> SNS
    T --> SNS
    G --> SNS
    V --> SNS

    M -.->|"ServiceLens"| X
    T -.->|"dispara la grabacion"| G
    G -.->|"hallazgo -> regla"| V
    V -.->|"regla nueva"| G

    SNS --> P["Marta, Luis y Sara"]

Las cinco piezas y qué responde cada una, que es el resumen que hay que llevarse:

Lección Servicio Pregunta que responde
05-01 CloudWatch ¿Está funcionando? ¿Cuánto? ¿Va bien? ¿Me entero si falla?
05-02 X-Ray ¿Dónde se fue el tiempo? ¿Qué componente es el culpable?
05-03 CloudTrail ¿Quién hizo qué? ¿Cuándo, desde dónde, con qué resultado?
05-04 Config ¿Está bien configurado? ¿Cumple? ¿Se arregla solo?
05-05 Trusted Advisor ¿Qué se me está escapando? ¿Voy a chocar con algún límite?

Y las conexiones entre ellas, que son lo que convierte cinco servicios en un sistema:

  • CloudTrail dispara la grabación de Config: sin CloudTrail, Config no se entera de los cambios.
  • CloudWatch recibe los eventos de CloudTrail y los convierte en alarmas de seguridad.
  • ServiceLens une las métricas de CloudWatch con las trazas de X-Ray y los registros.
  • Trusted Advisor descubre lo que no se te ocurrió; Config lo convierte en regla permanente.
  • Config remedia; CloudTrail registra la remediación; CloudWatch avisa de que ocurrió.

El camino completo de un incidente, que ahora MercadoFresco tiene entero:

Alarma de CloudWatch → ServiceLens → traza de X-Ray → subsegmento culpable → registro correlacionado → CloudTrail si hubo intervención humana → regla de Config para que no vuelva.

Las cinco preguntas del módulo 4, respondidas

El módulo 4 se cerró con cinco preguntas abiertas. Estas son las respuestas, con nombre y apellidos:

1. «Nadie ha comprobado que un aviso de SNS llegue a un teléfono a las 4 de la madrugada.»

Respondida en 05-01. Se comprobaron las suscripciones de alertas-mercadofresco buscando el temido PendingConfirmation, se suscribió el correo [email protected] y el teléfono de guardia, y se hizo el simulacro con set-alarm-state, que dispara las acciones reales sin tocar la métrica. Se descubrió además que el «no molestar» del móvil silenciaba los SMS de números cortos: la cadena de aviso incluye el teléfono, y el teléfono también hay que probarlo. Queda como simulacro trimestral en la rutina mensual.

2. «Los registros de WAF, VPC, ALB y Lambda se acumulan en cinco sitios sin correlacionar.»

Respondida en 05-01. Centralización en CloudWatch Logs de lo que se puede centralizar —aplicación, nginx, Lambdas, WAF (aws-waf-logs-mercadofresco), flow logs (flowlogs-mercadofresco) y PostgreSQL— con retención por grupo desde el primer día, y con la honestidad de reconocer lo que no va ahí: los accesos del ALB y de CloudFront viven en S3 y se consultan con Athena. Logs Insights consulta hasta 50 grupos a la vez, y eso es lo que hace la correlación posible.

3. «Si un cliente dice que su pedido tarda 8 segundos, Marta no sabe si el problema está en la tienda, en la Lambda o en la base de datos.»

Respondida dos veces. Primero en 05-01, con cuatro consultas de Logs Insights sobre cuatro grupos y una cronología montada a mano: 7.402 ms dentro de PostgreSQL. Después en 05-02, en una sola búsqueda —annotation.pedido_id = "48213"— y una vista de cascada donde el problema se lee en dos segundos: 39 subsegmentos de 190 ms en serie, el 91 % del tiempo, un patrón N+1. Corregido con WHERE id = ANY(...): p95 de 6,8 s a 0,44 s, y DatabaseConnections de 185 a 96 en el pico del viernes.

4. «Nadie sabe quién descifró la última copia.»

Respondida en 05-03. Tres eventos de kms:Decrypt sobre mercadofresco-pedidos: RDS cifrando su copia automática, una instancia del ASG desde 10.0.11.24, y rol-restauracion-copias a las 03:42 desde 198.51.100.77, sin MFA, sobre snapshot-2026-07-27. La investigación completa —congelar la evidencia, encontrar el AssumeRole real, reconstruir la sesión por accessKeyId— llevó a Luis probando una restauración de madrugada. Intención correcta, procedimiento incorrecto. Con acciones correctivas y fechas, y una alarma para la próxima vez.

5. «Nada avisa si alguien desactiva el cifrado de un bucket o abre un SG al mundo.»

Respondida en 05-04. Y no solo avisa: lo corrige. Cronología completa: T+0 alguien desactiva el cifrado, T+3 min Config crea el CI y evalúa NON_COMPLIANT, T+4 min la remediación ejecuta AWS-EnableS3BucketEncryption, T+8 min conforme otra vez. Sin intervención humana, con el rastro completo en CloudTrail. Y el cuadro de cumplimiento inicial encontró catorce recursos que llevaban meses incumpliendo sin que nada los detectara, porque no eran eventos: eran estados.

Y una sexta, que nadie había formulado y que aparece en esta lección: el ASG no puede pasar de cuatro instancias por una cuota de vCPU de la cuenta que nadie había mirado nunca. Ese es exactamente el tipo de problema que solo encuentra un repaso automático, y es el mejor argumento a favor de Trusted Advisor y de Service Quotas.

Coste total añadido

Lección Servicio Coste mensual
05-01 CloudWatch (métricas, registros, alarmas, panel, canario) 43,68 USD
05-02 X-Ray (con muestreo optimizado) 10,60 USD
05-03 CloudTrail (trail, eventos de datos acotados, Insights, Athena) 1,59 USD
05-04 AWS Config (grabador optimizado, 29 reglas, remediación) 6,40 USD
05-05 Trusted Advisor (plan Basic) + 2 alarmas de cuota 0,20 USD
Total del módulo 5 ~62,47 USD/mes

Puesto en contexto:

Concepto Coste mensual
Infraestructura de MercadoFresco (módulos 1-3) ~540 USD
Seguridad (módulo 4) 28,36 USD
Observabilidad (módulo 5) 62,47 USD
Total ~631 USD

La observabilidad es el 9,9 % del gasto total. Es una proporción alta comparada con la seguridad, y merece la pena decir por qué es razonable: el 70 % de esa cifra son CloudWatch y el canario, es decir, la ingesta de registros y la comprobación continua de que se puede comprar. Y frente a lo que cuesta: la corrección del N+1 que encontró X-Ray por 10,60 USD al mes redujo a la mitad la presión sobre la base de datos, evitando una ampliación de instancia RDS que habría costado 80 USD mensuales. La observabilidad se pagó sola el primer mes.

Y las cinco decisiones que mantienen esa cifra en 62 USD en lugar de en 600:

  1. Retención en cada grupo de registros el día que se crea (05-01).
  2. Ninguna dimensión de cardinalidad alta en métricas personalizadas (05-01).
  3. Muestreo de X-Ray al 0 % en /salud y estáticos, 100 % en pedidos (05-02).
  4. Selectores de eventos de datos por prefijo y readOnly: false (05-03).
  5. recordingFrequency: DAILY para instancias y volúmenes en Config (05-04).

Cinco líneas de configuración que separan 62 USD de más de 600.

Errores Comunes y Consejos

1. Esperar que Trusted Advisor lo vea todo con el plan Basic. Con Basic ves seguridad básica y límites de servicio. Nada de coste, rendimiento ni tolerancia a fallos, y sin API.

2. Obedecer los amarillos sin criterio. Trusted Advisor no conoce tu contexto. Un volumen raíz de una instancia efímera no necesita instantáneas. Cada hallazgo es una hipótesis; documenta las que aceptas y por qué.

3. Ignorar la categoría de límites de servicio. Es la que más caídas ha causado, y es de las pocas disponibles en el plan gratuito. Reviéwala siempre.

4. Solicitar un aumento de cuota cuando ya estás chocando. Los aumentos grandes pasan a un caso de soporte y tardan días. Alarma al 70 % y pide con antelación.

5. Olvidar que las cuotas son por región. Subirla en eu-west-1 no la sube en eu-central-1. Si tienes plan de recuperación en otra región, súbela también allí.

6. No contar el despliegue azul/verde al calcular vCPU. Duplica temporalmente las instancias. Es la causa más frecuente de que un primer despliegue sin interrupción falle (08-03).

7. Confundir Trusted Advisor con Config. Config comprueba tus reglas y remedia; Trusted Advisor comprueba las de AWS y solo señala. El ciclo bueno es: Trusted Advisor descubre → Config convierte en regla → la remediación lo corrige.

8. Refrescar comprobaciones a mano constantemente. Se refrescan cada 24 horas solas. Refrescar manualmente antes de una revisión concreta está bien; hacerlo cada hora no aporta nada.

9. Contratar el plan Business solo por Trusted Advisor. Haz el cálculo: si el ahorro detectado no cubre el coste, la razón para contratarlo es el soporte técnico con SLA, no las comprobaciones. Decídelo con ese criterio.

10. Dejar que los hallazgos se acumulen. Un informe con 40 hallazgos permanentes deja de leerse. Resuélvelos, acéptalos formalmente con justificación, o quítalos del alcance. Un informe limpio es un informe que alguien mira.

11. No revisar las alarmas que dan falsos positivos. Una alarma ignorada es peor que no tener alarma. La revisión mensual incluye borrar alarmas, no solo crearlas.

12. Optimizar una instancia que no debería existir. Compute Optimizer recomienda reducir mercadofresco-tienda-01 a t3.small. La respuesta correcta es apagarla. Las herramientas optimizan lo que hay; la pregunta de si debe haberlo la hace una persona.

Consejo final del módulo: la observabilidad no se «termina». Se mantiene. El sistema que has montado en estas cinco lecciones se degrada solo si nadie lo cuida: aparecen alarmas ruidosas, registros sin retención, reglas no conformes que se normalizan, cuotas que se acercan. La hora mensual de la rutina de Marta es lo que mantiene vivo todo lo demás. Sin ella, en seis meses tienes un panel que nadie mira y un montón de servicios facturando.

Ejercicios

Ejercicio 1: la decisión del plan de soporte

MercadoFresco crece. Datos actuales:

Concepto Valor
Gasto mensual en AWS 2.400 USD
Pedidos diarios 6.500
Facturación mensual 185.000 EUR
Margen bruto 22 %
Personas en el equipo técnico 3 (Marta, Luis y una incorporación)
Guardias fuera de horario Marta, sin turnos formales
Caídas del último año 2, de 40 y 95 minutos

Planes disponibles: Basic (0 USD), Developer (29 USD/mes o 3 % del gasto, lo que sea mayor), Business (100 USD/mes o del 3 al 10 % del gasto según tramos, lo que sea mayor).

Calcula el coste real de cada plan con ese gasto. Estima el coste de una caída de 95 minutos un viernes en hora punta. Decide qué plan contratarías, justificándolo con números y no solo con las comprobaciones de Trusted Advisor. Indica qué harías con lo que el plan elegido no cubre.

Ejercicio 2: el plan de cuotas para el Black Friday

MercadoFresco espera para el Black Friday un pico de 5 veces el tráfico habitual durante 6 horas. Situación actual:

Elemento Valor actual
Instancias del ASG 2-4 × t3.large (2 vCPU)
Capacidad por instancia 600 pedidos/hora
Pico habitual del viernes 900 pedidos/hora
Cuota de vCPU bajo demanda 16
Otras cargas de la cuenta 8 vCPU
Concurrencia de Lambda Cuota 1.000, pico actual ~40
IP elásticas Cuota 5, usadas 5
Conexiones de RDS Límite 200, pico actual 96
Réplicas de lectura 1

Además, el equipo quiere hacer un despliegue azul/verde la semana anterior para publicar la campaña.

Calcula: cuántas instancias hacen falta en el pico, cuántas vCPU, qué cuotas se quedan cortas y en cuánto. Escribe las solicitudes de aumento con los valores que pedirías y su justificación. Diseña las alarmas de cuota que montarías. Indica qué otros límites no de AWS revisarías, y con cuánta antelación harías cada cosa.

Ejercicio 3: la revisión mensual con hallazgos reales

Es el primer lunes de octubre. Marta ejecuta su rutina y encuentra esto:

Seguridad

  • Trusted Advisor: 1 rojo — «Grupos de seguridad: puertos específicos sin restricción».
  • Config: 3 reglas no conformes (el mes pasado eran 0).
  • validate-logs: falta un fichero de resumen del 14 de septiembre.
  • Athena: 2.400 AccessDenied de rol-mercadofresco-tienda sobre s3:GetObject.

Coste

  • Factura de CloudWatch: de 44 a 71 USD.
  • 1 volumen EBS available de 200 GiB, creado el 22 de septiembre.
  • Compute Optimizer: las instancias del ASG marcadas como under-provisioned.

Fiabilidad

  • Cuota de vCPU al 75 %.
  • El canario canario-mercadofresco-compra ha fallado 14 veces, todas entre las 03:00 y las 03:20.

Observabilidad

  • La alarma mercadofresco-pedidos-fallidos ha saltado 23 veces este mes; 21 fueron falsos positivos.
  • Una suscripción de SNS en PendingConfirmation: el correo de la persona nueva.

Para cada uno de los once hallazgos: di qué significa con toda probabilidad, qué prioridad le das (crítica, alta, media, baja), qué acción concreta tomarías, y de qué lección del curso procede el conocimiento necesario. Identifica cuáles de estos hallazgos están relacionados entre sí, que es la parte que distingue una revisión mecánica de una revisión útil.

Soluciones

Solución 1

Coste real de cada plan con 2.400 USD de gasto mensual:

Plan Cálculo Coste real
Basic 0 USD
Developer máx(29, 3 % de 2.400 = 72) 72 USD/mes
Business máx(100, 10 % de los primeros 10.000 = 240) 240 USD/mes

Ojo con el cálculo de Developer y Business: es el mayor entre el mínimo y el porcentaje. Con 2.400 USD de gasto, Business cuesta 240 USD, no 100.

Coste de una caída de 95 minutos un viernes en hora punta:

Concepto Cálculo
Facturación mensual 185.000 EUR
Facturación por hora (media) 185.000 / 30 / 24 = 257 EUR/h
Factor de hora punta del viernes ×4
Facturación en hora punta ~1.028 EUR/h
95 minutos ~1.628 EUR de facturación perdida
Margen perdido (22 %) ~358 EUR
Pedidos no recuperados (estimado 40 % se pierden) ~143 EUR de margen
Coste reputacional y de atención al cliente No cuantificable, real

Dos caídas al año ≈ 700-900 EUR de margen perdido, más el daño de imagen en una tienda de producto fresco, donde la confianza en la entrega en 24 h es el producto.

La decisión: Business, 240 USD/mes. Y la justificación no son las comprobaciones de Trusted Advisor:

Argumento Peso
Respuesta en 1 hora para producción caída, 24×7 Decisivo
Acceso a arquitectos de soluciones para revisar decisiones Alto
Poder abrir casos técnicos en lugar de buscar en foros Alto
Trusted Advisor completo Medio
API de Trusted Advisor y notificaciones semanales Medio
Ahorro detectado por las comprobaciones de coste 50-100 USD/mes

El número que cierra la decisión: 240 USD/mes son 2.880 USD/año. Si el soporte con SLA reduce la duración de una sola caída de 95 a 30 minutos, se ahorran unos 240 EUR de margen. Con dos caídas al año, no llega a pagarse solo por eso.

Pero el equipo son tres personas, una guardia informal y ninguna posibilidad de escalar a nadie a las 4 de la madrugada. El argumento real es de riesgo, no de ahorro: con 185.000 EUR mensuales dependiendo de la plataforma, no tener a quién llamar cuando algo grave falle es un riesgo desproporcionado frente a 2.880 USD anuales. Es el mismo tipo de razonamiento que en 04-04 llevó a no contratar Shield Advanced —allí el coste era 100 veces mayor y el riesgo mucho menor—, aplicado en sentido contrario. La conclusión distinta con el mismo método es lo que demuestra que el método es bueno.

Lo que Business no cubre y hay que seguir haciendo:

No cubre Cómo se resuelve
Gestor técnico dedicado Solo en Enterprise; no se necesita a esta escala
Revisión Well-Architected guiada Se hace autoservicio con la herramienta gratuita (11-01)
Remediación automática AWS Config (05-04): Trusted Advisor no remedia
Reglas propias de cumplimiento AWS Config con Guard
Detección de intrusiones GuardDuty, si se contrata
Que alguien mire el informe La rutina mensual de Marta. Ninguna herramienta sustituye esto

Y una condición para que la decisión sea buena: contratar Business y no cambiar nada más sería tirar el dinero. La decisión incluye establecer turnos de guardia formales entre las tres personas, con el simulacro de set-alarm-state verificado para cada teléfono (05-01). El soporte de AWS responde en una hora; alguien de MercadoFresco tiene que estar despierto para leer esa respuesta.

Solución 2

Cálculo de capacidad.

Concepto Valor
Pico habitual del viernes 900 pedidos/hora
Pico del Black Friday (×5) 4.500 pedidos/hora
Capacidad por instancia 600 pedidos/hora
Instancias necesarias 4.500 / 600 = 7,5 → 8
Margen de seguridad (+50 %) 12 instancias
vCPU necesarias (12 × 2) 24 vCPU
Durante el despliegue azul/verde (×2) 48 vCPU
Otras cargas 8 vCPU
Total en el peor momento 56 vCPU
Cuota actual 16

El margen del 50 % no es paranoia: el número de 600 pedidos/hora por instancia se midió en condiciones normales. En el Black Friday el carrito medio es más grande, hay más búsquedas por pedido y más abandonos con reintentos. La capacidad por instancia bajará, no subirá.

Cuotas que se quedan cortas:

Cuota Actual Necesaria ¿Ajustable?
vCPU bajo demanda (estándar) 16 64
IP elásticas 5 (usadas 5) 10
Concurrencia de Lambda 1.000 1.000 (pico ×5 = 200) Suficiente
Instancias RDS 40 40 Suficiente
Conexiones de RDS 200 ~480 No es una cuota de AWS
Grupos de destino por ALB 100 100 Suficiente

Solicitudes de aumento:

# vCPU: de 16 a 64. Margen para el pico, el azul/verde y crecimiento futuro.
aws service-quotas request-service-quota-increase \
  --service-code ec2 --quota-code L-1216C47A --desired-value 64 \
  --profile mercadofresco-dev --region eu-west-1

# IP elasticas: de 5 a 10. Antes hay que liberar las 2 sin asociar.
aws service-quotas request-service-quota-increase \
  --service-code ec2 --quota-code L-0263D0A3 --desired-value 10 \
  --profile mercadofresco-dev --region eu-west-1

Justificación para el caso de soporte, si escala: «Tienda de comercio electrónico de alimentación. Campaña de Black Friday con pico previsto de 5× el tráfico habitual durante 6 horas el 27 de noviembre. Necesitamos escalar el grupo de autoescalado a 12 instancias t3.large y realizar un despliegue azul/verde previo que duplica temporalmente la capacidad. Solicitamos 64 vCPU con margen.»

La fila más importante de la tabla de cuotas es la que no es una cuota de AWS: las conexiones de RDS. Con 12 instancias × 40 conexiones de agrupación = 480 conexiones, contra un max_connections de 200. La base de datos se convierte en el cuello de botella antes que EC2. Y esa no se arregla con una solicitud a AWS: se arregla con arquitectura.

Otros límites que no son cuotas de AWS y que hay que revisar:

Límite Riesgo Acción
max_connections de RDS Crítico Agrupación de conexiones, RDS Proxy, o instancia mayor
Réplicas de lectura Alto Añadir una segunda réplica para las búsquedas
Límite de la pasarela de pago Crítico Avisar al proveedor con semanas de antelación
Cuota de envío de correo (SES) Alto Confirmaciones de pedido: sandbox y límite diario
Capacidad del almacén y de reparto Crítico No es un problema técnico. 4.500 pedidos/hora hay que poder servirlos
Límites de API de terceros Medio Mensajería, mapas, geocodificación

La quinta fila es la que un perfil técnico olvida y la que más caro sale: escalar la tienda para aceptar 4.500 pedidos/hora que el almacén no puede preparar convierte un éxito comercial en una catástrofe de servicio al cliente. El límite real de MercadoFresco puede estar en la nave, no en AWS.

Alarmas de cuota a montar:

# vCPU al 70% de la cuota, ajustandose sola si la cuota cambia
aws cloudwatch put-metric-alarm \
  --alarm-name mercadofresco-cuota-vcpu-porcentaje \
  --evaluation-periods 2 --datapoints-to-alarm 2 \
  --threshold 70 --comparison-operator GreaterThanThreshold \
  --metrics '[
    {"Id":"uso","MetricStat":{"Metric":{"Namespace":"AWS/Usage",
      "MetricName":"ResourceCount","Dimensions":[
        {"Name":"Service","Value":"EC2"},{"Name":"Resource","Value":"vCPU"},
        {"Name":"Type","Value":"Resource"},{"Name":"Class","Value":"Standard/OnDemand"}]},
      "Period":300,"Stat":"Maximum"},"ReturnData":false},
    {"Id":"cuota","Expression":"SERVICE_QUOTA(uso)","ReturnData":false},
    {"Id":"pct","Expression":"100*(uso/cuota)","ReturnData":true}
  ]' \
  --alarm-actions arn:aws:sns:eu-west-1:111122223333:alertas-mercadofresco \
  --profile mercadofresco-dev --region eu-west-1

# Conexiones de RDS al 70% de 200: la cuota que de verdad va a morder
aws cloudwatch put-metric-alarm \
  --alarm-name mercadofresco-rds-conexiones-criticas \
  --namespace AWS/RDS --metric-name DatabaseConnections \
  --dimensions Name=DBInstanceIdentifier,Value=mercadofresco-pedidos \
  --statistic Maximum --period 60 --evaluation-periods 2 \
  --threshold 140 --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:sns:eu-west-1:111122223333:alertas-mercadofresco \
  --profile mercadofresco-dev --region eu-west-1

# Fallos de lanzamiento del ASG: la senal directa de haber chocado con la cuota
aws cloudwatch put-metric-alarm \
  --alarm-name mercadofresco-asg-fallos-lanzamiento \
  --namespace AWS/AutoScaling --metric-name GroupPendingInstances \
  --dimensions Name=AutoScalingGroupName,Value=asg-mercadofresco-tienda \
  --statistic Maximum --period 300 --evaluation-periods 3 --datapoints-to-alarm 3 \
  --threshold 0 --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:sns:eu-west-1:111122223333:alertas-mercadofresco \
  --profile mercadofresco-dev --region eu-west-1

La tercera es especialmente astuta: instancias atascadas en Pending durante 15 minutos es exactamente lo que se ve cuando los lanzamientos fallan por cuota.

Cronograma, con antelación realista:

Cuándo Qué
8 semanas antes Solicitar los aumentos de cuota. Las grandes tardan
6 semanas antes Liberar las 2 IP elásticas y los volúmenes huérfanos
6 semanas antes Avisar a la pasarela de pago y a SES
5 semanas antes Montar RDS Proxy o agrupación de conexiones; añadir una segunda réplica
4 semanas antes Prueba de carga real con 5× el tráfico. Verificar que se escala a 12
3 semanas antes Ajustar el ASG: máximo 12, política de escalado más agresiva, warm pool
2 semanas antes Despliegue azul/verde de la campaña. Comprobar que la cuota lo aguanta
1 semana antes Congelación de cambios. Solo correcciones críticas
El día Panel mercadofresco-produccion en pantalla; guardia con dos personas
Después Post-mortem con datos, y bajar las cuotas no es necesario: no cuestan nada

La prueba de carga de la cuarta fila es lo que convierte todo lo anterior en un plan y no en una esperanza. Si no lo has probado, no sabes si escala.

Solución 3

Hallazgos, con prioridad y relaciones.

# Hallazgo Prioridad Significado probable Acción Lección
1 TA: SG con puerto sin restringir Crítica Alguien abrió un puerto Identificar con CloudTrail y cerrar 03-02, 05-03
2 Config: 3 reglas no conformes (eran 0) Crítica Algo cambió en septiembre Ver qué reglas y desde cuándo 05-04
3 Falta un fichero de resumen de CloudTrail CRÍTICA MÁXIMA Posible manipulación de la auditoría Investigación formal inmediata 05-03
4 2.400 AccessDenied del rol de la tienda Alta Falta un permiso: hay algo roto Revisar pol-mercadofresco-tienda 04-01, 05-03
5 CloudWatch de 44 a 71 USD Media Más ingesta de registros Ver qué grupo creció 05-01
6 Volumen EBS de 200 GiB huérfano Media Instancia terminada el 22/9 Comprobar contenido y borrar 02-02
7 ASG under-provisioned Alta Las instancias se quedan cortas Revisar tipo y política de escalado 02-01, 05-05
8 Cuota de vCPU al 75 % Alta Cerca del techo Solicitar aumento ya 05-05
9 Canario falla 14 veces, 03:00-03:20 Media Ventana de mantenimiento Ver qué pasa a esa hora 05-01
10 21 de 23 alarmas fueron falsos positivos Alta La alarma está mal calibrada Ajustar umbral o rediseñarla 05-01
11 Suscripción en PendingConfirmation Alta La persona nueva no recibe avisos Reenviar y hacer simulacro 05-01

El hallazgo 3 es el más grave de todos y hay que decir por qué. Un fichero de resumen ausente significa que la cadena de integridad de CloudTrail está rota el 14 de septiembre. Puede ser un problema de entrega de AWS —ocurre, raramente— o puede significar que alguien borró ficheros de registro para ocultar actividad. No se puede distinguir sin investigar, y hasta que se descarte hay que tratarlo como un posible incidente de seguridad:

# 1. Verificar el alcance exacto de lo que falta
aws cloudtrail validate-logs \
  --trail-arn arn:aws:cloudtrail:eu-west-1:111122223333:trail/trail-mercadofresco \
  --start-time 2026-09-13T00:00:00Z --end-time 2026-09-16T00:00:00Z \
  --verbose --profile mercadofresco-dev --region eu-west-1

# 2. Ver si hay versiones borradas en el bucket (el versionado esta activo)
aws s3api list-object-versions \
  --bucket mercadofresco-auditoria-cloudtrail \
  --prefix AWSLogs/111122223333/CloudTrail/eu-west-1/2026/09/14/ \
  --query 'DeleteMarkers[].[Key,LastModified,Owner.DisplayName]' \
  --profile mercadofresco-dev

# 3. Buscar quien toco el bucket o el trail ese dia
SELECT eventtime, eventname,
       COALESCE(userIdentity.sessionContext.sessionIssuer.userName,
                userIdentity.userName) AS identidad,
       sourceipaddress, errorcode
FROM auditoria_mercadofresco.cloudtrail_mercadofresco
WHERE anio='2026' AND mes='09' AND dia IN ('13','14','15')
  AND (eventname IN ('StopLogging','UpdateTrail','DeleteTrail','PutEventSelectors')
       OR json_extract_scalar(requestParameters,'$.bucketName')
          = 'mercadofresco-auditoria-cloudtrail')
ORDER BY eventtime;

Si el Object Lock en modo COMPLIANCE de 05-04 estaba activo, nadie pudo borrar nada y la explicación es un problema de entrega de AWS: se abre un caso de soporte y se documenta. Si no lo estaba, hay que investigar en serio. Esta es la mejor demostración práctica de por qué Object Lock importaba.

Relaciones entre hallazgos, que es la parte que distingue una revisión útil:

Grupo A: hallazgos 1, 2 y 3 — probablemente el mismo incidente.

Tres reglas de Config que pasaron de conformes a no conformes, un puerto abierto, y un hueco en la auditoría. Es demasiada coincidencia. La línea temporal de Config dirá exactamente cuándo se volvieron no conformes las reglas, y si esa fecha es el 14 de septiembre, ya no es una coincidencia: es un incidente que hay que reconstruir entero.

aws configservice get-resource-config-history \
  --resource-type AWS::EC2::SecurityGroup \
  --resource-id <id-del-sg> \
  --earlier-time 2026-09-10T00:00:00Z \
  --later-time 2026-09-20T00:00:00Z \
  --profile mercadofresco-dev --region eu-west-1

Grupo B: hallazgos 4 y 5 — el mismo despliegue.

2.400 AccessDenied sobre s3:GetObject significa que hay una funcionalidad rota que ningún cliente ha reportado. Y cada fallo genera una línea de error en el log, lo que explica en buena parte el aumento de CloudWatch de 44 a 71 USD. Un problema de permisos se manifestó como un problema de coste. Arreglar el permiso arregla las dos cosas.

Grupo C: hallazgos 7 y 8 — el mismo problema de capacidad.

Compute Optimizer dice que las instancias se quedan cortas, y la cuota de vCPU está al 75 %. Son las dos caras de lo mismo: MercadoFresco ha crecido y la capacidad no ha seguido. Y hay una trampa: si se resuelve el 7 escalando a más instancias, se agrava el 8. La secuencia correcta es primero solicitar el aumento de cuota, después escalar. Al revés, el ASG intentará lanzar y fallará.

Grupo D: hallazgos 9 y 6 — la ventana de mantenimiento.

El canario falla entre las 03:00 y las 03:20. ¿Qué pasa a esa hora? La ventana de mantenimiento de RDS y la de copias automáticas (02-04). Durante una conmutación Multi-AZ hay unos segundos de indisponibilidad, y el canario lo detecta. Y esto es una buena noticia disfrazada de problema: el canario está funcionando y está midiendo un impacto real que los clientes también sufren, aunque de madrugada afecte a poca gente. Acciones: comprobar si la aplicación reintenta correctamente las conexiones perdidas (patrón de 07-05), y valorar mover la ventana a una hora con menos tráfico aún.

El volumen huérfano del 22 de septiembre probablemente venga de una instancia terminada en ese mismo trabajo de mantenimiento.

Grupo E: hallazgos 10 y 11 — la salud del sistema de avisos, y son los más urgentes de lo que parece poco urgente.

  • 21 falsos positivos de 23 significa que mercadofresco-pedidos-fallidos ya no la mira nadie. Su umbral fijo de 10 errores en 5 minutos no aguanta el crecimiento del tráfico: con más pedidos hay más errores absolutos aunque la proporción sea la misma. La corrección es la de la solución 1 de 05-01: alarmar sobre el porcentaje, no sobre el número absoluto, con una expresión de métrica.
  • La suscripción pendiente significa que la persona nueva no ha recibido ni un solo aviso desde que entró. Si estaba de guardia alguna noche, no había nadie de guardia. Se reenvía la confirmación y se hace un simulacro con set-alarm-state contra su teléfono, que es exactamente el protocolo de incorporación de 05-01.

Orden de actuación recomendado:

Orden Acción Por qué primero
1 Investigar el resumen de CloudTrail ausente Posible incidente de seguridad en curso
2 Cerrar el puerto abierto Exposición activa
3 Confirmar la suscripción y hacer el simulacro Sin avisos no hay nada de lo demás
4 Solicitar el aumento de cuota de vCPU Tarda días; empezar ya
5 Arreglar el permiso de S3 Funcionalidad rota + coste
6 Recalibrar mercadofresco-pedidos-fallidos Una alarma ignorada es peor que ninguna
7 Escalar la capacidad (cuando la cuota esté aprobada) Depende del 4
8 Investigar los fallos del canario Impacto real pero acotado
9 Borrar el volumen huérfano Coste, sin urgencia
10 Revisar el crecimiento de CloudWatch Se resuelve en parte con el 5
11 Documentar las reglas de Config no conformes que se acepten Cierre

La lección del ejercicio: once hallazgos aislados parecen una lista de tareas. Agrupados en cinco grupos relacionados, son cinco problemas reales: un posible incidente de seguridad, un despliegue con permisos incompletos, un problema de capacidad con una trampa de orden, una ventana de mantenimiento con impacto medible, y un sistema de avisos que se ha degradado en silencio. Esa diferencia es exactamente lo que aporta que la revisión la haga una persona con contexto y no un informe automático.

Conclusión

MercadoFresco tiene la última pieza. Sabes qué es Trusted Advisor y en qué se diferencia de todo lo anterior: Config comprueba tus reglas, Trusted Advisor comprueba las de AWS; Config responde preguntas, Trusted Advisor las hace. Y sabes que el ciclo bueno es encadenarlos: Trusted Advisor descubre lo que no habías previsto, escribes una regla de Config para que no vuelva, y la remediación lo corrige sola. Frente a Well-Architected (11-01), la distinción es de altura: Trusted Advisor mira hacia abajo, a los recursos; Well-Architected mira hacia arriba, a las decisiones.

Conoces las cinco categorías —optimización de costes, rendimiento, seguridad, tolerancia a fallos y límites de servicio— y qué comprueba cada una, con los tres estados y la advertencia de que un amarillo es una hipótesis, no una orden: los volúmenes raíz de las instancias del ASG no necesitan instantáneas, y aceptar formalmente ese hallazgo con su justificación es la respuesta correcta.

Tienes la tabla honesta de qué ve MercadoFresco con el plan Basic: seguridad básica y límites de servicio, que no es poco, y nada de coste, rendimiento, tolerancia a fallos ni API. Y sabes suplir lo que falta con lo ya aprendido: los volúmenes huérfanos con una consulta avanzada de Config, las IP elásticas con describe-addresses, los balanceadores inactivos con RequestCount, las instancias infrautilizadas con Compute Optimizer, el Multi-AZ con una regla de Config. Casi todo lo que daría el plan Business, gratis. Lo que no se puede reproducir es el soporte técnico con SLA, y esa es la razón real por la que se contrata.

Has recorrido un informe completo de la arquitectura de MercadoFresco y has encontrado lo que llevaba meses ahí: 3 volúmenes EBS huérfanos de las pruebas de 02-01, 2 IP elásticas sin asociar que se facturan precisamente por no usarse y que además consumían 2 de las 5 plazas de la cuota, mercadofresco-tienda-01 al 4 % de CPU desde que montamos el ASG y que nadie apagó, el mismo puerto 22 abierto que ya había señalado Config —dos herramientas independientes confirmándose—, y el hallazgo de compresión de CloudFront que se arregla con una casilla.

Y has descubierto la cuota que nadie había mirado: asg-mercadofresco-tienda no puede pasar de cuatro instancias porque la cuota de vCPU de la cuenta es 16 y otras cargas consumen 8. El máximo del ASG no era una decisión de diseño: era un límite invisible. Un fallo latente perfecto, que se manifestaría exactamente en el peor momento —el viernes en que hiciera falta escalar— y que no aparecería en ninguna alarma de CloudWatch, ninguna regla de Config ni ninguna traza de X-Ray. Sabes gestionar Service Quotas: ver el uso, solicitar aumentos con antelación porque los grandes tardan días, recordar que son por región, contar el despliegue azul/verde que duplica las instancias, y sobre todo alarmar al 70 % con SERVICE_QUOTA(), la función que hace que la alarma se recalibre sola cuando la cuota cambie. Dos alarmas, 0,20 USD al mes, para no quedarte sin escalar un viernes.

Conoces la API de Trusted Advisor (Business, y solo en us-east-1, el mismo patrón de ACM y las Web ACL de CloudFront), la exportación de recomendaciones a CSV, las notificaciones semanales a los contactos alternativos de 01-02, y la integración con EventBridge (07-03) que permite no solo notificar sino actuar —desactivar automáticamente una clave de acceso que ha aparecido en un repositorio público—. Y sabes dónde encajan Compute Optimizer y Cost Optimization Hub, con la advertencia que resume la relación entre herramientas y personas: Compute Optimizer recomienda reducir mercadofresco-tienda-01 a t3.small; la respuesta correcta es apagarla. Las herramientas optimizan lo que hay; la pregunta de si debe haberlo la hace una persona.

Y tienes la rutina mensual de Marta: una hora, el primer lunes, con su lista de comprobación de seguridad, coste, fiabilidad, observabilidad y deuda técnica. Con el punto que más se salta y más importa: revisar las alarmas que dieron falsos positivos y borrarlas o recalibrarlas, porque una alarma que se ignora es peor que no tener alarma.

Con esto se cierra el módulo 5. La capa de observabilidad de MercadoFresco está completa: métricas y paneles con mercadofresco-produccion, MercadoFresco/Tienda y trece alarmas verificadas con simulacro; trazas de extremo a extremo con muestreo al 100 % en los pedidos y al 0 % en el health check; auditoría inalterable en trail-mercadofresco con siete años de retención y consultas SQL sobre cada llamada a la API; cumplimiento continuo con 29 reglas de Config y remediación automática que restaura el cifrado de un bucket en ocho minutos; y el repaso automático que encuentra lo que a nadie se le ocurrió preguntar. Las cinco preguntas del módulo 4 tienen respuesta —el aviso llega, los registros se correlacionan, el pedido de ocho segundos era un N+1, la copia la descifró Luis probando una restauración de madrugada, y el cifrado se restaura solo— y por 62,47 USD al mes, el 9,9 % de la factura, con cinco líneas de configuración separando esa cifra de más de 600.

Y ahora, con la casa por fin vigilada, la vigilancia empieza a enseñar algo incómodo. El panel de Marta lo lleva diciendo desde que lo montamos, y los datos de este módulo lo confirman desde tres ángulos distintos: el siguiente cuello de botella es la base de datos.

mercadofresco-pedidos es una única instancia de PostgreSQL que lo hace todo, y lo hace mal por razones distintas en cada caso. El carrito castiga una tabla de sesiones con escrituras constantes de datos que no tienen ninguna necesidad de ser transaccionales ni de vivir para siempre. Los informes de Sara, con sus agregaciones sobre meses de historia, bloquean la producción cuando los ejecuta en horas de trabajo —y la réplica de lectura solo desplaza el problema, no lo resuelve—. El catálogo se consulta miles de veces por minuto para devolver siempre lo mismo: precios y descripciones que cambian una vez al día. Y el propio X-Ray enseñó que incluso después de corregir el N+1, la latencia de la tienda sigue dominada por consultas a la base de datos.

Todo eso está en una sola instancia porque, cuando empezamos en 02-04, PostgreSQL era la respuesta obvia. Y lo era. Pero una base de datos relacional no es la herramienta correcta para todos los trabajos, y forzarla a serlo es la causa más común de arquitecturas que no escalan.

En el módulo 6, «Bases de datos», empezando por 06-01, «Cómo elegir la base de datos adecuada», veremos el modelo de decisión: relacional frente a clave-valor, documental, en memoria, de series temporales y de grafos, con los criterios reales —patrón de acceso, consistencia, latencia, volumen y coste— para elegir cada una. Después DynamoDB para la tabla de sesiones y el carrito, Aurora como la evolución natural de PostgreSQL cuando hace falta más, Redshift para que los informes de Sara dejen de tocar producción, y ElastiCache para que el catálogo se sirva desde memoria en microsegundos. Y todo ello con la ventaja de que, por primera vez en el curso, cada cambio que hagamos se podrá medir: tenemos las métricas, las trazas y los paneles para demostrar si una decisión de arquitectura fue buena o no.

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