使用 terraform-0.7.7。我或多或少地关注最佳实践存储库,即 AWS 部分:
https://github.com/hashicorp/best-practices/tree/master/terraform
我正在尝试提出一个用于构建 VPC 的通用模板。我们的想法是拥有一个包含多个子模块(vpc、private_subnet 等)的网络模块,只需将 terraform.tfvars 文件中的不同变量插入其中,即可构建不同的环境。 p>
假设在一个环境的 .tfvars 文件中,我有一个可用区域列表,以及另一个包含私有(private)子网 IP block 的列表:
azs = "us-west-2a,us-west-2b,us-west-2c"
private_subnets = "10.XXX.1.0/24,10.XXX.2.0/24,10.XXX.3.0/24"
network/private_subnets 模块将愉快地根据这些列表创建子网、路由表和关联:
resource "aws_subnet" "private" {
vpc_id = "${var.vpc_id}"
cidr_block = "${element(split(",", var.cidrs), count.index)}"
availability_zone = "${element(split(",", var.azs), count.index)}"
count = "${length(split(",", var.cidrs))}"
tags { Name = "${var.name}-${element(split(",", var.azs), count.index)}-private" }
lifecycle { create_before_destroy = true }
}
resource "aws_route_table" "private" {
vpc_id = "${var.vpc_id}"
count = "${length(split(",", var.cidrs))}"
route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = "${element(split(",", var.nat_gateway_ids), count.index)}"
}
tags { Name = "${var.name}-${element(split(",", var.azs), count.index)}-private" }
lifecycle { create_before_destroy = true }
}
resource "aws_route_table_association" "private" {
count = "${length(split(",", var.cidrs))}"
subnet_id = "${element(aws_subnet.private.*.id, count.index)}"
route_table_id = "${element(aws_route_table.private.*.id, count.index)}"
lifecycle { create_before_destroy = true }
}
效果很好。对于每个环境,我都有不同的 azs
和 private_subnets
列表,并且 VPC 已正确创建。 NAT 网关先于不同模块中创建。我每个可用区都有一个 NAT 网关、一个私有(private)子网和一个私有(private)路由表。
但现在我正在尝试以相同的方式创建 VPC 对等连接。
peer_vpc_ids = "vpc-XXXXXXXX, vpc-YYYYYYYY"
peer_vpc_blocks = "10.XXX.0.0/16, 10.YYY.0.0/16"
所以现在我需要编写 Terraform 代码,该代码会进入私有(private)路由表并为每个 VPC 对等连接添加路由。
问题是,我需要迭代两个变量:可用区列表和对等连接列表,而 Terraform 似乎不允许这样做。 AFAICT,您无法在 Terraform 中执行嵌套循环。
我错过了什么吗?有没有更好的方法来解决这个问题?
当然,我可以手动编写一些自定义的意大利面条式代码来构建 VPC,无论如何,但这里的目标是保持代码的可组合性和可维护性,并将逻辑与属性分开。
最佳答案
您可以通过对element
进行一些数学计算来实现这一点插值方法:
resource "aws_vpc_peering_connection" {
peer_vpc_ids = "${element(var.vpc_ids, count.index)}"
peer_vpc_blocks = "${element(var.vpc_blocks,floor(count.index / length(var.vpc_ids))}"
count = "${length(var.vpc_ids) * length(var.vpc_blocks)}"
}
特别是element(var.vpc_blocks,floor(count.index / length(var.vpc_ids))
调用将使 VPC block 为每个 var.vpc_ids
递增 1值。
关于amazon-web-services - Terraform:以编程方式为多个 VPC 对等连接生成多个路由表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40296146/