You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不通过tfvars文件传递Terraform输出值用于EKS集群部署

解决方案

你遇到的问题核心是两个独立Terraform工作目录的状态值跨目录引用,有两种成熟方案可以实现无需写入tfvars的参数传递需求:

方案1:使用terraform_remote_state数据源直接读取VPC工作目录的状态输出(推荐)

该方案直接复用VPC目录已经输出的参数,不需要额外配置标签过滤,准确率最高。

  1. 确认testclusters-vpc目录已经执行过terraform apply,且状态已经存储到你配置的S3远端后端
  2. 在testclusters目录的main.tf中添加远程状态数据源配置,替换为你实际的S3桶、状态路径和区域参数:
data "terraform_remote_state" "vpc" {
  backend = "s3"
  config = {
    bucket = "你的S3状态桶名称"
    key    = "testclusters-vpc/terraform.tfstate" # 替换为VPC状态文件在S3中的实际路径
    region = "你的AWS区域,例如cn-north-1"
  }
}
  1. 修改module.testcluster的参数引用:
module "testcluster" {
  source                = "../modules/cluster"
  vpc_id                = data.terraform_remote_state.vpc.outputs.vpc_id
  public_subnets        = data.terraform_remote_state.vpc.outputs.public_subnets_ids
  private_subnets       = data.terraform_remote_state.vpc.outputs.private_subnet_ids
  # 其余参数保持不变
}

方案2:修正现有AWS原生数据源的过滤规则

你之前用数据源不生效的核心原因是没有加足够的过滤条件,导致Terraform无法唯一匹配到对应的VPC和子网资源,按以下配置修正即可:

# 匹配对应VPC,用标签做唯一过滤
data "aws_vpc" "vpc" {
  tags = {
    ClusterName = "${var.clusters_name_prefix}-${terraform.workspace}"
    # 可补充其他VPC独有的标签确保匹配准确
  }
}

# 匹配公网子网
data "aws_subnets" "public" {
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.vpc.id]
  }
  # EKS场景下公网子网默认会打该标签,可替换为你自己定义的公网子网标识标签
  filter {
    name   = "tag:kubernetes.io/role/elb"
    values = ["1"]
  }
}

# 匹配私网子网
data "aws_subnets" "private" {
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.vpc.id]
  }
  # EKS场景下私网子网默认会打该标签,可替换为你自己定义的私网子网标识标签
  filter {
    name   = "tag:kubernetes.io/role/internal-elb"
    values = ["1"]
  }
}

必做配置

完成上述任意方案后,需要删除testclusters目录下variables.tf中定义的vpc_id、public_subnet_ids、private_subnet_ids三个变量,或者给这三个变量设置默认值,否则Terraform仍然会要求你手动传入变量值。

内容的提问来源于stack exchange,提问作者Milton Jesus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:06:03