You need to enable JavaScript to run this app. Terraform本地嵌套模块如何透传内部引用在线Lambda模块的输出
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 20:15:03