求助:使用Terraform For_Each过滤环境实现差异化Azure监控告警配置
问题:Terraform For_Each 过滤环境实现差异化监控告警配置
现有locals.tf定义
locals { environments = [ "dev", "test", "preprod", "prod" ] }
需求说明
需要为environments列表中除prod外的每个环境创建相同配置的Azure监控指标告警(azurerm_monitor_metric_alert),prod环境则使用单独的差异化配置,但原有For_Each写法无法正常运行。
修正后的代码实现
1. 非prod环境的监控告警配置
resource "azurerm_monitor_metric_alert" "non_prod" { # 过滤出除prod外的环境,转换为set用于for_each for_each = toset([for env in local.environments : env if env != "prod"]) name = "${each.key}-metric-alert" resource_group_name = azurerm_resource_group.rg.name scopes = [azurerm_storage_account.to_monitor[each.key].id] # 非prod环境的专属配置 # [..........ADDITIONAL NON-PROD RESOURCE CONFIG...........] }
2. prod环境的监控告警配置
resource "azurerm_monitor_metric_alert" "prod" { # 仅过滤prod环境,用toset确保符合for_each要求(即使只有一个元素) for_each = toset([for env in local.environments : env if env == "prod"]) name = "${each.key}-metric-alert" resource_group_name = azurerm_resource_group.rg.name scopes = [azurerm_storage_account.to_monitor[each.key].id] # prod环境的专属配置 # [..........ADDITIONAL PROD CONFIG...........] }
关键修正点
- 资源名称冲突:原有代码中两个资源块都使用
main作为名称,会导致Terraform资源命名冲突,需改为不同的名称(如non_prod和prod)。 - For_Each语法错误:
for_each要求接收集合(set)或键值对映射(map),原有写法的for表达式语法不正确,需通过[for env in local.environments : env if 条件]生成过滤后的列表,再用toset()转换为集合。 - 简化写法可选:对于prod环境,也可以直接使用
toset(["prod"])替代过滤表达式,前提是确认locals.environments中一定包含prod。
内容的提问来源于stack exchange,提问作者hitman126
相关产品推荐
相关产品推荐

