You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:30:11