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

为何Terraform MongoDB Atlas子模块需重复声明Provider源?

关于Terraform跨模块Provider声明的疑问

问题场景

我在根目录的provider.tf中配置了如下内容:

terraform {
  required_version = ">= 1.0.5"
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "= 3.8.0"
    }
    mongodbatlas = {
      source = "mongodb/mongodbatlas"
    }
  }
}

执行terraform init阶段时出现如下错误:

Error: Failed to query available provider packages
│ 
│ Could not retrieve the list of available versions for provider
│ hashicorp/mongodbatlas: provider registry registry.terraform.io does not
│ have a provider named registry.terraform.io/hashicorp/mongodbatlas
│ 
│ Did you intend to use mongodb/mongodbatlas? If so, you must specify that
│ source address in each module which requires that provider. To see which
│ modules are currently depending on hashicorp/mongodbatlas, run the
│ following command:
│     terraform providers

在需要MongoDB Atlas的子模块中添加如下声明后问题解决:

terraform {
  required_providers {
    mongodbatlas = {
      source = "mongodb/mongodbatlas"
    }
  }
}

我的疑问是:为何必须执行此操作?其他所需Provider无需重复声明?


解答

核心原因在于Provider的命名空间默认规则:

  • 对于HashiCorp官方维护的Provider(比如azurerm),Terraform会默认使用hashicorp/作为命名空间前缀。即使子模块里只写了azurerm,Terraform会自动补全为hashicorp/azurerm,和根模块的声明匹配,所以不需要重复指定source。
  • 而mongodbatlas是MongoDB官方维护的第三方Provider,不属于HashiCorp的命名空间。当子模块中引用这个Provider时,如果没有明确指定source = "mongodb/mongodbatlas",Terraform会默认尝试从hashicorp/mongodbatlas去查找,这显然不存在,所以会报错。
  • Terraform的模块是独立的配置单元,每个模块都需要明确知道所依赖Provider的完整源地址,除非是HashiCorp官方的Provider(默认命名空间)。根模块的Provider声明不会自动传递给子模块的Provider依赖解析,子模块必须自己明确非官方Provider的source地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:36:18