Lab : Implementación del Monitoreo
Objetivo
Configurar un sistema de monitoreo completo con métricas, alarmas, logs y dashboard.
Parte 1 : Alarmas Básicas
Ejercicio 1.1 : Alarma CPU
Cree una alarma que se active cuando la CPU supere el 80% durante 10 minutos:
# Complete el comando
aws cloudwatch put-metric-alarm \
--alarm-name _____ \
--metric-name _____ \
--namespace _____ \
--statistic _____ \
--period _____ \
--threshold _____ \
--comparison-operator _____ \
--evaluation-periods _____ \
--dimensions Name=InstanceId,Value=i-xxx \
--alarm-actions arn:aws:sns:...:alerts
💡 Solución
aws cloudwatch put-metric-alarm \
--alarm-name ec2-cpu-high \
--metric-name CPUUtilization \
--namespace AWS/EC2 \
--statistic Average \
--period 300 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--dimensions Name=InstanceId,Value=i-xxx \
--alarm-actions arn:aws:sns:us-east-1:123456789:alerts \
--alarm-description "CPU above 80% for 10 minutes"
Explicación:
- Periodo 300s × 2 evaluaciones = 10 minutos
- Average para evitar falsos positivos por picos cortos
Ejercicio 1.2 : Alarma Disco
Cree una alarma para espacio en disco bajo (> 85% utilizado):
| Parámetro | Valor |
|---|---|
| Metric Name | ? |
| Namespace | ? |
| Threshold | ? |
| Period | ? |
💡 Solución
| Parámetro | Valor |
|---|---|
| Metric Name | disk_used_percent |
| Namespace | CWAgent |
| Threshold | 85 |
| Period | 3600 (1 hora) |
Nota: Esta métrica requiere que CloudWatch Agent esté instalado en la instancia.
Parte 2 : Configuración de Logs
Ejercicio 2.1 : Log Group y Retención
# Crear un log group con retención de 30 días
aws logs create-log-group \
--log-group-name /app/web-server
aws logs put-retention-policy \
--log-group-name /app/web-server \
--retention-in-days _____
💡 Solución
aws logs put-retention-policy \
--log-group-name /app/web-server \
--retention-in-days 30
Valores posibles: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1096, 1827, 2192, 2557, 2922, 3288, 3653
Ejercicio 2.2 : Metric Filter
Cree un filtro para contar los errores 500 en los logs:
aws logs put-metric-filter \
--log-group-name /app/web-server \
--filter-name error-500-count \
--filter-pattern '_______________' \
--metric-transformations \
metricName=Error500Count,\
metricNamespace=WebApp,\
metricValue=1
💡 Solución
aws logs put-metric-filter \
--log-group-name /app/web-server \
--filter-name error-500-count \
--filter-pattern '"HTTP/1.1" 500' \
--metric-transformations \
metricName=Error500Count,\
metricNamespace=WebApp,\
metricValue=1
# O para logs en JSON
aws logs put-metric-filter \
--log-group-name /app/web-server \
--filter-name error-500-json \
--filter-pattern '{ $.statusCode = 500 }' \
--metric-transformations \
metricName=Error500Count,\
metricNamespace=WebApp,\
metricValue=1
Parte 3 : Log Insights Queries
Ejercicio 3.1 : Consultas de Análisis
Escriba las consultas de Log Insights para:
A. Los últimos 10 errores:
# Su consulta aquí
B. Número de errores por hora en las últimas 24h:
# Su consulta aquí
C. Top 5 de páginas con error 404:
# Su consulta aquí
💡 Soluciones
A. Los últimos 10 errores:
fields @timestamp, @message
| filter @message like /ERROR|Exception|error/
| sort @timestamp desc
| limit 10
B. Número de errores por hora en las últimas 24h:
fields @timestamp, @message
| filter @message like /ERROR/
| stats count() as error_count by bin(1h)
| sort @timestamp desc
C. Top 5 de páginas con error 404:
fields @timestamp, @message
| filter @message like /404/
| parse @message /GET (?<path>\/[^ ]*)/
| stats count() as hits by path
| sort hits desc
| limit 5
Parte 4 : Dashboard
Ejercicio 4.1 : Crear un Dashboard
Defina los widgets para un dashboard de producción:
| Widget | Tipo | Métrica | Período |
|---|---|---|---|
| CPU Overview | ? | ? | ? |
| Memory Usage | ? | ? | ? |
| Request Count | ? | ? | ? |
| Error Rate | ? | ? | ? |
| Latency P99 | ? | ? | ? |
| Alarm Status | ? | ? | ? |
💡 Solución
| Widget | Tipo | Métrica | Período |
|---|---|---|---|
| CPU Overview | Línea | CPUUtilization | 5 min |
| Memory Usage | Línea | mem_used_percent | 5 min |
| Request Count | Área apilada | RequestCount | 1 min |
| Error Rate | Número | HTTPCode_5XX / Total × 100 | 5 min |
| Latency P99 | Línea | TargetResponseTime p99 | 1 min |
| Alarm Status | Alarm Status | Todas las alarmas | - |
Ejercicio 4.2 : Dashboard JSON
{
"widgets": [
{
"type": "metric",
"properties": {
"title": "CPU Utilization",
"metrics": [
["AWS/EC2", "CPUUtilization", "InstanceId", "i-xxx"]
],
"period": 300,
"stat": "Average",
"region": "us-east-1"
}
},
{
"type": "___",
"properties": {
"title": "Alarm Status",
"alarms": [
"arn:aws:cloudwatch:...:alarm:cpu-high",
"arn:aws:cloudwatch:...:alarm:mem-high"
]
}
}
]
}
💡 Solución
{
"widgets": [
{
"type": "metric",
"x": 0, "y": 0, "width": 12, "height": 6,
"properties": {
"title": "CPU Utilization",
"metrics": [
["AWS/EC2", "CPUUtilization", "InstanceId", "i-xxx"]
],
"period": 300,
"stat": "Average",
"region": "us-east-1",
"view": "timeSeries"
}
},
{
"type": "alarm",
"x": 12, "y": 0, "width": 12, "height": 6,
"properties": {
"title": "Alarm Status",
"alarms": [
"arn:aws:cloudwatch:us-east-1:123456789:alarm:cpu-high",
"arn:aws:cloudwatch:us-east-1:123456789:alarm:mem-high"
]
}
}
]
}
Parte 5 : Runbook
Ejercicio 5.1 : Crear un Runbook
Complete el runbook para el incidente "Memoria Alta":
┌─────────────────────────────────────────────────────────────┐
│ RUNBOOK : MEMORIA ALTA (> 90%) │
├─────────────────────────────────────────────────────────────┤
│ │
│ EVALUACIÓN INICIAL (máx 2 min) │
│ ☐ _______________________________________ │
│ ☐ _______________________________________ │
│ │
│ DIAGNÓSTICO (máx 5 min) │
│ ☐ _______________________________________ │
│ ☐ _______________________________________ │
│ ☐ _______________________________________ │
│ │
│ ACCIONES DE REMEDIACIÓN │
│ ☐ _______________________________________ │
│ ☐ _______________________________________ │
│ │
│ VALIDACIÓN │
│ ☐ _______________________________________ │
│ ☐ _______________________________________ │
│ │
└─────────────────────────────────────────────────────────────┘
💡 Solución
┌─────────────────────────────────────────────────────────────┐
│ RUNBOOK : MEMORIA ALTA (> 90%) │
├─────────────────────────────────────────────────────────────┤
│ │
│ EVALUACIÓN INICIAL (máx 2 min) │
│ ☐ Verificar si varias instancias están afectadas │
│ ☐ Verificar errores de usuario (502, timeouts) │
│ │
│ DIAGNÓSTICO (máx 5 min) │
│ ☐ Conexión SSH: free -h, top -o %MEM │
│ ☐ Identificar el proceso que consume memoria │
│ ☐ Revisar los logs de la aplicación por fugas de memoria │
│ │
│ ACCIONES DE REMEDIACIÓN │
│ ☐ Si hay fuga de memoria: Reiniciar la aplicación │
│ ☐ Si la carga es legítima: Escalar horizontalmente │
│ ☐ Liberar caché si es posible (drop_caches) │
│ │
│ VALIDACIÓN │
│ ☐ ¿La memoria bajó a < 80%? │
│ ☐ ¿La aplicación funciona normalmente? │
│ ☐ Crear ticket para análisis post-mortem │
│ │
└─────────────────────────────────────────────────────────────┘
Parte 6 : Escenario Completo
Contexto
Recibe una alerta: "Error rate above 5% for web-app"
Preguntas
- ¿Qué métricas consulta primero?
- ¿Qué logs analiza?
- ¿Qué consulta de Log Insights utiliza?
- ¿Cómo identifica la causa raíz?
💡 Solución Detallada
1. Métricas a consultar:
- HTTPCode_Target_5XX (ALB) → Confirmar errores 500
- RequestCount → Volumen de tráfico
- TargetResponseTime → Latencia
- HealthyHostCount → ¿Instancias caídas?
- CPUUtilization, Memory → ¿Recursos saturados?
2. Logs a analizar:
- /aws/elasticloadbalancing/ → Logs ALB
- /app/web-server → Logs de aplicación
- /var/log/messages → Logs de sistema
3. Consulta Log Insights:
fields @timestamp, @message
| filter @message like /500|ERROR|Exception/
| stats count() by bin(5m)
| sort @timestamp desc
Luego para detallar:
fields @timestamp, @message
| filter @message like /500/
| parse @message /(?<endpoint>\/api\/[^ ]*)/
| stats count() by endpoint
| sort count desc
| limit 10
4. Proceso de identificación:
- Correlacionar el momento del pico de errores con los despliegues
- Identificar el endpoint problemático
- Revisar los logs de ese endpoint específico
- Buscar la stack trace del error
- Identificar la causa (timeout de BD, bug de código, configuración...)
Entregable
Documento a Producir
- Configuración de alarmas (comandos CLI)
- Consultas Log Insights (mínimo 3)
- Definición del Dashboard (JSON o descripción)
- Runbook completo para 2 escenarios
- Análisis del escenario con solución
Criterios de Evaluación
| Criterio | Puntos |
|---|---|
| Alarmas correctamente configuradas | /20 |
| Consultas Log Insights | /20 |
| Dashboard pertinente | /20 |
| Runbooks completos | /25 |
| Análisis del escenario | /15 |
| Total | /100 |
Semana siguiente: MODULE 14 - FinOps