如何以惯用方式管理terraform项目之间的引用?

时间:2018-01-24 08:07:25

标签: amazon-web-services terraform

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

一个属于平台团队,它管理AWS的VPC区域(VPC /子网/安全组)。

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

示例

平台团队项目资源

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

1 个答案:

答案 0 :(得分:2)

这取决于您需要在各个团队之间分享内容的广泛程度。

在问题的示例中,您实际上并不需要共享任何内容,而是可以让开发团队使用数据源来查找他们应该将内容部署到的子网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(也应该是该地区所有可用的AZ)。

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