如何使用多个AWS帐户来隔离环境之间的Terraform状态

ser*_*ska 11 amazon-web-services terraform infrastructure-as-code

如何使用指向不同 AWS 账户的 s3 后端?

换句话说,我想要这样的东西:

AWS 账户 A 中 S3 存储桶的开发环境状态

AWS 账户 B 上另一个 S3 存储桶上的暂存环境状态

任何人都可以帮助我吗?

Mar*_*ins 21

s3Terraform后端的文档包括多账户 AWS 架构部分,其中包括在多账户 AWS 架构中使用 Terraform 的一些建议、建议和注意事项。

该指南比我在这里复制的要详细得多,但推荐的要点是:

  • 对 Terraform 以及用于预置和配置环境的任何其他管理工具使用单独的 AWS 账户,以便 Terraform 使用的基础设施与Terraform管理的基础设施完全分开。

    这降低了错误的 Terraform 配置无意中破坏您使用 Terraform 本身的能力的风险(例如,通过删除状态对象或删除必要的 IAM 权限)。它还降低了攻击者利用主要基础设施中的漏洞升级以访问您的管理基础设施的可能性。

  • 用于sts:AssumeRole通过每个主环境 AWS 账户中的管理访问权限间接访问 IAM 角色。

    这使您可以将所有直接管理访问集中在一个 AWS 账户中,您可以更轻松地对其进行审核,减少凭证蔓延,还可以方便地配置 AWS 提供商以进行跨账户访问(因为它具有内置支持assume_role) 。

该指南还讨论了使用工作区来表示环境。考虑到何时使用多个工作空间中其他地方的指导,该建议可能更具争议性,但即使您遵循每个环境拥有单独的根模块并使用共享模块的建议,使用管理帐户和 IAM 委派的原则仍然适用。代表共同元素。

与系统架构中的所有内容一样,这些都不是绝对的,最适合您的情况将取决于您的详细信息,但希望我链接到的这两个文档部分中的内容将帮助您权衡各种选项并决定什么是最适合您的具体情况。


sam*_*ler 7

对此有以下几种解决方案:

  1. 在运行时运行terraform init和 injec terraform 后端变量时,在命令行提供 aws 配置文件名称:

    AWS_PROFILE=aws-dev terraform init -backend-config="bucket=825df6bc4eef-state" \
    -backend-config="dynamodb_table=825df6bc4eef-state-lock" \
    -backend-config="key=terraform-multi-account/terraform.tfstate"
    
    Run Code Online (Sandbox Code Playgroud)

或者将此命令包装在Makefile中,因为它很长且容易忘记。

  1. 保留单独的目录并提供角色或您的凭据或配置文件名称,即使使用共享凭据

     provider "aws" {
     region                  = "us-west-2"
     shared_credentials_file = "/Users/tf_user/.aws/creds"
     profile                 = "customprofile"
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 地形工作空间

  3. 特拉格伦特