如何让Terraform同级目录部署复用兄弟模块创建的VPC?
问题根本原因
你当前的部署逻辑存在概念错误:Terraform的状态文件是与执行目录绑定的,你在shared目录执行apply生成的是shared目录独立的状态文件;而你在dev/main.tf中直接将../shared作为模块引入时,Terraform会将shared目录下定义的所有资源(包括VPC)作为dev目录的专属资源重新创建,因此会出现两个完全独立的VPC,和你预期的共享VPC需求完全不符。
不需要使用Terraform Workspaces即可实现需求
共享VPC的需求不需要依赖Workspaces实现,你可以通过terraform_remote_state数据源读取已部署的shared资源状态即可,操作步骤如下:
- 首先确保
shared/outputs.tf中已经声明了你需要对外暴露的输出参数,示例配置:
# shared/outputs.tf output "vpc_id" { value = module.vpc.id } # 可根据需要补充输出vpc_cidr、可用区列表等其他参数
- 在
shared目录执行terraform apply完成VPC的首次部署。 - 修改
dev/main.tf、test/main.tf等环境的配置,删除直接引入shared模块的代码,改用数据源读取shared的状态:
# dev/main.tf data "terraform_remote_state" "shared" { # 如果你使用S3等远端后端存储状态,替换为对应的后端配置即可 backend = "local" config = { path = "../shared/terraform.tfstate" } } resource "aws_subnet" "dev-subnet-pub" { vpc_id = data.terraform_remote_state.shared.outputs.vpc_id cidr_block = "10.0.1.0/28" tags = { Name = "dev-subnet-pub" Terraform = "true" Environment = "dev" } }
配置完成后在dev目录执行apply时,Terraform只会创建子网资源,直接复用已部署的共享VPC。
补充建议
生产环境建议将shared目录的状态存储到S3等共享远端后端,并配置状态锁,本地状态仅适合本地测试使用,无法支持团队协作。
内容的提问来源于stack exchange,提问作者d8aninja
相关产品推荐
相关产品推荐

