如何跨不同Terraform根目录访问其他根模块的输出?
解决Terraform独立根模块间输出值共享问题
因为flow-components和lambdas是两个独立的Terraform根模块,它们的状态文件相互隔离,所以你无法直接在lambdas里引用flow-components中的module.s3输出。下面是两种可行的解决方案:
方案1:通过Terraform远程状态读取输出
如果你的flow-components模块已经配置了远程状态存储(比如S3),可以在lambdas根模块中通过terraform_remote_state数据源读取其输出值。
步骤1:确保flow-components使用远程状态
在flow-components目录的backend.tf中配置远程存储(以S3为例):
terraform { backend "s3" { bucket = "your-terraform-state-bucket" key = "environment/flow-components/terraform.tfstate" region = "us-east-1" } }
步骤2:在lambdas根模块中添加数据源
在lambdas目录下创建remote-state.tf,添加以下配置:
data "terraform_remote_state" "flow_components" { backend = "s3" config = { bucket = "your-terraform-state-bucket" # 与flow-components的状态桶一致 key = "environment/flow-components/terraform.tfstate" # 状态文件路径 region = "us-east-1" # 对应区域 } }
步骤3:引用远程状态的输出
修改lambdas中的lambda模块调用:
module "lambda" { source = "../../modules/lambda" environment = var.environment clean-bucket-name = data.terraform_remote_state.flow_components.outputs.clean-bucket-name infected-bucket-name = data.terraform_remote_state.flow_components.outputs.infected-bucket-name after-classification-bucket-name = data.terraform_remote_state.flow_components.outputs.after-classification-bucket-name }
方案2:手动传入输出值
如果不需要自动化同步,可以先执行flow-components的apply操作,获取输出值后手动传入lambdas模块。
步骤1:获取flow-components的输出
在flow-components目录执行:
terraform apply
执行完成后,控制台会输出所有定义的bucket名称。
步骤2:传入lambdas模块
可以通过tfvars文件或命令行参数传入:
- 使用tfvars文件:在
lambdas目录创建terraform.tfvars:
clean-bucket-name = "实际的clean桶名" infected-bucket-name = "实际的infected桶名" after-classification-bucket-name = "实际的after-classification桶名"
- 使用命令行参数:执行
apply时直接传入:
terraform apply \ -var "clean-bucket-name=xxx" \ -var "infected-bucket-name=yyy" \ -var "after-classification-bucket-name=zzz"
方案对比
- 远程状态方案:自动化程度高,适合生产环境,但需要配置远程状态存储。
- 手动传入方案:操作简单,适合测试或小型项目,但容易因人工失误导致配置错误。
内容的提问来源于stack exchange,提问作者Yuval B
相关产品推荐
相关产品推荐

