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

Terraform中无法跨模块获取模块内定义的变量值

问题解决:Terraform模块间变量引用失败

错误原因

模块内部定义的变量(即便带有默认值)属于模块私有属性,外部模块无法直接访问。必须在被引用模块中通过output明确暴露需要对外提供的属性,外部才能正常调用。

解决步骤

1. 在被引用模块中添加输出配置

在../modules/dev_env目录下创建outputs.tf文件,将需要外部访问的变量定义为输出:

# ../modules/dev_env/outputs.tf
output "INSTANCE_TYPE" {
  value = var.INSTANCE_TYPE
}

output "AWS_MUMBAI_REGION" {
  value = var.AWS_MUMBAI_REGION
}

output "AMIS" {
  value = var.AMIS
}

2. 修正主模块的引用方式

主模块中直接引用模块输出的属性,建议使用Terraform 0.12+的新式语法(无需${}插值):

module "mydemomodule" {
  source = "../modules/dev_env"
}

resource "aws_instance" "demo" {
  ami           = module.mydemomodule.AMIS.LINUX_MUMBAI
  region        = module.mydemomodule.AWS_MUMBAI_REGION
  instance_type = module.mydemomodule.INSTANCE_TYPE
  key_name      = aws_key_pair.ssshkey.key_name
  tags = {
    Name = "${terraform.workspace}_server"
  }
}

3. 规范变量文件(可选但建议)

你当前把变量定义写在了dev.tfvars里,不符合Terraform规范:

  • 变量定义应放在variables.tf文件中(模块内)
  • .tfvars文件仅用于赋值变量值,比如需要覆盖默认值时使用

调整后模块内的文件结构:

../modules/dev_env/
├── variables.tf   # 存放变量定义
├── outputs.tf     # 存放输出定义
└── dev.tfvars     # 可选,存放变量的自定义值

variables.tf内容如下:

# ../modules/dev_env/variables.tf
variable "INSTANCE_TYPE"{
    default = "t2.micro"
}
 
variable "AWS_MUMBAI_REGION"{
    default = "ap-south-1"
}

variable "AWS_SINGAPORE_REGION"{
    default = "us-southeast-1"
}

variable "AMIS" {
     type = map
     default = {
        LINUX_MUMBAI  = "ami-0cca134ec43cf708f"
        UBUNTU_MUMBAI = "ami-07ffb2f4d65357b42"
        LINUX_SGP     = "ami-005835d578c62050d"
        UBUNTU_SGP    = "ami-02045ebddb047018b"
     }
}

验证执行

完成修改后,重新执行以下命令:

terraform init
terraform plan

内容的提问来源于stack exchange,提问作者Rajiv Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:05:20