为每个路由表分配多个公共子网

时间:2020-08-08 15:56:48

标签: amazon-web-services routes terraform public

我为每个要与路由表关联的子网创建了多个子网。下面是我的代码,错误以及我尝试过的代码。

locals {
  az_names    = data.aws_availability_zones.azs.names
  pub_sub_ids = aws_subnet.public.*.id
}

resource "aws_route_table_association" "main" {
  for_each       = var.public_sub_cidr
  subnet_id      = local.pub_sub_ids[each.key]
  route_table_id = aws_route_table.main.id
}

resource "aws_subnet" "public" {
  for_each                = { for index, az_name in local.az_names : index => az_name }
  vpc_id                  = aws_vpc.main.id
  cidr_block              = cidrsubnet(var.vpc_cidr, 8, each.key + 1)
  availability_zone       = local.az_names[each.key]
  map_public_ip_on_launch = true
  tags = {
    Name = "${var.vpc_tags}-PubSubnet"
  }
}

Error: Unsupported attribute

  on vpc.tf line 3, in locals:
   3:   pub_sub_ids = aws_subnet.public.*.id

This object does not have an attribute named "id".

我认为这应该有效。关于此错误的任何建议以及将这些公共子网附加到路由表中都是有帮助的。

更新 我进行了一些更改,并删除了本地变量“ pub_sub_ids”,还将“ aws_route_table_association”“ main”更改为

resource "aws_route_table_association" "main" {
  for_each       = var.public_sub_cidr
  subnet_id      = each.key
  route_table_id = aws_route_table.main.id
}

现在我遇到了错误

Error: Error creating route table association: InvalidSubnetID.NotFound: The `subnet ID '' does not exist`

它说即使我在控制台中看到该子网也不存在。将这些公共子网与路由表相关联,我们将提供任何建议。

1 个答案:

答案 0 :(得分:0)

subnet_id中的

aws_route_table_association应该是子网ID,而不是子网CIDR。

由于未提供aws_route_table,因此我进行了验证设置。因此,您可以执行以下操作:

resource "aws_route_table_association" "main" {
   count          =  length(aws_subnet.public)
   subnet_id      = aws_subnet.public[count.index].id
   route_table_id = aws_route_table.main.id
}

以下是我用于验证的完整代码:

provider "aws" {
 # your data
}

data "aws_availability_zones" "azs" {
  state = "available"
}

locals {
  az_names = data.aws_availability_zones.azs.names
}

variable "vpc_cidr" {
  default = "10.0.0.0/16"
}

resource "aws_vpc" "main" {
  cidr_block = var.vpc_cidr
}

resource "aws_subnet" "public" {
  for_each                = {for index, az_name in local.az_names: index => az_name}
  vpc_id                  = aws_vpc.main.id
  cidr_block              = cidrsubnet(var.vpc_cidr, 8, each.key + 1)
  availability_zone       = local.az_names[each.key]
  map_public_ip_on_launch = true
}

resource "aws_internet_gateway" "gw" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "main"
  }
}

resource "aws_route_table" "main" {

 vpc_id = aws_vpc.main.id
  
 route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.gw.id
  }    
}

resource "aws_route_table_association" "main" {
   count          =  length(aws_subnet.public)
   subnet_id      = aws_subnet.public[count.index].id
   route_table_id = aws_route_table.main.id
}