首页 > 解决方案 > 遍历 aws 提供程序以在每个 aws 帐户中创建资源

问题描述

我在 Terraform 中有一个名为 users 的对象列表,结构如下:

variable "accounts" {
  type = list(object({
    id       = string #used in assume_role
    email   = string
    is_enabled = bool
  }))
}

我现在想要实现的是在每个 AWS 账户中创建一个简单的 S3 存储桶(如果 is_enabled 为真)。我可以为单个帐户执行此操作,但我不确定是否有办法循环访问提供程序?

单个帐户的代码 - main.tf

provider "aws" {
  alias = "new_account"
  region = "eu-west-3"

  assume_role {
    role_arn     = "arn:aws:iam::${aws_organizations_account.this.id}:role/OrganizationAccountAccessRole"
    session_name = "new_account_creation"
  }
}

resource "aws_s3_bucket" "bucket" {
  provider = aws.new_account

  bucket = "new-account-bucket-${aws_organizations_account.this.id}"
  acl    = "private"
}  

标签: terraform

解决方案


您需要为要使用的每个 aws 帐户定义一个提供程序:

  1. 创建一个模块(一个目录),您的存储桶配置所在的位置:
    ├── main.tf
    └── module
        └── bucket.tf
  1. bucket.tf应包含资源定义:resource "aws_s3_bucket" "bucket" {...}
  2. main.tf中,定义多个 aws 提供者并使用它们中的每一个调用模块:
provider "aws" {
  alias  = "account1"
  region = "eu-west-1"
  ...
}
provider "aws" {
  alias  = "account2"
  region = "us-west-1"
  ...
}

module "my_module" {
  source = "./module"
  providers = {
    aws.account1 = aws.account1
    aws.account2 = aws.account2
  }
}

我想你也可以通过创建一个包含提供程序的变量来获得幻想,并将其传递给模块调用(你也可以使用列表上的过滤器来考虑is_enabled标志)

有关提供者的更多详细信息:https ://www.terraform.io/docs/language/modules/develop/providers.html


推荐阅读