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

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

要求:

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

(如果我们忘记了,Terraform 会显示非常明显的错误 - 请参阅下面的错误 #1)。

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

我的尝试:

为此我将计算:

number_of_public_subnets_to_create  = "${2 - length(data.aws_subnet_ids.customer_a_public_subnets.ids)}"

对于上述计算 - Terraform 有 2 种数据源类型: aws_子网aws_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"
  }
}

我的问题:

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

有没有简单的解决方案(可能是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]
  }
}

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

答案2

使用过滤器的另一个答案"map-public-ip-on-launch"对我来说不起作用,但幸运的是,我的子网名称(由模块创建"terraform-aws-modules/vpc/aws")包含该名称publicprivate因此我可以按名称进行过滤。

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

  filter {
    name   = "tag:Name"
    values = ["*private*"]
  }
}

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

  filter {
    name   = "tag:Name"
    values = ["*public*"]
  }
}

相关内容