Terraform 使用aws_route_表中的每个for_创建到不同可用性区域中的子网的路由

Terraform 使用aws_route_表中的每个for_创建到不同可用性区域中的子网的路由,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我正试图用terraform尽可能地实现自动化。我使用2个VPC(1个应用程序,1个管理)。在第一个VPC(应用程序)中,我使用count来确定给定区域中可用区(AZ)的数量,并为每个AZ创建子网。那部分有效。在第二个VPC(管理)中,我有一个子网需要与VPC1中的这三个子网通话。基本上,我希望自动创建aws_route_表,以实现以下功能: VPC2.subnet1 ------> VPC1.subnet1 |--> VPC1.subnet2

我正试图用terraform尽可能地实现自动化。我使用2个VPC(1个应用程序,1个管理)。在第一个VPC(应用程序)中,我使用count来确定给定区域中可用区(AZ)的数量,并为每个AZ创建子网。那部分有效。在第二个VPC(管理)中,我有一个子网需要与VPC1中的这三个子网通话。基本上,我希望自动创建aws_route_表,以实现以下功能:

VPC2.subnet1 ------> VPC1.subnet1
                |--> VPC1.subnet2
                 --> VPC1.subnet3
但在我的代码中,我最终拥有3个独立的aws_route_表资源:

VPC2.subnet1 ------> VPC1.subnet1
VPC2.subnet1 ------> VPC1.subnet2
VPC2.subnet1 ------> VPC1.subnet3
这是我的错误代码: 获取该地区的所有AZ:

data "aws_availability_zones" "azs" {}
使用计数在每个AZ中自动创建子网:

resource "aws_subnet" "app_public_subnet" {
  count = length(data.aws_availability_zones.azs.names)

  vpc_id = aws_vpc.app_vpc.id
  availability_zone = element(data.aws_availability_zones.azs.names, count.index)
  cidr_block = cidrsubnet(var.app_vpc_cidr_block, 8, count.index + 1)

  tags = {
    Name = "${var.project}_app_public_subnet_${count.index + 1}"
  }
}
尝试使用for_创建aws_route_表资源,但下面的代码创建了3个单独的aws_route_表实例,而不是1个包含3条路由的实例。我刚接触地球,我还在学习

resource "aws_route_table" "mgmt_rt" {
  vpc_id = aws_vpc.mgmt_vpc.id

   for_each = toset(aws_subnet.app_public_subnet[*].cidr_block)
   route {                                                         # Route via VPC peering connection
     cidr_block = each.value
     gateway_id = aws_vpc_peering_connection.mgmt_peer.id
   }

  route {
    cidr_block = var.all_cidr
    gateway_id = aws_internet_gateway.mgmt_igw.id
  }

  tags = {
    Name = "${var.project}_mgmt_rt"
  }
}


您应该将每个的
移动到for
路线
。例如:

resource "aws_route_table" "mgmt_rt" {

  vpc_id = aws_vpc.mgmt_vpc.id
 
   dynamic "route" {

     for_each = toset(aws_subnet.app_public_subnet[*].cidr_block)

      content {
       # Route via VPC peering connection
         cidr_block = route.value
         gateway_id = aws_vpc_peering_connection.mgmt_peer.id      
      }
   }

  route {
    cidr_block = var.all_cidr
    gateway_id = aws_internet_gateway.mgmt_igw.id
  }

  tags = {
    Name = "${var.project}_mgmt_rt"
  }
}


您需要使用。这是否回答了您的问题?虽然不是完全相同,但它演示了
动态
块的用法。感谢您为我指出了一些新的东西-动态块。尝试一下,但仍然有问题-可能我引用了错误的“对象”或其他东西。仍然需要解决此问题。我收到以下错误:“对“each.value”的引用已在其不可用的上下文中使用,例如当配置不再在其“for_each”表达式中包含该值时。请删除对配置中each.value的此引用以解决此错误。”@nyxx88我的答案中没有each.value。你完全正确!我没有复制您的代码(以便学习),而是修改了自己的代码&我在代码中使用了each.value。现在我发现了我的错误&它起作用了!我相信我会记住这一课——错误通常是最好的老师。再次感谢您!