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

如何在Terraform中从嵌套Map取值并创建Azure独立子网?

基于嵌套Map为多Azure VNet创建独立子网(解决for_each重复键问题)

核心思路

要解决这个问题,关键是把module.subnet_addrs输出的嵌套Map扁平化,生成包含唯一标识的子网条目,再用这个扁平化后的结构作为azurerm_subnet的for_each数据源,既可以提取子网名称、地址前缀,又能避免重复键冲突。

步骤1:扁平化嵌套Map并生成唯一键

假设module.subnet_addrs.subnets的结构如下(每个workload下包含base、all子网的CIDR):

{
  workload_a = {
    base = "10.0.1.0/24"
    all  = "10.0.2.0/24"
  },
  workload_b = {
    base = "10.1.1.0/24"
    all  = "10.1.2.0/24"
  }
}

通过本地值把嵌套结构展开,用workload名-子网名拼接成唯一键,同时保留关联VNet所需的属性:

locals {
  # 扁平化子网数据,生成每个子网的完整属性集合
  flattened_subnets = flatten([
    for workload_name, subnets in module.subnet_addrs.subnets : [
      for subnet_name, cidr in subnets : {
        key                 = "${workload_name}-${subnet_name}"
        workload_name       = workload_name
        subnet_name         = subnet_name
        address_prefix      = cidr
        vnet_id             = azurerm_virtual_network.workloads[workload_name].id
        resource_group_name = azurerm_resource_group.workloads[workload_name].name
      }
    ]
  ])

  # 转换为以唯一key为索引的Map,适配for_each的要求
  subnet_map = { for s in local.flattened_subnets : s.key => s }
}

步骤2:创建独立的azurerm_subnet资源

用for_each遍历上面的local.subnet_map,为每个子网创建独立资源,同时配置服务端点:

resource "azurerm_subnet" "workload_subnets" {
  for_each             = local.subnet_map
  name                 = each.value.subnet_name
  resource_group_name  = each.value.resource_group_name
  virtual_network_id   = each.value.vnet_id
  address_prefixes     = [each.value.address_prefix]

  # 配置服务端点,满足你的业务需求
  service_endpoints = ["Microsoft.Storage", "Microsoft.Sql"]

  # 可选:私有端点网络策略配置
  private_endpoint_network_policies_enabled = true
}

关键说明

  • 唯一键解决冲突:通过${workload_name}-${subnet_name}确保每个子网的标识唯一,彻底避免for_each的重复键错误。
  • 灵活适配结构:如果module.subnet_addrs输出的子网包含更多属性(比如路由表关联),只需在扁平化时补充对应字段即可。
  • 服务端点支持:独立的azurerm_subnet资源可以直接配置service_endpoints,这是原azurerm_virtual_network动态块无法满足的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:02:11