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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:45:01