从地图中获取不同值的列表

Get a list of distinct values from map

我想为 terraform.For 中的每个不同的可用性区域创建一个 NAT 网关,要实现这一点,我需要获取不同可用性区域的列表。

variable "public_subnets" {
 type = map(object({
   cidr = string
   az   = string
 }))
 description = "Public subnets for My VPC"
}

子网

public_subnets = {
 "a" = {
   cidr = "10.0.0.0/24"
   az   = "us-east-2a"
 },
 "b" = {
   cidr = "10.0.1.0/24"
   az   = "us-east-2b"
 }
}

资源定义如下:

   resource "aws_subnet" "public-subnets" {
     for_each          = var.public_subnets
     vpc_id            = aws_vpc.main_vpc.id
     cidr_block        = each.value.cidr
     availability_zone = each.value.az
     map_public_ip_on_launch = true
     
     tags = {
       Name = "public-subnet-${each.value.cidr}-${each.value.az}"
     }
    }


resource "aws_eip" "ip-nats" {
  for_each = aws_subnet.public-subnets
  # EIP may require IGW to exist prior to association. 
  depends_on = [aws_internet_gateway.igw]
}

在创建每个 aws_nat_gateway 时,我需要声明 allocation_idsubnet_id。在典型的编程语言中,我会执行以下操作:

  1. 为每个 public 子网创建弹性 ip,并创建一个地图/字典,其中 public 子网为键,弹性 ip 为值
  2. 循环查找该字典并创建 NAT 网关。

我如何使用 terraform 实现此目的

aws_nat_gateway 有效地表现为特定弹性 IP“分配 ID”和特定子网 ID 的配对,因此我假设您的目标是为每个对应的实例对创建一个这样的配对您的 aws_subnet.public-subnetsaws_eip.ip-nats 资源。

由于这些 NAT 网关将与 var.public_subnets 中的每个条目一对一,您可以再次使用 for_each 与该地图,然后告诉 Terraform 如何收集数据来自其他资源的相关实例:

resource "aws_nat_gateway" "example" {
  for_each = var.public_subnets

  allocation_id = aws_eip.ip-nats[each.key]
  subnet_id     = aws_subnet.public-subnets[each.key]
  # ...
}

使用其他资源之一的 for_each chaining 也可能有效,就像您从 aws_subnet.public-subnets 链接 aws_eip.ip-nats 一样,但我选择在这里只使用原始集合因为我们一次只能从一个其他资源链接起来,而且这里的资源似乎都比另一个资源与 NAT 网关的“连接更紧密”:每个 NAT 网关均等地从每个 NAT 网关的一个实例下降。