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

Terraform创建locals时如何遍历map列表拆分CIDR生成目标结构?

错误原因

你当前的报错是因为第二层for循环中,拿到的cidr是每个AZ下的完整CIDR列表(tuple类型),你直接将整个列表赋值给了cidr_block字段,所以后续拼接for_each的key时,尝试把tuple转为字符串就触发了类型错误。
只需要再加一层循环遍历CIDR列表中的单个元素即可。

修复后的完整代码
locals {
  int_subnets = toset(flatten([
    # 第一层:遍历所有应用配置
    for app in var.subnets : [
      # 第二层:遍历单个应用下的所有可用区和对应CIDR列表
      for az, cidr_list in app.subnets : [
        # 第三层:遍历单个可用区下的每一个CIDR地址段
        for cidr in cidr_list : {
          app_name   = app.app_name
          cidr_block = cidr
          az         = az
        }
      ]
    ]
  ]))
}

resource "aws_subnet" "example" {
  for_each = {
    # 建议用冒号作为分隔符,避免应用名带空格时出现异常
    for s in local.int_subnets : "${s.app_name}:${s.az}:${s.cidr_block}" => s
  }

  vpc_id            = var.vpc_id
  cidr_block        = each.value.cidr_block
  availability_zone = each.value.az

  tags = {
    Name = "${each.value.app_name}-Int-${split("-", each.value.az)[2]}"
  }
}
逻辑说明

修改后通过三层嵌套循环+flatten压平,最终得到的local.int_subnets就是你要求的对象集合格式,每个元素的cidr_block都是单独的字符串类型,完全匹配AWS子网资源的参数要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:06:04