【问题标题】:Get a list of distinct values from map从地图中获取不同值的列表
【发布时间】:2021-12-16 21:49:13
【问题描述】:

我想为 terraform 中的每个不同可用区创建一个 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. 为每个公有子网创建弹性 ip,并创建一个以公有子网为键、弹性 ip 为值的映射/字典
  2. 循环查找该字典并创建 NAT 网关。

我如何使用 terraform 实现这一目标

【问题讨论】:

  • 你还没有展示你是如何定义aws_subnet.public-subnets的。还有你的地图中有哪些“不同的价值”? CIDR?
  • @Marcin 我添加了 aws_subnet.public-subnets 。 “不同的值”是指唯一的可用区(AZ)。最终我想为每个 AZ 创建一个 nat 网关并将子网分配给 nat 网关

标签: loops for-loop foreach terraform


【解决方案1】:

aws_nat_gateway 实际上表现为特定弹性 IP“分配 ID”和特定子网 ID 的配对,因此我假设您的目标是为您的 @987654323 的每一对对应实例创建一个这样的配对@ 和 aws_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 网关均来自它们各自的一个实例。

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 2013-02-11
    • 2017-06-20
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多