Terraform – Remote State Data Source 其他project对接远程state数据源
为什么需要使用 remote state data source?
- 跨模块/项目数据共享
在复杂的基础设施架构中,不同的 Terraform 配置或模块可能会负责创建不同的资源。例如,一个配置可能负责创建网络(如 VPC),而另一个配置需要使用该网络的 ID 来创建子网或其他资源。通过terraform_remote_state
,你可以直接引用存储在远程状态文件中的输出数据,而不必手动传递或硬编码这些信息。 - 降低模块耦合性
使用 remote state data source 可以将资源的生产与消费分离,使得各个模块独立管理自己的状态和生命周期。这样,当某个模块更新时,其他模块只需要依赖其输出,不需要对内部实现有过多了解,从而提高了代码的模块化和复用性。 - 集中管理和协同作业
远程状态存储(如 S3、Consul、Terraform Cloud 等)允许多个团队协同作业,确保所有人都使用一致且最新的状态信息,避免了本地状态文件分散带来的同步问题,并提升了安全性和可审计性。
不同的数据源有不同的配置所以可以查看官方文档。
Remote state data source 官方文档: https://developer.hashicorp.com/terraform/language/state/remote-state-data
使用案例
通常在一间公司当中会有不同的部门管理者自己负责的资源。由于tfstate是中央存储在S3当中。以下的使用案例是Networking Team负责创建和管理eip,然后Security Team就从remote state调用Networking Team所创建的eip

- Networking Team创建eip , 和output输出eip public ip, 那么Security Team就能获取这个变数
terraform {
# 定义Terraform版本要求
required_version = ">= 1.0.0"
# 配置远程状态存储后端为S3
backend "s3" {
bucket = "yourbucket" # S3桶名称
key = "tf/prod/terraform.tfstate" # 状态文件在S3中的存储路径
region = "ap-southeast-1" # S3桶所在区域
use_lockfile = true # 启用锁文件以防止状态文件并发修改
}
# 声明所需的provider及其版本
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
resource "aws_eip" "tempEip" {
domain = "vpc"
}
output "eip_addr" {
value = aws_eip.tempEip.public_ip
}

2. Security Team创建Security Group并且白名单,自定的eip能够访问port 80

data "terraform_remote_state" "network" {
backend = "s3"
config = {
bucket = "yourbucket" # S3桶名称
key = "tf/prod/terraform.tfstate" # 状态文件在S3中的存储路径
region = "ap-southeast-1" # S3桶所在区域
}
}
resource "aws_security_group" "allow_tls" {
vpc_id = "vpc-015676d7776ac7382"
name = "allow_tls"
description = "Allow TLS inbound traffic"
}
resource "aws_vpc_security_group_ingress_rule" "example" {
security_group_id = aws_security_group.allow_tls.id
cidr_ipv4 = "${data.terraform_remote_state.network.outputs.eip_addr}/32"
from_port = 80
ip_protocol = "tcp"
to_port = 80
}

Facebook评论