使用Terraform部署到多个AWS账户吗?

ehi*_*ime 4 amazon-web-services terraform

我一直在寻找一种能够在Terraform中同时部署到多个AWS账户并且干dry的方法。AWS具有使用堆栈执行此操作的概念,但是我不确定Terraform中是否可以执行此操作?如果是这样,有什么解决方案?

您可以在此处阅读有关Cloudformation解决方案的更多信息。

yda*_*coR 9

您可以定义多个提供程序别名,这些别名可用于在不同区域甚至不同的AWS账户中运行操作。

因此,要在您的默认区域(如果未在环境变量/ ~/.aws/configure/ etc中定义,或者在美国东部1 进行提示)中执行一些操作,您将具有以下内容:

provider "aws" {
  # ...
}

# Cloudfront ACM certs must exist in US-East-1
provider "aws" {
  alias  = "cloudfront-acm-certs"
  region = "us-east-1"
}
Run Code Online (Sandbox Code Playgroud)

然后,您将像这样引用它们:

data "aws_acm_certificate" "ssl_certificate" {
  provider    = "aws.cloudfront-acm-certs"
  ...
}

resource "aws_cloudfront_distribution" "cloudfront" {
  ...
  viewer_certificate {
    acm_certificate_arn = "${data.aws_acm_certificate.ssl_certificate.arn}"
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您想同时在多个帐户中进行操作,则可以在另一个帐户中扮演这样的角色

provider "aws" {
  # ...
}

# Assume a role in the DNS account so we can add records in the zone that lives there
provider "aws" {
  alias   = "dns"
  assume_role {
    role_arn     = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"
    session_name = "SESSION_NAME"
    external_id  = "EXTERNAL_ID"
  }
}
Run Code Online (Sandbox Code Playgroud)

并这样引用它:

data "aws_route53_zone" "selected" {
  provider     = "aws.dns"
  name         = "test.com."
}

resource "aws_route53_record" "www" {
  provider = "aws.dns"
  zone_id  = "${data.aws_route53_zone.selected.zone_id}"
  name     = "www.${data.aws_route53_zone.selected.name}"
  ...
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过多种其他方式为不同的AWS账户提供凭证,例如在提供程序中对它们进行硬编码或使用不同的Terraform变量AWS SDK特定的环境变量或通过配置的配置文件


Rtm*_*tmY 6

我还建议将您的解决方案与Terraform 工作区结合起来:

命名工作区允许在其单个后端内的单个配置的多个实例之间方便地切换。它们在许多情况下很方便,但不能解决所有问题。

多个工作区的常见用途是创建一组基础设施的并行、不同的副本,以便在修改主生产基础设施之前测试一组更改。例如,处理一组复杂的基础架构更改的开发人员可能会创建一个新的临时工作区,以便在不影响默认工作区的情况下自由地试验更改。

非默认工作区通常与版本控制中的功能分支相关。默认工作区可能对应于“master”或“trunk”分支,它描述了生产基础设施的预期状态。当创建功能分支来开发更改时,该功能的开发人员可能会创建相应的工作区并将主基础设施的临时“副本”部署到其中,以便可以在不影响生产基础设施的情况下测试更改。一旦更改被合并并部署到默认工作区,就可以销毁测试基础架构并删除临时工作区。

AWS S3位于支持的后端列表中。

它非常易于使用(类似于使用 git 分支)并将其与所选的 AWS 帐户结合起来。

terraform workspace list
   dev
 * prod
   staging
Run Code Online (Sandbox Code Playgroud)

有关配置 AWS 提供商以使用多个帐户的一些参考:

  1. https://terragrunt.gruntwork.io/docs/features/work-with-multiple-aws-accounts/

  2. https://assets.ctfassets.net/hqu2g0tau160/5Od5r9RbuEYueaeeycUIcK/b5a355e684de0a842d6a3a483a7dc7d3/devopscon-V2.1.pdf