Terraform模块需要required_providers吗?

25

我对terraform文档中关于模块的内容有点困惑。以下是它所说的关于模块的内容:

https://www.terraform.io/docs/language/modules/index.html

模块是用于同时使用多个资源的容器。 模块由在目录中放在一起的.tf和/或.tf.json文件集合组成。

以下是关于提供程序的内容: https://www.terraform.io/docs/language/providers/requirements.html

要求提供商

每个Terraform模块必须声明它需要哪些提供商,以便Terraform可以安装和使用它们。 提供者要求在required_providers块中声明。

提供程序要求由本地名称、源位置和版本约束组成:

terraform {
 required_providers {
    mycloud = {
      source  = "mycorp/mycloud"
      version = "~> 1.0"
   }
 }
}
我感到困惑,因为我从未在我的任何模块中指定required_providers,尽管我正在使用提供程序,并且它说我必须这样做。直到今天我才知道文档上说了这一点。
那么,我是误解了文档,还是文档有误?我的每个模块都需要 required_providers 吗?我的terraform配置肯定可以不用它们工作,所以它们默认是什么?如果是的话,是如何和在哪里默认的?
2个回答

26

为了与 Terraform 的早期版本保持向后兼容性,Terraform v0.13 及更高版本将任何未在 required_providers 中声明的提供者短名称的使用视为对 hashicorp 命名空间中提供者的隐式声明需求。

例如,我们可以考虑一个像这样的资源:

resource "aws_instance" "example" {
  # ...
}

如果你没有声明你所指的提供商是 aws,那么Terraform会假设你的意思是写出类似这样的内容:

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
    }
  }
}

这种行为主要旨在允许针对HashiCorp分发的提供程序编写的现有模块(以前是唯一的可自动安装的提供程序)继续工作而无需进行任何修改。如果您希望,可以依赖于这种向后兼容性行为,但意图(反映在文档中)是所有现代Terraform模块都应明确说明它们正在使用哪些特定的提供程序,以便随着有更多属于其他命名空间的提供程序的出现,模块的读者不需要注意这个特殊的向后兼容规则以理解其含义。

Terraform v0.13中包含的terraform 0.13upgrade命令将自动生成每个模块使用的适当源地址,方法是引用一个表格,该表格将Terraform v0.12及更早版本理解的提供程序名称映射到Terraform v0.13及更高版本所期望的完全限定提供程序源地址。只有由HashiCorp维护的(而不是由第三方维护但以前由HashiCorp分发的)才在hashicorp命名空间中,因此使用该工具将确保您指定与Terraform v0.12为同一配置安装的提供程序相对应的地址。


5

子模块不需要 required_providers,如果需要,它们将从父模块继承。来自文档

如果子模块没有声明任何配置别名,那么 providers 参数是可选的。如果省略它,子模块会从其父模块继承所有默认提供程序配置。(默认提供程序配置是不使用别名参数的配置)


好的,知道了。你能回答这个问题吗?“所以我是误解了文档,还是文档本身就有错误?”我是否没有理解术语的细微差别? - Daniel Kaplan
2
@DanielKaplan 我同意文档很令人困惑。也许他们应该写每个父模块都需要提供者,而不是所有模块。 - Marcin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接