我正在尝试部署 EKS 集群,除了一个之外,一切似乎都很好!
外观模块看起来像这样:
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"
}
}
然后用于检索 subnet_IDs,如下所示:
data "aws_subnet_ids" "this" {
vpc_id = data.aws_vpc.this.id
}
尽管如此,部署此命令会导致错误,并指出:
错误:创建 EKS 集群(数据层-eks)时出错: UnsupportedAvailabilityZoneException:无法创建集群 'data-layer-eks' 因为 us-east-1e,目标可用区, 目前没有足够的容量来支持集群。
这是一个“众所周知的错误”,任何人都可能会遇到这个错误,甚至对于 EC2 也是如此。 我可以通过简单地对子网值进行硬编码来解决这个问题
,但这确实是不可取的并且很难维护。所以问题是,如何根据容量足够的可用区过滤出subnet_ID?
首先,您需要收集子网及其所有属性:
data.aws_subnet.this
现在是包含所有子网及其属性的
map(object)
。您现在可以相应地按可用区域进行过滤:
subnets = [for subnet in data.aws_subnet.this : subnet.id if subnet.availability_zone != "us-east-1e"]
如果条件对您来说更容易,您还可以按真实条件进行过滤:
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)]
这取决于您的个人使用情况。
你可以尝试这样的事情: