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

Terraform子模块目录terraform.tfvars不生效报错解决方案

问题根因

Terraform 对 .tfvars 变量文件的自动加载范围仅限执行Terraform命令的当前工作目录(即根模块目录),子模块目录下存放的 terraform.tfvars 不会被Terraform自动读取加载。
你的场景中,三个变量都没有配置默认值,根模块调用子模块时没有显式传入对应参数,子模块目录下的tfvars又不生效,因此触发「缺少必填参数」的报错;给变量加default后能正常运行,正是因为变量有了内置默认值后不再需要外部传参。

可行解决方案

你可以根据自己的使用场景选以下任意一种方案:

  • 方案1(模块开发推荐写法):调用模块时直接传参
    修改根目录下的demo.tf,在module块中直接传入所有必填变量的值,示例:
    module "module" {
      source          = "./module"
      database_name   = "mydatabase"
      bucket_location = "kgvjgfkjhglbg"
      table_name      = "mytable"
    }
    
    这种写法符合Terraform模块的设计逻辑:模块只封装资源逻辑,变量值由调用方传入,模块本身不绑定固定配置,复用性最强。
  • 方案2:将tfvars文件迁移到根目录,做变量透传
    把module目录下的terraform.tfvars移动到和demo.tf、provider.tf同级的根目录。注意:Terraform不会自动把根模块的变量值传递给子模块,你需要先在根目录声明对应变量,再在调用子模块时透传:
    1. 根目录新建variables.tf,声明和子模块一致的三个变量
    2. 修改demo.tf的module块,传入变量引用:
      module "module" {
        source          = "./module"
        database_name   = var.database_name
        bucket_location = var.bucket_location
        table_name      = var.table_name
      }
      
    根目录下的terraform.tfvars会自动给根模块的变量赋值,再通过透传传入子模块。
  • 方案3:执行命令时手动指定变量文件路径
    执行Terraform命令时通过-var-file参数手动指定要加载的tfvars文件路径,示例:
    terraform plan -var-file=./module/terraform.tfvars
    
    注意:这种方式加载的变量依然属于根模块,你还是需要按照方案2的写法,在module块中完成变量透传,不能省略传参步骤。
额外修复提示

你贴出的module/main.tf代码存在几处引号未闭合的语法错误,修复变量问题后记得同步修改,否则会触发语法解析报错:

  • 列定义处的name = "filekey"、name = "reead_dt" 缺少右侧闭合双引号
  • 分区键定义处的name = "load_dt" 缺少右侧闭合双引号

内容的提问来源于stack exchange,提问作者Arghya Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:39:19