メインコンテンツにスキップ

モジュール `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` 引数を使用する主な理由は2つあります。

  • 子モジュールに異なるデフォルトのプロバイダー設定を使用する場合。
  • 同じプロバイダーの複数の設定を必要とするモジュールを設定する場合。

デフォルトのプロバイダー設定の変更

ほとんどの再利用可能なモジュールは、デフォルトのプロバイダー設定のみを使用します。これは、`providers` が省略された場合、呼び出し元から自動的に継承できます。

ただし、同じプロバイダーの複数の設定を使用するOpenTofu設定では、一部の子モジュールにデフォルトのプロバイダー設定を使用し、他の子モジュールに代替設定を使用する場合があります。(これは通常、同じクラウドプロバイダーの複数の異なるリージョンでリソースを管理するために1つの設定を使用する場合に発生します。)

`providers` 引数を使用することにより(上記のコード例のように)、子モジュールを編集する必要なく、これに対応できます。子モジュール内のコードは常にデフォルトのプロバイダー設定を参照しますが、そのデフォルトの実際の構成はインスタンスごとに異なる場合があります。

代替プロバイダー設定を持つモジュール

まれに、単一の再利用可能なモジュールが同じプロバイダーの複数の設定を必要とする場合があります。たとえば、2つのAWSリージョンでネットワーク間の接続を設定するモジュールは、ソースリージョンとデスティネーションリージョンの両方 likely to need both a source and a destination region.が必要になる可能性があります。その場合、ルートモジュールは次のようになります。

コードブロック
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
}
}

デフォルト以外provider configurations are never automatically inherited, so any module that works like this will always need a `providers` argument.のプロバイダー設定は自動的に継承されないため、このように動作するモジュールには常に `providers` 引数が必要です。モジュールのドキュメントには、必要なすべてのプロバイダー設定名を指定する必要があります。

モジュール開発者向けの追加情報

再利用可能な子モジュール内でプロバイダーを操作する方法の詳細とガイダンスについては、モジュール開発:モジュール内のプロバイダーを参照してください。