Terraform配置Azure排除503的5xx状态码告警遇问题求助
解决方案
错误原因分析
- 第一个错误:
dimension块的values字段要求传入字符串数组,你之前传入的是对象({HttpStatusCode = criteria.value}),不符合类型要求。 - 第二个错误:
dimension块不支持直接将HttpStatusCode/HttpMethod作为参数,这两个是维度名称,需要通过name字段指定。
正确配置实现
通过在每个criteria块下添加两个独立的dimension块,分别指定HttpStatusCode和HttpMethod维度,同时保持用dynamic循环遍历所有目标状态码,即可实现一个告警资源覆盖所有需监控的5xx状态码(排除503):
locals { yyy_alert_status_codes = [500, 501, 502, 504, 505, 506, 507, 508, 510, 511] } resource "azurerm_monitor_metric_alert" "xxx-d-ar-yyy-failed" { provider = azurerm.dev name = "yyy-exceptions-alert-dev" resource_group_name = azurerm_resource_group.xxx-d-rg-yyy.name scopes = [azurerm_linux_web_app.xxx-d-app-yyy] description = "触发所有5xx状态码(排除503)的告警" severity = 1 dynamic "criteria" { for_each = local.yyy_alert_status_codes content { metric_namespace = "Microsoft.Web/sites" metric_name = "Http5xx" # 匹配当前循环的目标状态码 dimension { name = "HttpStatusCode" operator = "Include" values = [toset([criteria.value])] } # 匹配所有HTTP方法 dimension { name = "HttpMethod" operator = "Include" values = ["*"] } aggregation = "Total" operator = "GreaterThan" threshold = 0 } } action { action_group_id = azurerm_monitor_action_group.xxx-d-ag-yyy.id } }
关键说明
- 每个
criteria块对应一个状态码,包含两个维度配置,符合Azure Metric Alert的维度规则。 toset([criteria.value])确保数字类型的状态码被转为字符串数组,满足values字段的类型要求。- 全程用
dynamic循环复用配置逻辑,无需为每个状态码单独创建告警资源。
内容的提问来源于stack exchange,提问作者Svein Terje Gaup
相关产品推荐
相关产品推荐

