我有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元素的is,那么最好的引用方法是什么呢?
我看到可用的选项是使用terraform import吗?
发布于 2018-01-24 10:20:40
这取决于您需要在团队之间共享的范围有多广。
在问题的示例中,您实际上不需要共享任何东西,而是可以让dev团队使用数据源来查找他们应该部署到的子网ids。
例如,您的平台团队将创建如下子网:
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"
}
}然后,开发团队只需将其部署到私有子网中,以便在运行时使用 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时,我只需要提供数据库子网组,因为它并不是真正需要粒度控制的东西,而且最终每个人都应该将数据库放在您使用的所有AZs的私有子网中(这也应该是该地区所有可用的子网)。
至于您的最后一个问题,terraform import是将资源导入状态文件,以便Terraform之外创建的东西将来可以由Terraform管理。您将需要一个唯一的资源ID才能使其变得重要,因此不会解决您的问题,这意味着开发团队将控制子网资源的管理,这可能不是您想要的。
https://stackoverflow.com/questions/48417550
复制相似问题