Saltar al contenido principal

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ámetroValor
Metric Name?
Namespace?
Threshold?
Period?
💡 Solución
ParámetroValor
Metric Namedisk_used_percent
NamespaceCWAgent
Threshold85
Period3600 (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:

WidgetTipoMétricaPeríodo
CPU Overview???
Memory Usage???
Request Count???
Error Rate???
Latency P99???
Alarm Status???
💡 Solución
WidgetTipoMétricaPeríodo
CPU OverviewLíneaCPUUtilization5 min
Memory UsageLíneamem_used_percent5 min
Request CountÁrea apiladaRequestCount1 min
Error RateNúmeroHTTPCode_5XX / Total × 1005 min
Latency P99LíneaTargetResponseTime p991 min
Alarm StatusAlarm StatusTodas 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​

  1. ¿Qué métricas consulta primero?
  2. ¿Qué logs analiza?
  3. ¿Qué consulta de Log Insights utiliza?
  4. ¿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:

  1. Correlacionar el momento del pico de errores con los despliegues
  2. Identificar el endpoint problemático
  3. Revisar los logs de ese endpoint específico
  4. Buscar la stack trace del error
  5. Identificar la causa (timeout de BD, bug de código, configuración...)

Entregable​

Documento a Producir​

  1. Configuración de alarmas (comandos CLI)
  2. Consultas Log Insights (mínimo 3)
  3. Definición del Dashboard (JSON o descripción)
  4. Runbook completo para 2 escenarios
  5. Análisis del escenario con solución

Criterios de Evaluación​

CriterioPuntos
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