如何将Terraform模块输出作为不同环境的输入变量
Terraform共享模块输出跨环境复用方案
方法1:远程状态数据源读取(推荐团队协作场景)
如果你的shared_modules用了远程状态后端(比如S3、Terraform Cloud),直接在各环境配置里通过terraform_remote_state读取共享模块的输出就行,不会重复创建资源。
操作步骤:
- 先确认
shared_modules的配置里已经配置好远程后端(以S3为例),比如在shared_modules/main.tf中:
terraform { backend "s3" { bucket = "你的共享状态存储桶名称" key = "shared_modules/terraform.tfstate" region = "你的区域" } }
- 在生产/非生产环境的配置文件(比如
production/main.tf)中添加数据源配置,读取共享模块的输出:
data "terraform_remote_state" "shared" { backend = "s3" config = { bucket = "你的共享状态存储桶名称" key = "shared_modules/terraform.tfstate" region = "你的区域" } } # 直接用读取到的输出值,比如给SNS主题加订阅 resource "aws_sns_topic_subscription" "lambda_notify" { topic_arn = data.terraform_remote_state.shared.outputs.sns_topic_notify_arn protocol = "lambda" endpoint = data.terraform_remote_state.shared.outputs.lambda_notify_arn }
方法2:本地状态导出读取(适合个人测试/单机器场景)
如果shared_modules用的是本地状态文件,先把输出值导出成JSON文件,再让各环境读取这个文件。
操作步骤:
- 在
shared_modules目录执行命令,把输出导出到上级目录的JSON文件:
terraform output -json > ../shared_outputs.json
- 在各环境的配置文件中,用
local_file数据源读取这个JSON,再解析使用:
data "local_file" "shared_outputs" { filename = "../shared_outputs.json" } locals { shared = jsondecode(data.local_file.shared_outputs.content) } # 引用示例 resource "aws_sns_topic_subscription" "lambda_notify" { topic_arn = local.shared.sns_topic_notify_arn.value protocol = "lambda" endpoint = local.shared.lambda_notify_arn.value }
关键提醒
- 绝对不要在环境目录里直接调用
shared_modules里的模块,不然Terraform会认为要创建新资源,直接报资源冲突错误。 - 用远程状态的话,要确保各环境的Terraform有读取远程状态存储的权限(比如S3的读权限)。
- 要是
shared_modules更新了资源,方法2需要重新执行导出命令,方法1会自动同步远程状态的最新值。
内容的提问来源于stack exchange,提问作者bhattraideb
相关产品推荐
相关产品推荐

