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

Terraform如何将两个列表/元组合并生成映射?

Terraform:通过两个列表创建可用区到子网的映射

要将存储可用区ID和子网ID的两个列表转换为可用区ID为键、对应子网ID为值的映射,可以直接使用Terraform内置的zipmap函数,它专门用于将两个长度相同的列表配对生成键值映射。

修正后的预期映射格式

首先需要纠正你示例中的错误:映射的键不能重复,正确的预期结果应该是每个可用区对应唯一的子网ID:

subnets_to_privatelink = {
  "use2-az1" = "subnet-07045e06d7f8a34d5"
  "use2-az2" = "subnet-0a2eead3a90c2f9e5"
  "use2-az3" = "subnet-0ef0d8fce5dd017ae"
}

实现代码

场景1:子网资源通过count创建(使用列表展开语法)

如果你的aws_subnet.tf_subnet是用count参数创建的,可以直接通过列表展开获取两个列表,再用zipmap生成映射:

locals {
  # 从子网资源中提取可用区ID和子网ID列表
  az_ids = aws_subnet.tf_subnet.*.availability_zone_id
  subnet_ids = aws_subnet.tf_subnet.*.id

  # 生成可用区到子网的映射
  subnets_to_privatelink = zipmap(local.az_ids, local.subnet_ids)
}

场景2:子网资源通过for_each创建(使用for表达式)

如果子网是用for_each创建的,需要用for表达式从资源对象中提取列表:

locals {
  # 从子网资源中提取可用区ID和子网ID列表
  az_ids = [for subnet in aws_subnet.tf_subnet : subnet.availability_zone_id]
  subnet_ids = [for subnet in aws_subnet.tf_subnet : subnet.id]

  # 生成映射
  subnets_to_privatelink = zipmap(local.az_ids, local.subnet_ids)
}

更简洁的写法

可以直接将for表达式嵌入zipmap参数,减少中间变量:

locals {
  subnets_to_privatelink = zipmap(
    [for s in aws_subnet.tf_subnet : s.availability_zone_id],
    [for s in aws_subnet.tf_subnet : s.id]
  )
}

关键说明

  • zipmap要求传入的两个列表长度必须完全相同,否则Terraform会抛出错误。
  • 映射的键会自动使用第一个列表的元素,值使用第二个列表对应位置的元素,顺序严格匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:25:03