使用 for each 将多个 public 子网分配给路由 table

Assigning multiple public subnet to route table using for each

我创建了多个子网,每个子网都试图与路由关联 table。以下是我的代码、错误以及我尝试过的内容。

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".

我相信这应该有效。关于此错误的任何建议以及让这些 public 子网附加到路由 table 都会有所帮助。

更新 我做了一些更改并删除了局部变量 '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`

它说子网不存在,即使我在控制台中看到它。将这些 public 子网与路由 table.

相关联的任何建议将不胜感激

subnet_id in 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
}