Terraform – Remote State Data Source 其他project对接远程state数据源

为什么需要使用 remote state data source?

  1. 跨模块/项目数据共享
    在复杂的基础设施架构中,不同的 Terraform 配置或模块可能会负责创建不同的资源。例如,一个配置可能负责创建网络(如 VPC),而另一个配置需要使用该网络的 ID 来创建子网或其他资源。通过 terraform_remote_state,你可以直接引用存储在远程状态文件中的输出数据,而不必手动传递或硬编码这些信息。
  2. 降低模块耦合性
    使用 remote state data source 可以将资源的生产与消费分离,使得各个模块独立管理自己的状态和生命周期。这样,当某个模块更新时,其他模块只需要依赖其输出,不需要对内部实现有过多了解,从而提高了代码的模块化和复用性。
  3. 集中管理和协同作业
    远程状态存储(如 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

  1. 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
}

Loading

Facebook评论