Terraform в среде AWS с несколькими аккаунтами, созданной AWS Control Tower

Я только что перешел на мультиаккаунт, настроенный с помощью 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 называет его набором разрешений, консоль также описывает это как роль.

Я обнаружил, что с Terraform выполняется развертывание в нескольких учетных записях AWS? что было полезно, но мне что-то здесь не хватает.

Я также не понимаю, как распространить эту идею на развертывание удаленного сервера s3 в моей "управленческой" учетной записи.

Terraform версия 0.12.29

2 ответа

По моему собственному опыту и с учетом того, что у вас уже есть работающая инфраструктура AWS, я бы исключил и отошел от Control Tower и попытался сделать то же самое с CloudFormation StackSets. Они позволяют нацеливаться на подразделения или отдельные учетные записи.

Мне несколько раз рекомендовали Control Tower, но, имея экосистему AWS из более чем 25 учетных записей с рабочими нагрузками, я очень не хочу пробовать. Думаю, здорово начинать с нуля, но не тогда, когда у вас уже есть приличное количество рабочих нагрузок и учетных записей в AWS.

Оказывается, здесь было несколько проблем:

  1. Профиль

Профиль учетных данных неверен. Установка правильных кредитов в Env Vars позволила мне запустить простой тест, когда просто использование файла creds не удалось. Здесь все еще есть проблема, я не понимаю, так как обновление файла creds также не удалось, но у меня есть работающая система.

  1. AWS созданные роли

Хотя мое предположение было правильным, что наборы разрешений определены как роли, у них есть доверительные отношения, которые не были распространены на моего главного пользователя-администратора (мое плохое), И его нельзя изменить, так как он был создан AWS автоматически и заблокирован.

  1. Предоставлять разрешения вручную

Итак, хотя я могу предоставить группе разрешения на выполнение роли программно через Terraform, мне нужно вручную создать роль в целевой учетной записи, которая расширяет доверие и, следовательно, разрешения для основной учетной записи.

Другие вопросы по тегам