【问题标题】:assign multiple subnets to route table aws将多个子网分配给路由表 aws
【发布时间】:2020-09-21 06:47:03
【问题描述】:

我想很多人都问过同一个问题,但我的情况不同。我正在从用户那里获取 vpc 区域的输入,甚至是公共子网段的 cidr 值。我必须将所有公共子网附加到默认路由表,将私有子网附加到差异路由表。你能帮我看看如何附加它们吗?

provider "aws" {
    region = var.region
}

resource "aws_vpc" "app_vpc" {
  cidr_block           = var.vpc_cidr
  enable_dns_support   = true
  enable_dns_hostnames = true
  tags = {
    Name = var.vpc_name
  }
}

# create igw
resource "aws_internet_gateway" "app_igw" {
  vpc_id = aws_vpc.app_vpc.id
}

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

#provision public subnet
resource "aws_subnet" "public_subnet_01" {
  vpc_id     = aws_vpc.app_vpc.id
  cidr_block = var.public_subnet_01
  availability_zone = data.aws_availability_zones.available.names[0]
  tags = {
    Name = "public_subnet_01"
  }
  depends_on = [aws_vpc_dhcp_options_association.dns_resolver]
}
resource "aws_subnet" "public_subnet_02" {
  vpc_id     = aws_vpc.app_vpc.id
  cidr_block = var.public_subnet_02
  availability_zone = data.aws_availability_zones.available.names[1]
  tags = {
    Name = "public_subnet_02"
  }
  depends_on = [aws_vpc_dhcp_options_association.dns_resolver]
}
resource "aws_subnet" "public_subnet_03" {
  vpc_id     = aws_vpc.app_vpc.id
  cidr_block = var.public_subnet_03
  availability_zone = data.aws_availability_zones.available.names[2]
  tags = {
    Name = "public_subnet_03"
  }
  depends_on = [aws_vpc_dhcp_options_association.dns_resolver]
}

#default route table 
resource "aws_default_route_table" "default" {
  default_route_table_id = aws_vpc.app_vpc.default_route_table_id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.app_igw.id
  }
}

resource "aws_route_table_association" "default_association_01" {
  subnet_id      = [aws_subnet.public_subnet_01.id, aws_subnet.public_subnet_02.id, aws_subnet.public_subnet_03.id]
  route_table_id = aws_vpc.app_vpc.default_route_table_id
}

我在添加多个子网时遇到错误,请您在这里帮忙:)

【问题讨论】:

  • 我看不到非公共路由表在该模板中的定义位置。

标签: amazon-web-services terraform


【解决方案1】:

aws_route_table_association 仅将一个子网作为输入,而不是子网列表。

如果您想使用您的列表创建关联,您可以使用for_each

resource "aws_route_table_association" "default_association_01" {

  for_each = toset([aws_subnet.public_subnet_01.id, aws_subnet.public_subnet_02.id, aws_subnet.public_subnet_03.id])  

  subnet_id      = each.key
  route_table_id = aws_vpc.app_vpc.default_route_table_id
}

以上假设其他一切都是正确的。您的代码中可能仍存在一些尚不明显的错误。

【讨论】:

  • 感谢您的回复,我收到以下错误:“for_each”值取决于在应用之前无法确定的资源属性,因此 Terraform 无法预测将创建多少个实例。要解决此问题,请使用 -target 参数首先仅应用 for_each 所依赖的资源。
  • 感谢您的所有帮助,但如果我以不同的方式声明死记硬背的表关联,但在 for_each 中它给出目标错误时,我的代码可以正常工作:(
  • @AnkitSingh 如果你在一个资源中使用for_each,其他资源通常也会受到影响,因为你现在和以前引用aws_route_table_association的方式不同。所以也许这就是你看到新错误的原因?
猜你喜欢
  • 2021-02-25
  • 1970-01-01
  • 2017-10-02
  • 2022-10-31
  • 2020-11-15
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多