Terraform 在子 AWS 账户中创建资源

Posted

技术标签:

【中文标题】Terraform 在子 AWS 账户中创建资源【英文标题】:Terraform Create resource in Child AWS Account 【发布时间】:2020-03-16 23:01:33 【问题描述】:

我的目标是创建一个 Terraform 模块,该模块会创建一个子 AWS 账户在该账户内创建一组资源(例如 AWS Config 规则)。

使用以下aws_organizations_account 定义创建帐户:

resource "aws_organizations_account" "account" 
  name  = "my_new_account"
  email = "john@doe.org"

aws_config_config_rule 的示例类似于:

resource "aws_config_config_rule" "s3_versioning" 
  name        = "my-config-rule"
  description = "Verify versioning is enabled on S3 Buckets."

  source 
    owner             = "AWS"
    source_identifier = "S3_BUCKET_VERSIONING_ENABLED"
  

  scope 
    compliance_resource_types = ["AWS::S3::Bucket"]
  

但是,这样做会在主账户中创建 AWS Config 规则,而不是在新创建的子账户中。

如何定义配置规则以应用于子帐户?

【问题讨论】:

你可能会从这个答案中受益:serverfault.com/questions/929745/… 但听起来你想做的事情会非常痛苦,我建议不要这样做。 【参考方案1】:

所以,我实际上能够通过在模块中定义一个新的提供者来实现这一点,该模块假定新创建的帐户中的OrganizationAccountAccessRole。

这是一个例子:

// Define new account
resource "aws_organizations_account" "my_new_account" 
  name  = "my_new_account"
  email = "john@doe.org"


provider "aws" 
  /* other provider config */
  assume_role 
    // Assume the organization access role
    role_arn = "arn:aws:iam::$aws_organizations_account.my_new_account.id:role/OrganizationAccountAccessRole"
  
  alias = "my_new_account"


resource "aws_config_config_rule" "s3_versioning" 
  // Tell resource to use the new provider
  provider = aws.my_new_account

  name        = "my-config-rule"
  description = "Verify versioning is enabled on S3 Buckets."

  source 
    owner             = "AWS"
    source_identifier = "S3_BUCKET_VERSIONING_ENABLED"
  

  scope 
    compliance_resource_types = ["AWS::S3::Bucket"]
  


但是,应该注意的是,在模块内定义提供程序会导致一些问题,特别是一旦您获取此模块您无法删除此模块。如果你这样做,它会抛出一个Error: Provider configuration not present,因为你也会删除提供者定义。

但是,如果您不打算删除这些帐户(或者可以在需要时手动删除),那么这应该很好!

【讨论】:

以上是关于Terraform 在子 AWS 账户中创建资源的主要内容,如果未能解决你的问题,请参考以下文章

在 CodePipeline 中创建使用另一个 AWS 账户的资源的管道

terraform 中是不是有任何特定的资源标签可以在 eventbridge 中创建规则

通过 terraform 在 aws 中创建 VPC 问题

在另一个 AWS 账户中创建 RDS/Postgres 副本?

使用 terraform 在非默认 VPC 中创建 AWS RDS 实例

仅在不存在时如何创建 terraform 资源