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
相关产品推荐
相关产品推荐

