要求:
我想要旋转 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]
}
}
然后您可以使用private
和public
来检索子网 ID。
答案2
使用过滤器的另一个答案"map-public-ip-on-launch"
对我来说不起作用,但幸运的是,我的子网名称(由模块创建"terraform-aws-modules/vpc/aws"
)包含该名称public
,private
因此我可以按名称进行过滤。
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*"]
}
}