如何惯用地管理 Terraform 项目之间的引用?

How to idiomatically manage references between terraform projects?

我有 2 个 Terraform 项目可能由不同的团队管理。

一个属于 平台团队 ,它管理 AWS 的 VPC 区域(VPC/Subnet/Security 组)。

另一个属于开发团队,他们管理项目的实例。

例子

平台团队项目资源

resource "aws_subnet" "my_subnet" {
    vpc_id = "${aws_vpc.my_vpc.id}"
    cidr_block = "${var.my_subnet_id}"

    tags {
    Name = "My Subnet"
    }
}

开发团队项目参考

resource "aws_db_subnet_group" "dev_subnet" {
    name = "Developer Subnet Group"
    subnet_ids = ["subnet-a32322d8", "subnet-a43564e9"] # I really want to reference ${aws_subnet.my_subnet.id} but this terraform project is not available to the developer
}

subnet_ids只是那个时间点的值。如果我愿意,我可以将它们移动到变量中,但这似乎并不能真正解决问题,因为任何依赖的 ID 都可以随时更改?

问题

那么如何正确处理项目之间的引用呢?开发团队需要来自各种 VPC 元素的 ID,那么引用它的最佳方式是什么?

我看到可用的选项是使用 terraform import ?

这取决于您需要在多大范围内跨团队共享内容。

在问题的示例中,您实际上不需要共享任何内容,而是可以让开发团队使用数据源来查找他们应该将内容部署到的子网 ID。

例如,您的平台团队会像这样创建子网:

resource "aws_subnet" "private_a" {
  vpc_id     = "${aws_vpc.my_vpc.id}"
  cidr_block = "${cidrsubnet(aws_vpc.my_vpc.cidr_block, 2, 1)}"
  availability_zone = "eu-west-1a"

  tags {
    Name = "${var.vpc_name}-private-a"
    Tier = "private"
    AZ   = "a"
  }
}

然后您的开发团队只想部署到私有子网中,因此他们使用 aws_subnet_ids data source 在运行时找到它们:

data "aws_subnet_ids" "private" {
  vpc_id = "${var.vpc_id}"
  tags {
    Tier = "private"
  }
}

resource "aws_db_subnet_group" "dev_subnet" {
  name       = "Developer Database Subnet Group"
  subnet_ids = ["${data.aws_subnet_ids.private.ids}"]
}

在这种实际情况下,我会在您创建 VPC 时提供数据库子网组,因为这并不是您真正需要精细控制的东西,最终每个人都应该将数据库放在跨越您所有 AZ 的私有子网中使用(也应该是该地区所有可用的)。

关于您的最后一个问题,terraform import 是为了将资源导入状态文件,以便将来在 Terraform 之外创建的内容可以由 Terraform 管理。您将需要一个唯一的资源 ID 才能将其导入,因此不能解决您的问题,这意味着开发团队可以控制管理子网资源,这可能不是您想要的。