Back to Blog

Alertas y Observabilidad en Azure Monitor con Terraform

Complete tutorial about azurerm_monitor_action_group in Terraform. Learn action groups, reglas de alerta, Log Analytics.

Alertas y Observabilidad en Azure Monitor con Terraform

Alertas y Observabilidad en Azure Monitor con Terraform

Introducción

Azure Monitor es una solución integral de supervisión que permite a las organizaciones recopilar, analizar y actuar sobre datos en tiempo real de sus recursos de Azure y aplicaciones. Utilizando Terraform, una herramienta de Infraestructura como Código (IaC), los equipos pueden automatizar la creación y gestión de alertas y grupos de acción para mejorar la observabilidad de sus sistemas.

La implementación de alertas y grupos de acción en Azure Monitor permite a los desarrolladores y administradores recibir notificaciones en tiempo real sobre el rendimiento y el estado de los recursos. Esto es crucial para la detección temprana de problemas y la respuesta rápida a incidentes. Además, con el uso de Log Analytics, se pueden crear consultas personalizadas para analizar datos, lo que ayuda a optimizar el rendimiento y la disponibilidad de las aplicaciones.

En este tutorial, aprenderemos a crear alertas y grupos de acción en Azure Monitor utilizando Terraform, lo que facilitará la implementación de prácticas de observabilidad efectivas y la gestión proactiva de incidentes.

Prerequisitos

Para seguir este tutorial, necesitarás tener:

  1. Terraform CLI instalado en tu máquina. Puedes descargarlo desde Terraform.
  2. Una suscripción de Azure activa. Si no tienes una, puedes crear una cuenta gratuita.
  3. Azure CLI instalado y configurado. Puedes encontrar las instrucciones de instalación aquí.
  4. Un principal de servicio en Azure con permisos suficientes para crear recursos. Este se puede crear utilizando Azure CLI o el portal de Azure.

Conceptos Fundamentales

Al trabajar con Azure Monitor y Terraform, es importante comprender algunos conceptos clave:

  • Acción Grupos: Colecciones de métodos de notificación y acciones automatizadas que se utilizan para responder a alertas.
  • Reglas de Alerta: Especificaciones que definen qué métricas o registros se supervisan y qué condiciones activan una alerta.
  • Log Analytics: Herramienta que permite consultar y analizar datos de registros de recursos de Azure.

Además, la gestión del estado en Terraform es fundamental. Terraform mantiene un archivo de estado que representa la infraestructura desplegada y permite realizar un seguimiento de los cambios.

Sintaxis de Recursos

El recurso principal que utilizaremos en este tutorial es azurerm_monitor_action_group. A continuación, se presenta la sintaxis básica y una tabla con los argumentos que podemos utilizar:

resource "azurerm_monitor_action_group" "example" {
  name                = "example-action-group"
  resource_group_name = azurerm_resource_group.example.name
  short_name          = "example"

  email_receiver {
    name                    = "example-email"
    email_address           = "example@example.com"
    use_common_alert_schema = true
  }

  sms_receiver {
    name          = "example-sms"
    country_code  = "+1"
    phone_number  = "1234567890"
  }
}
Argumento Descripción
name Nombre del grupo de acción.
resource_group_name Nombre del grupo de recursos en el que se creará el grupo.
short_name Nombre corto usado en SMS.
email_receiver Bloque que define un receptor de correo electrónico.
sms_receiver Bloque que define un receptor de SMS.

Ejemplos Prácticos

1. Crear un Grupo de Acción Simple

resource "azurerm_monitor_action_group" "simple_action_group" {
  name                = "simple-action-group"
  resource_group_name = azurerm_resource_group.example.name
  short_name          = "simpAg"

  email_receiver {
    name                    = "alert-email"
    email_address           = "alert@example.com"
    use_common_alert_schema = true
  }
}

2. Crear un Grupo de Acción con Múltiples Receptores

resource "azurerm_monitor_action_group" "multi_receiver" {
  name                = "multi-receiver-action-group"
  resource_group_name = azurerm_resource_group.example.name
  short_name          = "multiAg"

  email_receiver {
    name                    = "email1"
    email_address           = "email1@example.com"
    use_common_alert_schema = true
  }

  sms_receiver {
    name         = "sms1"
    country_code = "+1"
    phone_number = "1234567890"
  }
}

3. Regla de Alerta con Grupo de Acción

resource "azurerm_monitor_metric_alert" "example_alert" {
  name                = "example-alert"
  resource_group_name = azurerm_resource_group.example.name
  resource_id         = azurerm_virtual_machine.example.id
  severity            = "Sev1"
  
  criteria {
    metric_name        = "Percentage CPU"
    metric_namespace   = "Microsoft.Compute/virtualMachines"
    aggregation        = "Average"
    operator           = "GreaterThan"
    threshold          = 80
  }

  action {
    action_group_id = azurerm_monitor_action_group.simple_action_group.id
  }
}

4. Crear un Grupo de Acción con Webhook

resource "azurerm_monitor_action_group" "webhook_action_group" {
  name                = "webhook-action-group"
  resource_group_name = azurerm_resource_group.example.name
  short_name          = "webhookAg"

  webhook_receiver {
    name        = "webhook1"
    service_uri = "https://example.com/api/alert"
  }
}

5. Crear un Grupo de Acción para ITSM

resource "azurerm_monitor_action_group" "itsm_action_group" {
  name                = "itsm-action-group"
  resource_group_name = azurerm_resource_group.example.name
  short_name          = "itsmAg"

  itsm_receiver {
    name              = "itsm1"
    service_now {
      incident_id = "incident123"
    }
  }
}

