0

我有一个模块,它结合了两种资源,一个 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"
  }
  ...
}

到目前为止,秘密已经在他们自己的模块中定义

所以我这样分配提供者:

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

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

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

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

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

4

1 回答 1

1

你会像这样传递它:

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-provider或者aws.secret-provider选择使用两个提供程序配置中的哪一个。

文档:模块中的提供者

于 2021-02-19T12:40:01.990 回答