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
- Qué es Trusted Advisor y en qué se diferencia de Config
- Y en qué se diferencia de Well-Architected
- Las cinco categorías
- Qué comprueba cada categoría
- Qué ves según el plan de soporte
- Cómo suplir lo que el plan Basic no da
- Recorrido comentado de un informe de MercadoFresco
- Cuotas de servicio: el límite invisible
- El caso del ASG que no pasa de cuatro instancias
- Solicitar un aumento de cuota
- Alarmar antes de chocar con una cuota
- Automatización: API, exportación y notificaciones
- Integración con EventBridge
- Compute Optimizer y Cost Optimization Hub
- La rutina de revisión mensual de Marta
- Cierre del módulo: la capa de observabilidad completa
- Las cinco preguntas del módulo 4, respondidas
- Coste total añadido
- 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 | Tú | AWS |
| Personalizable | Sí, totalmente | Muy poco (algunos umbrales) |
| Alcance | Los recursos que grabas | Toda la cuenta, siempre |
| Latencia | Minutos | Refresco cada 24 h (o manual) |
| Remedia | Sí | No |
| Detecta lo que no previste | No | Sí |
| Coste | Por CI y evaluación | Incluido en el plan de soporte |
| Historial | Sí, 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 | Sí |
| Permisos de bucket de S3 | Sí |
| MFA en la cuenta raíz | Sí |
| Política de contraseñas de IAM | Sí |
| Instantáneas de RDS públicas | Sí |
| Instantáneas de EBS públicas | Sí |
| Uso de IAM (existencia de usuarios/roles) | Sí |
| Límites de servicio | Sí |
| Claves de acceso expuestas públicamente | Sí |
| 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-1IP 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-1Balanceadores 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
doneLos 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) ymercadofresco-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
DeleteOnTerminationesté 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-01al 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-1Las 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-1Los estados posibles: PENDING, CASE_OPENED, APPROVED, DENIED, CASE_CLOSED.
Consejos prácticos, aprendidos a base de disgustos:
- 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.
- Pide con margen, pero razonable. Pedir 64 vCPU cuando usas 8 es razonable si esperas crecer. Pedir 10.000 sin justificación se deniega.
- 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.
- Las cuotas son por región. Subirla en
eu-west-1no la sube enus-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. - Algunas cuotas son por cuenta, no por región: IAM, S3, CloudFront.
- 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-1Ese 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-1SERVICE_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-1Coste: 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-devLa 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-1Dos 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-1Salida 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-logssobre el mes anterior; guardar la salida. - [ ] Consulta de Athena: IP de origen desconocidas y
AccessDeniedagrupados (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-comprano 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-statesobre 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:
- Retención en cada grupo de registros el día que se crea (05-01).
- Ninguna dimensión de cardinalidad alta en métricas personalizadas (05-01).
- Muestreo de X-Ray al 0 % en
/saludy estáticos, 100 % en pedidos (05-02). - Selectores de eventos de datos por prefijo y
readOnly: false(05-03). recordingFrequency: DAILYpara 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
AccessDeniedderol-mercadofresco-tiendasobres3:GetObject.
Coste
- Factura de CloudWatch: de 44 a 71 USD.
- 1 volumen EBS
availablede 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-compraha fallado 14 veces, todas entre las 03:00 y las 03:20.
Observabilidad
- La alarma
mercadofresco-pedidos-fallidosha 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 | Sí |
| IP elásticas | 5 (usadas 5) | 10 | Sí |
| 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-1Justificació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-1La 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 diaSELECT 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-1Grupo 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-fallidosya 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-statecontra 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
- ¿Qué es AWS?
- Configuración de tu cuenta de AWS
- Infraestructura global de AWS
- Consola de administración de AWS
- AWS CLI y SDKs
Módulo 2: Servicios principales de AWS
Módulo 3: Redes y entrega de contenido
- Amazon VPC
- Grupos de seguridad y listas de control de acceso
- Elastic Load Balancing
- Amazon CloudFront
- Route 53
Módulo 4: Seguridad e identidad
- AWS Identity and Access Management (IAM)
- AWS Key Management Service (KMS)
- Secrets Manager y Parameter Store
- AWS Shield
- AWS WAF
Módulo 5: Monitorización y gestión
- Amazon CloudWatch
- AWS X-Ray y trazabilidad distribuida
- AWS CloudTrail
- AWS Config
- AWS Trusted Advisor
Módulo 6: Bases de datos
- Cómo elegir la base de datos adecuada
- Amazon DynamoDB
- Amazon Aurora
- Amazon Redshift
- Amazon ElastiCache
Módulo 7: Integración de aplicaciones
- Amazon SQS
- Amazon SNS
- Amazon EventBridge
- AWS Step Functions
- Patrones de integración: idempotencia, reintentos y colas de mensajes fallidos
