amazon-web-services - Terraform:以编程方式为多个 VPC 对等连接生成多个路由表

标签 amazon-web-services devops terraform

使用 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 }
}

效果很好。对于每个环境,我都有不同的 azsprivate_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/

相关文章:

terraform - 如何在地形中引用 map 变量? <蔚蓝>

amazon-web-services - AWS 客户端 VPN 客户端-客户端通信

amazon-web-services - AWS 自动缩放策略终止繁忙实例而不是空闲实例

linux - Ubuntu 中的 Terraform 路径问题

用于环境版本控制的 Docker 镜像存储库名称或标签

amazon-web-services - 使用 Terraform 部署 CloudFormation 模板

amazon-web-services - 由于变量太长,AWS CLI S3 COPY 命令获取 FINDSTR 错误?

amazon-web-services - AWS Lambda 无服务器部署要求提供 AWS 提供商凭证

.net - 如何在负载下多路复用我的 asp.net web 应用程序?

Terraform 资源继承