Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何使用多个AWS帐户在环境之间隔离地形状态_Amazon Web Services_Terraform_Infrastructure As Code - Fatal编程技术网

Amazon web services 如何使用多个AWS帐户在环境之间隔离地形状态

Amazon web services 如何使用多个AWS帐户在环境之间隔离地形状态,amazon-web-services,terraform,infrastructure-as-code,Amazon Web Services,Terraform,Infrastructure As Code,如何使用指向不同AWS帐户的s3后端 换句话说,我想要这样的东西: AWS帐户A中S3存储桶上的开发环境状态 将环境状态转移到AWS帐户B上的另一个S3存储桶上 任何人都可以帮我吗?有几种解决方案: 在运行时运行terraform init和injec变量时,在命令行中提供aws概要文件名称: AWS_PROFILE=aws-dev terraform init -backend-config="bucket=825df6bc4eef-state" \

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

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

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

将环境状态转移到AWS帐户B上的另一个S3存储桶上


任何人都可以帮我吗?

有几种解决方案:

  • 在运行时运行terraform init和injec变量时,在命令行中提供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"
    
  • 或者将此命令包装在一个生成文件中,因为它相当长而且容易忘记

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

  • 包括一节,其中包括在多帐户AWS体系结构中使用Terraform的一些建议、建议和注意事项

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

    • 为Terraform使用单独的AWS帐户以及您用于调配和配置环境的任何其他管理工具,以便Terraform使用的基础设施与Terraform管理的基础设施完全分离

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

    • 使用
      sts:AssumeRole
      间接访问每个主环境AWS帐户中具有管理权限的IAM角色

      这允许您将所有直接管理访问集中在一个AWS帐户中,您可以更轻松地对其进行审核,减少凭证扩展,还可以方便地为跨帐户访问配置AWS提供程序(因为它具有内置的
      假定\u角色
      支持)

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


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

    谢谢@samchobble向我展示所有选项。到目前为止,我一直尝试第一种方式,但我想尝试第三种方式。在这种情况下,我不明白如何处理工作区和后端配置之间的关系。我无法描述整个功能,这可能会让你开始它是一个很好的链接,但请谈谈如何使用工作区管理多环境。我需要一种将环境与工作区和特定aws帐户关联的方法。我需要在环境之间获得独立的s3后端管理状态是的,您可以通过为每个环境配置具有不同状态文件的后端来实现。谢谢您的回复。我正在阅读文档,尤其是您建议的链接。我希望在AWS帐户A上有一个s3存储桶用于开发环境的状态管理,在AWS帐户B上有另一个s3存储桶用于产品环境的管理(例如),我开始知道使用terraform实现这一点的唯一方法是为每个环境复制基础结构代码。也许可以用terragrunt来完成。你觉得怎么样?
     provider "aws" {
     region                  = "us-west-2"
     shared_credentials_file = "/Users/tf_user/.aws/creds"
     profile                 = "customprofile"
     }