Terraform子模块输出跨模块引用报错:未声明模块引用
Terraform子模块输出引用错误的解决方法
问题分析
你遇到的错误核心原因是子模块之间不能直接互相引用。SA子模块里尝试直接调用module.azurerm_resource_group,但该模块并未在SA子模块内部声明,Terraform无法识别这个跨模块引用。正确逻辑是通过根模块作为中间层,将资源组模块的输出值传递给存储账户模块。
修正步骤
1. 完善资源组模块的输出
修改azurerm_resource_group/output.tf,同时输出资源组的名称和位置:
output "rg_name" { value = azurerm_resource_group.RG01Name.name } output "rg_location" { value = azurerm_resource_group.RG01Name.location }
2. 给SA模块添加接收参数的变量
在SA/variable.tf中新增两个变量,用于接收资源组的名称和位置:
variable "resource_group_name" { type = string description = "资源组名称" } variable "resource_group_location" { type = string description = "资源组所在区域" }
3. 根模块传递输出值给SA模块
修改根模块azurerm_resources/main.tf中的SA模块调用,将rg模块的输出作为参数传入:
module "rg" { source = "../../module/modules/azurerm_resource_groups" env = var.env tags = var.tags infra_rg_name = var.infra_rg_name rg_location = var.rg_location } module "SA" { source = "../../module/modules/SA" storageaccountname = var.storageaccountname infra_rg_name = var.infra_rg_name env = var.env resource_group_name = module.rg.rg_name # 传递资源组名称 resource_group_location = module.rg.rg_location # 传递资源组位置 }
4. 修改SA模块的资源定义
更新SA/main.tf,用变量替代原来的模块引用:
resource "azurerm_storage_account" "sa01" { name = "${var.env}-${var.storageaccountname}" resource_group_name = var.resource_group_name # 使用传入的变量 location = var.resource_group_location # 使用传入的变量 account_tier = "Standard" account_replication_type = "GRS" tags = var.tags } resource "azurerm_storage_container" "container01" { name = "container01" storage_account_name = azurerm_storage_account.sa01.name container_access_type = "private" }
验证修正
执行terraform validate命令,此时错误应该会消失——SA模块现在通过根模块传递的变量获取资源组信息,而非直接引用其他子模块。
内容的提问来源于stack exchange,提问作者SKumar
相关产品推荐
相关产品推荐

