如何不通过tfvars文件传递Terraform输出值用于EKS集群部署
解决方案
你遇到的问题核心是两个独立Terraform工作目录的状态值跨目录引用,有两种成熟方案可以实现无需写入tfvars的参数传递需求:
方案1:使用terraform_remote_state数据源直接读取VPC工作目录的状态输出(推荐)
该方案直接复用VPC目录已经输出的参数,不需要额外配置标签过滤,准确率最高。
- 确认
testclusters-vpc目录已经执行过terraform apply,且状态已经存储到你配置的S3远端后端 - 在
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" } }
- 修改
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
相关产品推荐
相关产品推荐

