Terraform本地嵌套模块如何透传内部引用在线Lambda模块的输出
核心结论
Terraform 原生完全支持嵌套模块的输出跨层级透传,根本不需要所谓动态路径语法。你遇到的报错本质是代码存在两处硬错误+模块引用路径写错,并非Terraform不支持该能力。
你当前代码里的两个直接问题
- 传参逻辑硬编码:在
lambda/main.tf中给内部lambda_template模块传值时,你写的function_name = "{var.function_name}"是纯字符串字面值,根本没有触发Terraform变量插值,实际传入的函数名就是大括号包裹的固定字符串,正确写法应为function_name = var.function_name。 - 报错触发点和作用域解析无关:你遇到的
No module call named "lambda_function" is declared in the root module报错,本质是你在根目录的main.tf中错误引用了不存在的模块——比如写了module.lambda_function.xxx或module.lambda_template.xxx,但根模块作用域下根本没有这两个名字的模块调用,Terraform才会抛出该错误,和你在lambda模块内部写的output逻辑没有任何关联。
嵌套输出透传的正确实现逻辑
Terraform的模块引用严格遵循作用域层级规则,不会出现“当前模块内的子模块引用被自动解析到根模块”的问题:
- 在
lambda目录(也就是你自定义的my_custom_lambda_function模块内部),只要静态引用同文件下定义的子模块,就能完成内部输出抓取:直接写module.<当前模块内定义的子模块名>.<子模块输出名>,解析范围仅局限在当前模块作用域,不会越界到根模块。 - 你在
lambda/main.tf中写的那段output配置本身语法完全合法,只要当前文件中确实定义了名为lambda_template的子模块调用,这段配置就会把内部公共Lambda模块输出的this_lambda_function_arn,包装成你自定义./lambda模块的对外输出function_arn。 - 上层根模块要获取该值时,只需要在根模块作用域下,引用根模块自己定义的
my_custom_lambda_function模块的对外输出即可,没有任何语法限制。
修正后的完整可运行代码
根目录/main.tf
module "my_custom_lambda_function" { source = "./lambda" function_name = "some-name" } # 根模块直接引用自定义模块的透传输出,即可拿到最终的Lambda ARN output "root_level_lambda_arn" { value = module.my_custom_lambda_function.function_arn }
lambda/main.tf
# 模块入参定义 variable "function_name" { type = string } # 嵌套调用公共Lambda模块,修正之前的硬编码传参错误 module "lambda_template" { source = "terraform-aws-modules/lambda/aws" function_name = var.function_name } # 透传内部子模块输出为当前自定义模块的对外输出 output "function_arn" { value = module.lambda_template.this_lambda_function_arn }
关于你尝试的动态路径写法的说明
Terraform 从设计上就不支持动态生成模块引用名,所有模块调用、引用都是静态定义的,但你的场景完全不需要动态语法——因为你在lambda模块内定义的子模块名是固定的lambda_template,直接静态引用即可满足需求,不存在语法障碍。
内容的提问来源于stack exchange,提问作者dimiguel
相关产品推荐
相关产品推荐

