amazon-web-services - 将多个私有(private)子网附加到每个 terraform 的路由表

标签 amazon-web-services routes terraform terraform-provider-aws private-subnet

我在为每个子网创建的 VPC 中建立了公共(public)子网和私有(private)子网。我现在正在尝试为子网和 nat 网关创建路由表,专门用于私有(private)实例的访问。我的子网、路由表和公有子网关联工作正常。我无法将我的私有(private)子网附加到将其连接到 NAT 网关的路由表。我相信我的逻辑是正确的。我的 NAT 网关位于我的公共(public)子网中。唯一的问题是私有(private)子网附加到连接 NAT 网关的路由表。以下是我的代码,如有任何建议,我们将不胜感激。

resource "aws_route_table" "public" {
  for_each = var.pub_subnet
  vpc_id   = aws_vpc.main.id

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

  tags = {
    Name = var.rt_tags
  }
}

resource "aws_route_table_association" "public" {
  for_each       = aws_subnet.public
  route_table_id = aws_route_table.public[each.key].id
  subnet_id      = each.value.id
}

resource "aws_route_table_association" "nat" {
  for_each       = aws_subnet.private
  route_table_id = aws_route_table.nat[each.key].id
  subnet_id      = each.value.id
}

resource "aws_route_table" "nat" {
  for_each = var.pub_subnet
  vpc_id   = aws_vpc.main.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_nat_gateway.main[each.key].id
  }

  tags = {
    Name = var.rt_tags_private
  }
}

resource "aws_subnet" "public" {
  for_each                = var.pub_subnet
  vpc_id                  = aws_vpc.main.id
  cidr_block              = each.value.cidr_block
  availability_zone       = each.value.availability_zone
  map_public_ip_on_launch = true
  tags = {
    Name = each.key
  }
}

resource "aws_subnet" "private" {
  for_each                = var.priv_subnet
  vpc_id                  = aws_vpc.main.id
  cidr_block              = each.value.cidr_block
  availability_zone       = each.value.availability_zone
  map_public_ip_on_launch = false
  tags = {
    Name = each.key
  }
}

变量

variable "pub_subnet" {
  type = map(object({
    cidr_block        = string
    availability_zone = string
  }))
  default = {
    "PubSub1" = {
      cidr_block        = "10.0.1.0/24"
      availability_zone = "us-west-1a"
    }
  }
}

variable "priv_subnet" {
  type = map(object({
    cidr_block        = string
    availability_zone = string
  }))
  default = {
    "PrivSub1" = {
      cidr_block        = "10.0.2.0/24"
      availability_zone = "us-west-1c"
    }
  }
}

错误

Error: Invalid index

  on vpc.tf line 61, in resource "aws_route_table_association" "nat":
  61:   route_table_id = aws_route_table.nat[each.key].id
    |----------------
    | aws_route_table.nat is object with 1 attribute "PubSub1"
    | each.key is "PrivSub1"

The given key does not identify an element in this collection value.

NAT 网关

resource "aws_nat_gateway" "main" {
  for_each      = aws_subnet.public
  subnet_id     = each.value.id
  allocation_id = aws_eip.main[each.key].id
}

EIP

resource "aws_eip" "main" {
  for_each = aws_subnet.public
  vpc      = true

  lifecycle {
    create_before_destroy = true
  }
}

最佳答案

您正在使用 var.pub_subnet 定义 nat 路由表,其形式为:

  "PubSub1" = {
      cidr_block        = "10.0.1.0/24"
      availability_zone = "us-west-1a"
    }

因此,要引用 aws_route_table,您必须使用 PubSub1 键。

但是,在您的 aws_route_table_association 中,您正在迭代具有 PrivSub1 key 的 aws_subnet.private

更新

可以通过为私有(private)=>公共(public)子网名称创建本地映射来解决此问题,例如:

locals {
   private_public_mapping = zipmap(keys(var.priv_subnet), keys(var.pub_subnet))
}

resource "aws_route_table_association" "nat" {
  for_each       = aws_subnet.private
  route_table_id = aws_route_table.nat[local.private_public_mapping[each.key]].id
  subnet_id      = each.value.id
}

关于amazon-web-services - 将多个私有(private)子网附加到每个 terraform 的路由表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63385511/

相关文章:

javascript - 快速路线不再加载

javascript - AngularJS 1 延迟路由直到模型加载

azure - 如何使用 Terraform 在管理组范围上定义和分配 Azure 策略?

amazon-web-services - Cloudwatch boto3 put_log_events 返回错误

amazon-web-services - 如何 Fn::Split 追加现有数组?

c# - 为什么 MapHttpAttributeRoutes() 不从属性添加路由?

amazon-web-services - Terraform RDS 数据库凭据

aws-lambda - 使用相同代码更新 Terraform lambda source_code_hash

amazon-web-services - 使用ecs-cli时无法承担服务链接角色

amazon-web-services - 将 cloudfront 通配符 CNAME 子域路由到 s3 存储桶中的文件夹