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

Terraform中如何将一个模块的列表型输出传递至另一个模块的变量?

在Terraform中传递列表型模块输出到另一个模块变量的正确方式

嘿,我来帮你搞定这个问题。在Terraform里把一个模块的列表输出传给另一个模块的变量其实非常直接,但要避开一个常见的小坑——不要做多余的嵌套,不然会导致类型不匹配。

第一步:确认源模块的输出是正确的列表类型

你提到的vpc_utility模块已经正确定义了列表类型的输出,这部分没问题:

# module1/outputs.tf
output "vpc_id" {
 description = "The ID of the VPC"
 value = module.vpc_utility.vpc_id
}
output "private_subnets" {
 description = "List of IDs of private subnets"
 value = module.vpc_utility.private_subnets # 这个输出本身就是列表类型
}

第二步:确保目标模块的变量类型匹配

在module2/vars.tf里,你需要把接收的变量定义为列表类型,这样才能正确接收传递过来的值:

# module2/vars.tf
variable "vpc_id" {
 description = "ID of the VPC to use"
 type        = string
}

variable "private_subnets" {
 description = "List of private subnet IDs for resources"
 type        = list(string) # Terraform 0.12+ 推荐用这种类型定义;旧版可以写 type = "list"
}

第三步:正确传递列表输出(重点!)

你当前在thing.tf里的写法有个小问题:

# 错误写法
private_subnets = ["${module.vpc_utility.private_subnets}"]

这种写法会把原本的列表转换成一个包含单个字符串元素的新列表(相当于把原列表序列化成了字符串),导致模块2收到的变量类型不符合预期。

正确的做法是直接引用源模块的输出,不需要额外加方括号:

# thing.tf 正确写法
module "module2" {
 source = "./module2"
 vpc_id         = module.vpc_utility.vpc_id # Terraform 0.12+ 可以省略插值语法${},直接引用
 private_subnets = module.vpc_utility.private_subnets
}

这样传递的就是原封不动的列表类型,模块2能完美接收。

小技巧:验证类型是否正确

如果你不确定传递的类型是否正确,可以用terraform console命令进入交互式控制台,输入module.vpc_utility.private_subnets查看它的类型,再输入module.module2.private_subnets确认传递后的类型是否一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:51:44