能否在同一Terraform计划中创建AWS EKS集群并部署资源?
问题背景
你希望在单个Terraform计划内完成AWS EKS集群创建和后续Kubernetes应用部署,但遇到了cannot create REST client: no client config错误。当前只能拆分两个计划:先创建集群,再用-target参数部署资源,想确认是否能在单计划内完成所有操作。
之前你尝试用data数据源关联EKS集群信息配置Kubernetes Provider,但执行时触发了REST客户端构建失败的错误——因为计划阶段集群尚未创建,Provider无法获取有效配置信息。
解决方案:别名Provider + 延迟初始化
完全可以在同一Terraform计划中完成操作,核心是通过Provider别名和依赖控制延迟Kubernetes Provider的初始化,确保它在EKS集群创建完成后再启动配置。
具体操作步骤如下:
移除冗余的EKS Cluster Data源
直接从创建集群的模块获取输出(假设module.EKS-create-cluster已输出endpoint和certificate_authority_data),无需额外使用data "aws_eks_cluster",避免计划阶段的无效读取操作。定义带别名的Kubernetes Provider
给Kubernetes Provider设置别名,并通过terraform_data作为依赖标记,确保Provider在集群创建完成后再初始化:# 用terraform_data标记集群创建完成的状态 terraform_data "eks_cluster_ready" { input = module.EKS-create-cluster.id depends_on = [module.EKS-create-cluster] } # 获取EKS集群认证token,依赖集群创建模块 data "aws_eks_cluster_auth" "eks_cluster_auth" { name = var.cluster_name depends_on = [module.EKS-create-cluster] } # 带别名的Kubernetes Provider,依赖集群完成标记 provider "kubernetes" { alias = "eks" host = module.EKS-create-cluster.endpoint cluster_ca_certificate = base64decode(module.EKS-create-cluster.certificate_authority_data) token = data.aws_eks_cluster_auth.eks_cluster_auth.token depends_on = [terraform_data.eks_cluster_ready] }所有Kubernetes资源指定该别名Provider
在你部署的Kubernetes资源(比如kubernetes_manifest)中,明确指定使用上面定义的别名Provider:resource "kubernetes_manifest" "customresourcedefinition_operatorconfigs_monitoring_googleapis_com" { provider = kubernetes.eks # 你的资源配置内容 manifest = { # ... 此处填写CRD的具体配置 } }
原理说明
之前的错误根源是:默认的Kubernetes Provider会在Terraform计划阶段就尝试初始化,此时EKS集群尚未创建,data数据源也无法获取有效配置,导致REST客户端构建失败。
通过给Provider设置别名,并绑定depends_on到集群创建完成的terraform_data资源,Terraform会调整执行顺序:先创建EKS集群 → 读取认证token → 初始化Kubernetes Provider → 最后部署Kubernetes资源,从而在同一个计划中完成全部操作。
额外注意事项
- 确保
module.EKS-create-cluster正确输出endpoint、certificate_authority_data等必要参数; - 所有Kubernetes相关资源(如
kubernetes_deployment、kubernetes_service)都需要指定provider = kubernetes.eks; - 执行时无需拆分计划,直接运行
terraform init→terraform plan→terraform apply即可。
内容的提问来源于stack exchange,提问作者shady

