跳至主要内容

模块的 providers 元参数

模块调用 块中,可选的 providers 元参数指定父模块中的哪些 提供程序配置 可在子模块中使用。

代码块
# The default "aws" configuration is used for AWS resources in the root
# module where no explicit provider instance is selected.
provider "aws" {
region = "us-west-1"
}

# An alternate configuration is also defined for a different
# region, using the alias "usw2".
provider "aws" {
alias = "usw2"
region = "us-west-2"
}

# An example child module is instantiated with the alternate configuration,
# so any AWS resources it defines will use the us-west-2 region.
module "example" {
source = "./example"
providers = {
aws = aws.usw2
}
}

默认行为:继承默认提供程序

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

如果指定了 providers 参数,则会取消此默认行为,并且子模块将能访问您指定的提供程序配置。

用法和行为

providers 的值为一个映射,其中

  • 键是在子模块中使用的提供程序配置名称。
  • 值是来自父模块的提供程序配置名称。

键和值都应该是对提供程序配置的未加引号的引用。对于默认配置,这是提供程序的本地名称;对于备用配置,这是 <PROVIDER>.<ALIAS> 引用。

在子模块中,资源按正常方式分配给提供程序配置——要么 OpenTofu 根据资源类型的名称选择默认值,要么资源使用 provider 参数指定备用配置。如果模块在被调用时接收了 providers 映射,则模块内使用的提供程序配置名称将有效地重新映射为引用父模块中指定的配置。

何时指定提供程序

使用 providers 参数有两个主要原因

  • 为子模块使用不同的默认提供程序配置。
  • 配置需要同一提供程序的多个配置的模块。

更改默认提供程序配置

大多数可重用模块仅使用默认提供程序配置,当省略 providers 时,它们可以自动从调用方继承这些配置。

但是,在使用同一提供程序的多个配置的 OpenTofu 配置中,您可能希望某些子模块使用默认提供程序配置,而其他子模块使用备用配置。(这通常发生在使用一个配置来管理同一云提供程序的多个不同区域中的资源时。)

通过使用 providers 参数(如上面的代码示例所示),您可以适应这种情况,而无需编辑子模块。尽管子模块中的代码始终引用默认提供程序配置,但该默认值的实际配置对于每个实例都可以不同。

具有备用提供程序配置的模块

在极少数情况下,单个可重用模块可能需要同一提供程序的多个配置。例如,配置两个 AWS 区域之间网络连接的模块可能需要源区域和目标区域。在这种情况下,根模块可能如下所示

代码块
provider "aws" {
alias = "usw1"
region = "us-west-1"
}

provider "aws" {
alias = "usw2"
region = "us-west-2"
}

module "tunnel" {
source = "./tunnel"
providers = {
aws.src = aws.usw1
aws.dst = aws.usw2
}
}

非默认提供程序配置永远不会自动继承,因此任何类似这样工作的模块都始终需要 providers 参数。模块的文档应指定它需要的所有提供程序配置名称。

模块开发人员的更多信息

有关在可重用子模块内使用提供程序的更多详细信息和指南,请参阅 模块开发:模块内的提供程序