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

Terraform关联AWS WAF Web ACL与ALB时重复键错误解决咨询

解决Terraform中AWS WAF Web ACL与ALB关联的for_each重复key问题

你的报错核心是for_each使用了重复的key:external在var.web_acl中出现了两次,而Terraform要求for_each的key必须唯一。你之前尝试加...的方式不对,因为...是用来将重复key的元素分组为列表,但这里我们需要每个ALB与Web ACL的关联都是独立的资源实例,所以必须生成唯一key。

解决方案一:直接用组合key(推荐,改动最小)

修改for_each的key生成逻辑,将web_acl.name和web_acl.alb拼接成唯一标识,这样每个关联条目都有独一无二的key:

resource "aws_wafv2_web_acl_association" "example" {
  for_each = { for web_acl in var.web_acl : "${web_acl.name}-${web_acl.alb}" => web_acl }
  resource_arn = aws_alb.example[each.value.alb].arn
  web_acl_arn  = aws_wafv2_web_acl.example[each.value.name].arn
}

这样生成的key分别是internal-1、external-2、external-3,完全唯一,能正常创建三个关联资源,满足你的需求。

解决方案二:优化变量结构(更易维护)

如果想让变量结构更清晰,可以调整var.web_acl为每个Web ACL对应一个ALB列表,再通过嵌套for循环展开:

首先修改example.tfvars中的变量定义:

web_acl = [
  {
    name   = "internal"
    ip_set = "internal"
    albs   = ["1"]
    action = "BLOCK"
  },
  {
    name   = "external"
    ip_set = "external"
    albs   = ["2", "3"]
    action = "ALLOW"
  }
]

然后更新关联资源的代码:

resource "aws_wafv2_web_acl_association" "example" {
  for_each = merge([
    for web_acl in var.web_acl : {
      for alb in web_acl.albs : "${web_acl.name}-${alb}" => {
        web_acl_name = web_acl.name
        alb_name     = alb
      }
    }
  ]...)

  resource_arn = aws_alb.example[each.value.alb_name].arn
  web_acl_arn  = aws_wafv2_web_acl.example[each.value.web_acl_name].arn
}

这种方式更适合后续扩展(比如给某个Web ACL新增ALB),变量结构也更直观。

为什么你之前的...尝试没用?

你之前写的for_each = { for web_acl in var.web_acl : web_acl.name => web_acl... }是错误的语法。正确的分组写法会把相同key的元素合并成列表,但此时each.value会是一个包含多个ALB信息的列表,而aws_wafv2_web_acl_association资源要求每个实例对应一个关联,无法直接使用列表值,所以这种方式不符合你的场景。

内容的提问来源于stack exchange,提问作者Bcloud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:42:55