【问题标题】:Terraform in aws multi account env created by AWS Control TowerAWS Control Tower 创建的 aws 多账户环境中的 Terraform
【发布时间】:2020-12-14 10:35:24
【问题描述】:

我刚刚转移到使用 Control Tower 设置的多帐户,并且正在使用 Terraform 在不同帐户中部署资源。

我的(简化的)帐户结构是:

|--Master
   |--management (backends etc)
   |--images     (s3, ecr)
   |--dev
   |--test

作为一个简化的实验,我正在尝试在图像帐户中创建一个 ecr。所以我认为我需要创建一个策略来启用角色切换并在目标帐户中提供权限。现在我手头很重,只是试图切换到管理员访问权限。 AWSAdministratorAccess 角色由 Control Tower 在配置时创建。

provider "aws" {
   region  = "us-west-2"
   version = "~> 3.1"
}

data "aws_iam_group" "admins" { // want to attach policy to admins to switch role
   group_name = "administrators"
}


// Images account
resource "aws_iam_policy" "images-admin" {
  name        = "Assume-Role-Images_Admin"
  description = "Allow assuming AWSAdministratorAccess role on Images account"
  policy      = <<EOP
  {
     "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "sts:AssumeRole"
            ],
            "Resource": "arn:aws:iam::<Images_Account_ID>:role/AWSAdministratorAccess"
          }
        ]
      }
    EOP
   }

 resource "aws_iam_group_policy_attachment" "assume-role-images-admin" {
  group      = data.aws_iam_group.admins.group_name
  policy_arn = aws_iam_policy.images-admin.arn
 }

部署此堆栈后,我尝试部署另一个堆栈,该堆栈在图像帐户中创建资源。

provider "aws" {
  region  = var.region
  version = "~>3.1"
}

provider "aws" { 
  alias   = "images"
  region  = var.region
  version = "~> 3.1"
  assume_role {
     role_arn = "arn:aws:iam::<Images_Account_ID>:role/AWSAdministratorAccess"
  }
}

resource "aws_ecr_repository" "boot-images" {
  provider             = aws.images
  name                 = "boot-images"
}

在部署时我得到了:

> Error: error configuring Terraform AWS Provider: IAM Role (arn:aws:iam::*********:role/AWSAdministratorAccess) cannot be assumed.

There are a number of possible causes of this - the most common are:
  * The credentials used in order to assume the role are invalid
  * The credentials do not have appropriate permission to assume the role
  * The role ARN is not valid

Error: NoCredentialProviders: no valid providers in chain. Deprecated.
    For verbose messaging see aws.Config.CredentialsChainVerboseErrors

第一个:提供的凭据来自始终在单帐户环境中工作的主帐户

第二:这是我认为通过附加政策已经实现的目标

第三:对此不太确定,但账户中存在 AWSAdministratorAccess defo,我认为 arn 格式是正确的,而 AWS Single Sign On 将其称为权限集,控制台也将其描述为角色。

我发现 Deploying to multiple AWS accounts with Terraform? 很有帮助,但我在这里遗漏了一些东西。

我也不知道如何将此想法扩展到将 s3 远程后端部署到我的“管理”帐户中。

Terraform 版本 0.12.29

【问题讨论】:

  • 所以您使用来自administrators 组的用户运行terraform
  • 是的,没错。

标签: amazon-web-services terraform terraform-provider-aws aws-control-tower


【解决方案1】:

原来这里有几个问题:

  1. 简介

凭据配置文件不正确。在 Env Vars 中设置正确的凭据让我在仅使用凭据文件失败时运行一个简单的测试。这里还有一个问题我不明白,因为更新 creds 文件也失败了,但我有一个可以工作的系统。

  1. AWS 创建的角色

虽然我的假设是正确的,即权限集被定义为角色,但它们具有未扩展到我的主管理员用户(我的错误)的信任关系,并且它无法修改,因为它是由 AWS 自动创建的,它是锁定。

  1. 手动授予权限

因此,虽然我可以通过 Terraform 以编程方式向组授予权限以担任角色,但我需要在目标帐户中手动创建一个角色,以扩展信任,从而扩展对主帐户的权限。

【讨论】:

    【解决方案2】:

    根据我自己的经验并考虑到您已经拥有一个工作的 AWS 基础设施,我会排除并离开 Control Tower,并考虑使用 CloudFormation StackSets 做同样的事情。它们让您可以定位 OU 或个人帐户。

    Control Tower 已多次推荐给我,但由于 AWS 生态系统拥有超过 25 个帐户和生产工作负载,我非常不愿意尝试活动。我想从头开始很好,但当您已经在 AWS 中拥有大量工作负载和帐户时,就不行了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 2018-12-29
      • 2014-04-13
      • 2017-12-22
      相关资源
      最近更新 更多