根据Terraform中可用区域的足够容量筛选出子网ID



我正在尝试部署EKS集群,除了一个之外,一切似乎都很好!

facade模块如下所示:

module "eks" {
source = "../../../../infrastructure_modules/eks"
## EKS ##
create_eks      = var.create_eks
cluster_version = var.cluster_version
cluster_name    = local.cluster_name
vpc_id          = data.aws_vpc.this.id
subnets         = data.aws_subnet_ids.this.ids
# note: either pass worker_groups or node_groups
# this is for (EKSCTL API) unmanaged node group
worker_groups = var.worker_groups
# this is for (EKS API) managed node group
node_groups = var.node_groups
## Common tag metadata ##
env      = var.env
app_name = var.app_name
tags     = local.eks_tags
region   = var.region
}

VPC id通过以下块检索:

data "aws_vpc" "this" {
tags = {
Name = "tagName"
}
}

然后用于检索子网ID,如下所示:

data "aws_subnet_ids" "this" {
vpc_id = data.aws_vpc.this.id
}

尽管如此,部署它会导致错误声明:

错误:创建EKS群集(数据层EKS(时出错:不支持可用性区域异常:无法创建群集"数据层eks",因为us-east-1e,目标可用性区域,当前没有足够的容量来支持群集。

这是一个众所周知的错误,任何人都可能在EC2中遇到这个错误。

我可以通过简单地硬编码子网值来解决这个问题,但这确实是不可取的,而且很难维护。

因此,问题是,如何根据具有足够容量的可用性区域筛选出子网ID

首先,您需要收集具有所有属性的子网:

data "aws_subnets" "this" {
filter {
name   = "vpc-id"
values = [data.aws_vpc.this.id]
}
}
data "aws_subnet" "this" {
for_each = toset(data.aws_subnets.this.ids)
id       = each.value
}

data.aws_subnet.this现在是具有所有子网及其属性的map(object)。您现在可以相应地按可用区域进行筛选:

subnets = [for subnet in data.aws_subnet.this : subnet.id if subnet.availability_zone != "us-east-1e"]

如果条件对你来说更容易,你也可以通过truthy条件进行过滤:

subnets = [for subnet in data.aws_subnet.this : subnet.id if contains(["us-east-1a", "us-east-1b", "us-east-1c", "us-east-1d"], subnet.availability_zone)]

这取决于您的个人用例。

最新更新