Terraform:如何传递多值输出并映射至另一模块变量
解决方案
1. 修正安全组模块的输出
每个ec2_sg模块实例仅创建一个安全组,原输出使用aws_security_group.sg.*.id会返回列表格式,需改为单个ID输出:
output "sg_id" { value = aws_security_group.sg.id }
2. 调整EC2模块的资源映射逻辑
推荐使用与安全组模块一致的for_each来实现一一映射,逻辑更清晰且避免索引错位问题:
module "sg" { for_each = toset(var.Name) source = "./modules/ec2_sg" App_Name = each.value } module "ec2" { for_each = toset(var.Name) source = "./modules/ec2" Name = each.value EC2_SG_ID = module.sg[each.value].sg_id }
如果坚持使用count(需确保var.Name列表元素唯一),可通过列表索引匹配对应的安全组:
module "sg" { for_each = toset(var.Name) source = "./modules/ec2_sg" App_Name = each.value } module "ec2" { count = length(var.Name) source = "./modules/ec2" Name = var.Name[count.index] EC2_SG_ID = module.sg[var.Name[count.index]].sg_id }
逻辑说明
- 安全组模块通过
for_each = toset(var.Name)创建实例后,module.sg会成为以var.Name元素为键的映射集合,每个键对应一个安全组模块实例。 - EC2模块使用相同的
for_each或通过列表索引匹配键值,直接获取对应安全组的ID,实现安全组与EC2实例的一一绑定。
内容的提问来源于stack exchange,提问作者Nijo
相关产品推荐
相关产品推荐

