【问题标题】:How to exclude AWS subnet ids based on name in Terraform如何根据 Terraform 中的名称排除 AWS 子网 ID
【发布时间】:2022-01-17 07:20:38
【问题描述】:

我从开发帐户中检索子网 ID,然后将 NLB 附加到它们。每个 AZ 有两个子网。因此,我收到“创建网络负载均衡器时出错:InvalidConfigurationRequest:负载均衡器无法连接到同一可用区中的多个子网”。我需要过滤子网名称以排除名称中的某些字符(“-lb-”),并且只使用没有“-lb-”的字符。我知道 Terraform 可以使用 for_each 参数和 toset() 函数,但它是否有类似于 LINQ 的 containswhere 子句?

data "aws_subnet_ids" "dev_subnets" {
  vpc_id = data.aws_vpc.dev_account_vpc.id
}

resource "aws_lb" "dev_network_load_balancer" {
  name               = "my-nlb"
  internal           = true
  load_balancer_type = "network"

  subnets            = data.aws_subnet_ids.dev_subnets.ids
  ...
}

【问题讨论】:

    标签: amazon-web-services terraform


    【解决方案1】:

    假设dev_subnets 提供了一个子网ID 列表,其中一些可能包含-lb- 子字符串,而另一些可能不包含。例如:

    # Returns ["subnet-1", "subnet-lb-1", "subnet-2", "subnet-lb-2"]
    data "aws_subnet_ids" "dev_subnets" {
      vpc_id = data.aws_vpc.dev_account_vpc.id
    }
    

    为了过滤此列表,我们可以执行以下操作:

    resource "aws_lb" "dev_network_load_balancer" {
      name               = "my-nlb"
      internal           = true
      load_balancer_type = "network"
    
      # ["subnet-1", "subnet-2"]
      subnets            = [for s in data.aws_subnet_ids.dev_subnets.ids : s if replace(s, "-lb-", "") == s]
      ...
    }
    

    截至目前,Terraform 中没有高级过滤器功能。 replace(s, "-lb-", "") 将尝试将 -lb- 替换为与原始字符串进行比较的空字符串。如果相等,说明原字符串不包含-lb-子字符串。

    更新:

    如果你想过滤包含-lb-子字符串的字符串:

    [for s in data.aws_subnet_ids.dev_subnets.ids : s if replace(s, "-lb-", "") != s]
    

    【讨论】:

    • 这是一个很好的例子。但是,我的目标是过滤包含 -lb- 字符的子网名称。我希望 data.aws_subnet_ids.dev_subnets 可以在 id 旁边给我名字,但事实并非如此。看来我只能通过添加filter {name = "tag:Name" values = ["your-subnet-name"] } 来获取名称。
    • 如果你想过滤包含-lb-的字符串:[for s in data.aws_subnet_ids.dev_subnets.ids : s if replace(s, "-lb-", "") != s]
    猜你喜欢
    • 2021-08-01
    • 2021-04-07
    • 2021-11-28
    • 2021-06-30
    • 2021-01-07
    • 2021-05-17
    • 2018-07-26
    • 2022-12-19
    • 1970-01-01
    相关资源
    最近更新 更多