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 为相同配置安装的提供程序相对应。
我对我在 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 为相同配置安装的提供程序相对应。