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

时间:2018-09-06 14:31:01

标签: amazon-web-services terraform

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

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

2 个答案:

答案 0 :(得分:4)

您可以定义multiple provider aliases,可用于在不同区域甚至不同的AWS账户中运行操作。

因此要在您的默认区域(如果未在环境变量/ ~/.aws/configure / etc中定义,则提示您执行某些操作)以及在美国东部地区也要执行以下操作:

provider "aws" {
  # ...
}

# Cloudfront ACM certs must exist in US-East-1
provider "aws" {
  alias  = "cloudfront-acm-certs"
  region = "us-east-1"
}

然后您将这样引用它们:

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}"
    ...
  }
}

因此,如果您想同时在多个帐户中进行操作,则可以assume a role in the other account使用类似的方法:

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"
  }
}

并像这样引用它:

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}"
  ...
}

或者,您可以在a number of other wayshardcoding them in the provider or using different Terraform variablesAWS SDK specific environment variables中为不同的AWS账户或通过使用configured profile提供凭据。

答案 1 :(得分:3)

我建议同时将您的解决方案与Terraform workspaces组合在一起:

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

多个工作空间的常见用途是创建平行,不同的 一组基础结构的副本,以测试一组更改 在修改主要生产基础结构之前。例如,一个 开发人员进行一组复杂的基础架构更改可能 创建一个新的临时工作区以自由地进行实验 更改而不影响默认工作区。

非默认工作空间通常与 版本控制。默认工作空间可能对应于 “ master”或“ trunk”分支,它描述了预期的状态 生产基础设施。创建功能分支以进行开发时 更改,该功能的开发者可能会创建一个相应的 工作区并将其临时部署到其中 基础架构,以便可以测试更改而不会影响 生产基础设施。一旦更改被合并并部署到 默认的工作空间,可以破坏测试基础架构, 临时工作区已删除。

AWS S3在受支持的后端列表中。

使用起来非常简单(类似于使用git分支),并将其与所选的AWS账户组合。

terraform workspace list
   dev
 * prod
   staging

有关配置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