Terraform基于条件用locals结合for_each迭代资源报错求解
解决方案
你的错误根源是for_each接收的布尔值集合和后续代码依赖的each.key/each.value完全不匹配。要实现「仅当local.url非空且var.aws_env等于"env"时迭代创建告警」的逻辑,正确写法如下:
resource "aws_cloudwatch_metric_alarm" "url_down" { for_each = (length(local.url) > 0 && var.aws_env == "env") ? local.url : {} alarm_name = each.value.alarm_name evaluation_periods = each.value.evaluation_periods period = each.value.period threshold = each.value.threshold alarm_description = each.value.alarm_name dimensions = { URL = each.key } # 省略其余配置 }
核心要点
- 用
length(local.url) > 0判断map是否非空:你定义的local.url是map类型,默认不会为null,这个判断能确保只有当存在URL配置时才触发迭代 - 条件满足时直接传入
local.url:for_each支持遍历map,此时each.key对应URL字符串,each.value对应每个URL的告警配置,完美匹配你后续的属性引用 - 条件不满足时传入空map
{}:Terraform会跳过该资源的所有实例创建
原写法的问题
你之前用toset([true])生成的是布尔值集合,each.value只会是true,不存在alarm_name等属性,同时each.key也无意义,既不符合for_each支持的类型要求,也和后续代码的逻辑完全脱节。
内容的提问来源于stack exchange,提问作者DisplayName
相关产品推荐
相关产品推荐

