Diseñar alertas preventivas en AWS con Terraform: enfoque IaC y rollout seguro


Introduccion

Cuando un equipo decide mejorar su observabilidad, el error habitual no es elegir mal una metrica. El error habitual es convertir la monitorizacion en una lista de checks manuales, sin versionado, sin trazabilidad y sin un flujo claro de despliegue.

Para evitar ese problema, una estrategia eficaz es tratar las alertas como infraestructura como codigo (IaC): recursos versionados, revisables y desplegables con el mismo rigor que el resto de la plataforma.

Este articulo no se centra en comandos concretos. Se centra en como diseñar un sistema de alertas preventivas en AWS con Terraform para que sea:

  • Repetible entre entornos.
  • Revisable en Pull Request.
  • Seguro de desplegar.
  • Facil de evolucionar.

Si buscas la implementacion paso a paso con recursos y ejemplos Terraform, revisa el articulo complementario: Implementar alarmas de infraestructura con Terraform en AWS (SNS + CloudWatch) paso a paso.

Por que IaC para alertas (y no solo consola)

Crear alarmas desde consola AWS puede ser correcto para aprender el flujo o validar una hipotesis. De hecho, es una muy buena forma de entender la evaluacion visual de CloudWatch.

El problema aparece cuando necesitas mantener el sistema:

  • nuevos entornos (dev, staging, prod)
  • cambios de thresholds
  • nuevos canales de notificacion
  • auditoria de quien cambio que

Con IaC, la conversacion cambia:

  • El cambio queda en codigo.
  • Se revisa en PR.
  • Se valida con plan.
  • Se despliega con apply.

Y, sobre todo, se puede replicar.

Arquitectura minima que escala bien

Para un baseline de alertas preventivas, no necesitas una arquitectura compleja. Una composicion simple cubre mucho terreno:

  1. Metricas nativas (por ejemplo, AWS/EC2).
  2. CloudWatch Alarms para evaluacion de umbrales.
  3. SNS como capa de notificacion desacoplada.

Esta separacion es importante:

  • CloudWatch evalua.
  • SNS distribuye.
  • Tu equipo decide despues si consume por email, Slack, Chatbot o incident management.

Principios de diseño recomendados

1) Empezar por alertas preventivas, no por volumen

Es mejor desplegar pocas alertas bien calibradas que muchas alertas ruidosas.

Ejemplo de baseline EC2:

  • CPU warning
  • CPU critical
  • StatusCheckFailed
  • CPUCreditBalance (si la instancia es burstable)

Esto ya te da cobertura operativa real sin saturar al equipo.

2) Estandarizar naming desde el inicio

Un patron de nombres consistente reduce errores y facilita busqueda, filtrado y operaciones.

Formato recomendado:

<env>-<service>-<resource>-<metric>-<severity>

Ejemplos:

  • stg-ec2-bastion-cpu-warning
  • stg-ec2-api-statuscheckfailed-critical

3) Separar canales de notificacion por entorno

No mezcles en un mismo topic alertas de dev, staging y prod.

Beneficios:

  • menos ruido
  • troubleshooting mas rapido
  • validaciones de rollout mas seguras

Patron habitual:

  • dev-infra-alerts
  • stg-infra-alerts
  • prod-infra-alerts

4) Diseñar pensando en rollout por entornos

Un error frecuente es intentar llegar a produccion demasiado pronto.

Patron recomendado:

  1. dev: validar recurso, naming y canal SNS
  2. staging: validar repetibilidad por Terraform
  3. prod: aplicar configuracion ya estabilizada

Este enfoque reduce riesgo y evita “sorpresas de IaC” en el entorno mas sensible.

Decisiones de modelado en Terraform

Root module vs modulo dedicado de monitorizacion

Aunque puedes declarar alarmas en el root module, un modulo dedicado suele escalar mejor cuando el sistema crece.

Ventajas del modulo de monitorizacion:

  • Encapsula SNS + alarmas.
  • Reutilizable por entorno.
  • Facil de extender a nuevas metricas/servicios.
  • Mantiene el root como orquestador.

Patron practico:

  • modules/monitoring_ec2_alerts
  • root pasa IDs/nombres necesarios (instancia, ASG, endpoint de notificacion)

Variables de Terraform vs variables de entorno

Una confusion habitual en Terraform Cloud es mezclar:

  • Terraform variables (inputs declarados en el codigo)
  • Environment variables (credenciales y configuracion del runtime)

Regla simple:

  • infra_alerts_email -> Terraform variable
  • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION -> Environment variables

Separarlo bien reduce warnings y evita configuraciones ambiguas.

Trade-offs reales que conviene decidir antes

Alarmas por InstanceId vs por AutoScalingGroupName

No hay una respuesta universal. Depende de tu objetivo operativo.

Por InstanceId

  • mas granular
  • ideal para bastion o instancias fijas
  • menos robusto si hay reemplazos frecuentes

Por AutoScalingGroupName

  • mas estable para APIs detras de ASG
  • mejor para continuidad del despliegue
  • menos granular si escalan varias instancias

Diseñar este punto antes evita refactors innecesarios.

Qué validar primero

No intentes validar todas las metricas el mismo dia.

Secuencia recomendada:

  1. SNS + suscripcion
  2. una alarma simple (ej. CPU warning)
  3. prueba controlada
  4. resto del baseline

Flujo operativo seguro (PR -> plan -> apply)

Un flujo simple y robusto para alertas IaC:

  1. Crear rama por issue.
  2. Implementar cambios (modulo, variables, naming, outputs).
  3. terraform validate.
  4. terraform plan y revisar diff.
  5. Aplicar solo cuando el plan es entendible y acotado.
  6. Verificar recursos en AWS + test de notificacion.

El punto clave no es solo “que Terraform aplique”. Es que el equipo pueda entender el cambio antes de aplicarlo.

Checklist de diseño antes de implementar

  • Naming estandar definido por entorno
  • Canales SNS separados por entorno
  • Lista minima de alertas (baseline) acordada
  • Estrategia de rollout dev -> staging -> prod
  • Decision tomada: InstanceId vs ASG
  • Variables/credenciales separadas correctamente en Terraform Cloud
  • Plan de validacion operativa (incluye prueba real)

Relacion con un enfoque manual (consola/CLI)

IaC no sustituye el aprendizaje del flujo nativo de AWS. Lo complementa.

Si quieres entender primero CloudWatch y SNS desde consola/CLI con una prueba real de CPU, revisa este post previo:

Ese enfoque es ideal para aprender. Este post es ideal para diseñar y escalar.

Cierre

Diseñar alertas preventivas como IaC no va solo de “automatizar Terraform”. Va de construir un sistema operable: con rollout seguro, naming consistente, canales por entorno y cambios revisables.

Cuando esa base esta bien planteada, la implementacion tecnica es mucho mas sencilla de mantener.

Siguiente paso recomendado: implementa el baseline con Terraform usando SNS + CloudWatch y valida el flujo end-to-end. Para eso, aqui tienes la guia practica: Implementar alarmas de infraestructura con Terraform en AWS (SNS + CloudWatch) paso a paso.

¿Impulsamos tu plan FinOps?

Si quieres pasar de recomendaciones a resultados, puedo ayudarte a priorizar quick wins, owners y métricas de seguimiento semanales.