AWS with Terraform - 过滤公共/私有子网(不依赖标签)

Rtm*_*tmY 6 amazon-web-services terraform

要求:

我想旋转 AWS ALB - 为此,我需要在两个不同的可用区中至少有两个子网。

(Terraform 显示了一个非常明确的错误,以防我们忘记 - 请参阅下面的错误 #1)。

我想检查相关 VPC 中当前拥有的公有子网数量,并确保其至少为 2。

我的尝试:

为此我将计算:

number_of_public_subnets_to_create  = "${2 - length(data.aws_subnet_ids.customer_a_public_subnets.ids)}"
Run Code Online (Sandbox Code Playgroud)

对于上面的计算 - Terraform 有 2 种数据源类型: aws_subnetaws_subnet_ids

如果子网被标记 - 我们可以使用aws_subnet_ids数据源并添加一个简单的过滤器,如下所示:

data "aws_subnet_ids" "customer_a_public_subnets" {
  vpc_id = "${data.aws_vpc.my-customer_a-vpc.id}"
  tags {
      Tier = "Public"
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

但是如果子网不包含“公共/私有”标签怎么办?

有没有简单的解决方案(也许是aws_subnet数据源上的通用过滤器)?


错误#1:

创建应用程序负载均衡器时出错:ValidationError:必须指定两个不同可用区中的至少两个子网。

小智 1

是的,我知道您可能花了很多时间根据公共/私有过滤子网。根据文档,有一个过滤器 -map-public-ip-on-launch检查启动时是否分配了公共 IPv4。

所以我们可以得到公共/私有子网,如下所示。

data "aws_subnets" "private" {
  filter {
    name = "vpc-id"
    values = [
      data.aws_vpc.shared.id
    ]
  }

  filter {
    name = "map-public-ip-on-launch"
    values = [false]
  }
}

data "aws_subnets" "public" {
  filter {
    name = "vpc-id"
    values = [
      data.aws_vpc.shared.id
    ]
  }

  filter {
    name = "map-public-ip-on-launch"
    values = [true]
  }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用privatepublic来检索子网 ID。