Terraform嵌套for_each遍历fwd_rules配置负载均衡规则问题
问题核心原因
你当前的配置错误根源是fwd_rules被定义为字符串类型,而非可遍历的列表/集合类型,直接对字符串执行toset转换只会拆分出每个独立字符作为元素,完全不符合预期。
修复步骤
1. 调整configuration变量结构
将fwd_rules从字符串改为标准的Terraform字符串列表,去掉外层引号和错误的花括号:
configuration = [ { "application_name" : "myapp", "no_of_instances": 2, # 补全你代码中用到的实例数量字段 "fwd_rules" : ["/foo/*", "/bar/*"] }, { "application_name" : "myapp2", "no_of_instances": 2, "fwd_rules" : ["/foo2/*", "/bar2/*"] }]
如果受外部输入限制必须将fwd_rules存为字符串,可以将字符串改为合法JSON数组格式:"fwd_rules" : "[\"/foo/*\",\"/bar/*\"]",后续通过jsondecode函数转换即可。
2. 修正locals块配置
去掉fwd_rules的额外字符串转换,同时给实例名加序号避免重名导致for_each报错:
locals { serverconfig = [ for srv in var.configuration : [ for i in range(1, srv.no_of_instances+1) : { instance_name = "${srv.application_name}-${i}" # 增加序号区分同应用的多实例 fwd_rules = srv.fwd_rules # 直接引用列表,不要套引号转字符串 # 如果是JSON字符串格式的fwd_rules,用下面的写法转换 # fwd_rules = jsondecode(srv.fwd_rules) } ] ] } locals { instances = flatten(local.serverconfig) }
3. 调整负载均衡规则配置
aws_lb_listener_rule的path_pattern参数本身支持直接传入列表,无需使用dynamic块,简化写法如下:
resource "aws_lb_listener_rule" "myrule" { for_each = {for server in local.instances: server.instance_name => server} listener_arn = "你的监听器ARN" # 补全必填参数 condition { path_pattern { values = each.value.fwd_rules } } action { type = "forward" target_group_arn = "你的目标组ARN" # 补全必填参数 } }
如果确实需要遍历每个路径做特殊处理,保留dynamic块的写法即可,已经可以正常运行:
dynamic "path_pattern" { for_each = toset(each.value.fwd_rules) content { values = [path_pattern.value] } }
内容的提问来源于stack exchange,提问作者Markey
相关产品推荐
相关产品推荐

