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
相关产品推荐
相关产品推荐