6. Crear un Grupo de Acción con Varias Acciones

resource "azurerm_monitor_action_group" "complex_action_group" {
  name                = "complex-action-group"
  resource_group_name = azurerm_resource_group.example.name
  short_name          = "complexAg"

  email_receiver {
    name                    = "alert-email"
    email_address           = "alert@example.com"
    use_common_alert_schema = true
  }

  sms_receiver {
    name         = "alert-sms"
    country_code = "+1"
    phone_number = "0987654321"
  }

  webhook_receiver {
    name        = "alert-webhook"
    service_uri = "https://example.com/api/alert"
  }
}

7. Crear Regla de Alerta con Log Analytics

resource "azurerm_monitor_log_alert" "log_alert" {
  name                = "log-alert"
  resource_group_name = azurerm_resource_group.example.name
  log_query          = "AzureActivity | where ActivityStatus == 'Failed'"
  frequency          = "PT5M"
  time_window        = "PT5M"
  action {
    action_group_id = azurerm_monitor_action_group.simple_action_group.id
  }
}

8. Crear un Grupo de Acción con métricas de Log Analytics

resource "azurerm_monitor_action_group" "log_analytics_action_group" {
  name                = "log-analytics-action-group"
  resource_group_name = azurerm_resource_group.example.name
  short_name          = "logAg"

  log_analytics_receiver {
    name                = "logReceiver1"
    workspace_id        = azurerm_log_analytics_workspace.example.id
    log_query           = "Heartbeat | summarize count() by bin(TimeGenerated, 5m)"
  }
}

Casos de Uso del Mundo Real

1. Monitoreo de Aplicaciones Críticas

En una empresa que tiene aplicaciones críticas, se pueden configurar alertas para múltiples métricas, como el uso de CPU y la disponibilidad de servicios. Utilizando grupos de acción, los equipos pueden recibir notificaciones inmediatas por correo electrónico y SMS, asegurando que se tomen acciones correctivas rápidamente.

2. Alertas de Seguridad

Para entornos que requieren cumplimiento normativo, se pueden utilizar alertas de log para monitorear accesos no autorizados o cambios en configuraciones críticas. Integrando grupos de acción con ITSM, se puede automatizar la creación de incidentes en herramientas de gestión de servicio.

3. Optimización de Costos

Las organizaciones pueden configurar alertas para monitorear el uso de recursos y recibir notificaciones cuando se superen ciertos umbrales de costos. Esto permite a los administradores ajustar recursos y optimizar gastos.

Mejores Prácticas

  1. Modulariza tu código: Utiliza módulos de Terraform para agrupar configuraciones relacionadas, facilitando la reutilización.
  2. Gestiona el estado: Utiliza un backend remoto, como Azure Storage, para almacenar el estado de Terraform y facilitar la colaboración.
  3. Nombres descriptivos: Utiliza convenciones de nomenclatura claras y consistentes para facilitar la identificación de recursos.
  4. Desactiva recursos no utilizados: Configura alertas para desactivar recursos que no están en uso, lo que ayuda a reducir costos.
  5. Documenta tus configuraciones: Incluye comentarios en el código de Terraform para explicar la funcionalidad y la lógica detrás de las configuraciones.

Errores Comunes

  1. Error de permisos: "Error: Error creating Action Group: authorization failed". Asegúrate de que el principal de servicio tenga permisos suficientes.
  2. Error de recursos duplicados: "Error: Resource already exists". Verifica que no estés intentando crear un recurso con un nombre que ya existe.
  3. Error de configuración de URI: "Invalid URI format". Asegúrate de que las URL de los webhooks sean válidas.
  4. Error de propiedad faltante: "Error: Missing required argument". Asegúrate de que todos los argumentos requeridos estén presentes en tu configuración.

Recursos Relacionados

Título URL
Documentación de Azure Monitor Azure Monitor Documentation
Registro de Terraform Terraform Registry
Guía de Azure CLI Azure CLI Documentation

Script de Infraestructura Completo

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "East US"
}

resource "azurerm_log_analytics_workspace" "example" {
  name                = "example-law"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  sku                 = "PerGB2018"
}

resource "azurerm_monitor_action_group" "example" {
  name                = "example-action-group"
  resource_group_name = azurerm_resource_group.example.name
  short_name          = "example"

  email_receiver {
    name                    = "alert-email"
    email_address           = "alert@example.com"
    use_common_alert_schema = true
  }

  sms_receiver {
    name         = "alert-sms"
    country_code = "+1"
    phone_number = "1234567890"
  }
}

resource "azurerm_monitor_metric_alert" "example_alert" {
  name                = "example-alert"
  resource_group_name = azurerm_resource_group.example.name
  resource_id         = azurerm_log_analytics_workspace.example.id
  severity            = "Sev2"

  criteria {
    metric_name        = "Percentage CPU"
    metric_namespace   = "Microsoft.Compute/virtualMachines"
    aggregation        = "Average"
    operator           = "GreaterThan"
    threshold          = 80
  }

  action {
    action_group_id = azurerm_monitor_action_group.example.id
  }
}

Conclusión

En este tutorial, hemos explorado cómo implementar alertas y grupos de acción en Azure Monitor utilizando Terraform. Ahora puedes automatizar la supervisión y la gestión de alertas, lo que te permitirá mejorar la observabilidad de tus aplicaciones y recursos. ✅

Te animamos a seguir practicando y explorando más opciones de configuración en Terraform y Azure Monitor, así como a implementar estas prácticas en tus proyectos futuros.

Referencias