如何将多个 aws 提供程序传递给一个模块?

How to pass several aws providers to one module?

我有一个模块结合了两个资源,一个 rds 实例和一个秘密,每个资源都需要自己的提供者。

.
├── environments
│   └── myenv
│       ├── locals.tf
│       ├── main.tf
│       └── variables.tf
└── modules
    └── db
        ├── main.tf
        ├── secrets.tf
        └── variables.tf

modules/db/main.tf:

resource "aws_db_instance" "database"{
    #needs aws.db-provider
    ...
}

modules/db/secrets:

data "aws_secretsmanager_secret_version" "rds_pg_credentials" {
  #needs aws.secret-provider 
  secret_id = var.secret_id
}

两个提供商都在 environments/myenv/main.tf 中指定:

provider "aws" {
  alias = "db-provider"
  assume_role {
     role_arn = "arn:aws:iam::123:role/db-role"
  }
  ...
}

provider "aws" {
  alias = "secret-provider"
  assume_role {
     role_arn = "arn:aws:iam::123:role/secrets-role"
  }
  ...
}

到目前为止,secrets 都是在它们自己的模块中定义的

所以我这样分配供应商:

module "my-db" {
  source = ".//../../modules/db"
  providers = {
    aws = aws.db-provider
  }
  ...
}

module "secrets" {
  source = ".//../../modules/secrets"
  providers = {
    aws = aws.secret-provider
  }
  ...
}

但现在我将 secrets 移动到 db,我不知何故需要在一个提供程序块中传递两者。
我相信这两种资源都希望他们的提供者被称为“aws”,所以我想我只需要以不同的名称传递它们,比如

module "my-db" {
  source = ".//../../modules/db"
  providers = {
    aws1 = aws.db-provider
    aws2 = aws.secret-provider
  }
  ...
}

但是我该如何配置模块以使用 aws{1,2} 而不是 aws

你会像这样传递它:

module "my-db" {
  source = ".//../../modules/db"
  providers = {
    aws.db-provider = aws.db-provider
    aws.secret-provider = aws.secret-provider
  }
  ...
}

在您的模块 my-db 中,您需要这样的代理提供商定义:

provider "aws" {
  alias = "db-provider"
}

provider "aws" {
  alias = "secret-provider"
}

您模块中的每个资源都应该有自己的提供程序属性设置为 aws.db-provideraws.secret-provider 以选择使用两个提供程序配置中的哪一个。

文档:Providers Within Modules