Terraform 模块是否需要 required_providers?

Do terraform modules need required_providers?

我对我在 terraform 文档中阅读的内容感到有些困惑。这是关于模块的内容:

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

Modules are containers for multiple resources that are used together. A module consists of a collection of .tf and/or .tf.json files kept together in a directory.

这是关于提供者的内容: https://www.terraform.io/docs/language/providers/requirements.html

Requiring Providers

Each Terraform module must declare which providers it requires, so that Terraform can install and use them. Provider requirements are declared in a required_providers block.

A provider requirement consists of a local name, a source location, and a version constraint:

terraform {
 required_providers {
    mycloud = {
      source  = "mycorp/mycloud"
      version = "~> 1.0"
   }
 }
}

我对此感到困惑,因为我从未在我的任何模块中指定 required_providers,即使我正在使用提供程序并且它说我必须这样做。直到今天我才知道文档说了这个。

所以我误解了文档,还是文档有误?我的每个模块是否需要 required_providers?我的 terraform 配置在没有它们的情况下肯定可以工作,那么它们是否默认为某些东西?如果是,如何以及在哪里?

子模块不需要 required_providers,因为如果需要,它们将从父模块继承。来自 docs:

If the child module does not declare any configuration aliases, the providers argument is optional. If you omit it, a child module inherits all of the default provider configurations from its parent module. (Default provider configurations are ones that don't use the alias argument.)

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

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

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

如果您还没有声明 aws 所指的提供商,那么 Terraform 将假定您打算编写如下内容:

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

此行为主要是为了允许针对 HashiCorp 分布式提供程序(以前是 可自动安装的提供程序)编写的现有模块无需任何修改即可继续工作。如果您愿意,您可以依赖这种向后兼容性行为,但意图(反映在文档中)是所有现代 Terraform 模块都应该明确他们正在使用哪些特定的提供者,以便随着时间的推移,有更多的提供者属于其他命名空间,模块的 reader 不需要知道这个特殊的向后兼容性规则来理解它的含义。

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