Из вашего вопроса я буду исходить из того, что постановка - это собственная учетная запись AWS, отдельная от вашей корневой учетной записи. Из документов Terraform
Вы можете определить несколько конфигураций для одного и того же провайдера для поддержки нескольких регионов, нескольких хостов и т. Д.
Это также относится к созданию ресурсов в нескольких учетных записях AWS. Чтобы создать ресурсы Terraform в двух учетных записях AWS, выполните следующие действия.
В вашей точке входа main.tf
определите AWS-провайдеров для учетных записей, на которые вы будете ориентироваться:
# your normal provider targeting your root account
provider "aws" {
version = "1.40"
region = "us-east-1"
}
provider "aws" {
version = "1.40"
region = "us-east-1"
alias = "staging" # define custom alias
# either use an assumed role or allowed_account_ids to target another account
assume_role {
role_arn = "arn:aws:iam:STAGINGACCOUNTNUMBER:role/Staging"
}
}
(Примечание: роль arn уже должна существовать, и ваши текущие учетные данные AWS должны иметь разрешение на ее принятие)
Чтобы использовать их в своем модуле , назовите свой модуль следующим образом
module "data_role" {
source = "../tf_data_role"
providers = {
aws.staging = "aws.staging"
aws = "aws"
}
account_id = "${var.account_id}"
name = "data"
... remainder of module
}
и определите провайдеров в вашем модуле следующим образом:
provider "aws" {
alias = "staging"
}
provider "aws" {}
Теперь, когда вы объявляете ресурсы в своем модуле, вы можете указать, в каком поставщике AWS (и, следовательно, какой учетной записи) создавать ресурсы, например,
resource "aws_iam_role" "this" {
provider = "aws.staging" # this aws_iam_role will be created in your staging account
name = "${var.name}"
description = "${format("%s (managed by Terraform)", var.policy_description)}"
assume_role_policy = "${length(var.custom_principals) == 0 ? data.aws_iam_policy_document.assume_role.json : data.aws_iam_policy_document.assume_role_custom_principals.json}"
}
resource "aws_iam_policy" "this" {
# no explicit provider is set here so it will use the "default" (un-aliased) aws provider and create this aws_iam_policy in your root account
name = "${var.name}"
description = "${format("%s (managed by Terraform)", var.policy_description)}"
policy = "${var.policy}"
}