Search code examples
azureterraformazure-alerts

How to create alerts for Azure resources using Terraform


I have prepared Terraform scripts for azure resources like App Service, AppService Plan, Storage Account and Logic App etc.….

I have deployed the above Terraform scripts successfully. But I want to configure the alerts for the above resources using Terraform.

Is there any way to create alerts by using Terraform without ARM Template deployment?


Solution

  • Sure there is. This is an example of a custom log search from Application Insights. But you can easily modify this for another source like Azure Monitor

    resource "azurerm_application_insights" "example" {
      name                = "${var.prefix}-appinsights"
      location            = azurerm_resource_group.example.location
      resource_group_name = azurerm_resource_group.example.name
      application_type    = "web"
      retention_in_days   = 30
    }
    
    resource "azurerm_monitor_action_group" "example" {
      name                = "CriticalAlertsAction"
      resource_group_name = azurerm_resource_group.example.name
      short_name          = "p0action"
    
      email_receiver {
        name                    = "sendtoadmin"
        email_address           = "admin@example.com"
        use_common_alert_schema = true
      }
    }
    
    resource "azurerm_monitor_scheduled_query_rules_alert" "example-alert1" {
      name                = "${var.prefix}-alertrule1"
      location            = azurerm_resource_group.example.location
      resource_group_name = azurerm_resource_group.example.name
    
      action {
        action_group = [
          azurerm_monitor_action_group.example.id
        ]
      }
      data_source_id = azurerm_application_insights.example.id
      description    = "Exception threshold reached"
      enabled        = true
      # Count all requests with server error result code grouped into 5-minute bins
      query       = <<-QUERY
      requests
        | where cloud_RoleName == "frontend" and name !contains "Health" and resultCode startswith "5" 
      QUERY
      severity    = 1
      frequency   = 5
      time_window = 5
      trigger {
        operator  = "GreaterThan"
        threshold = 10
      }
    }