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.
Оказывается, здесь было несколько проблем:
- Профиль
Профиль учетных данных неверен. Установка правильных кредитов в Env Vars позволила мне запустить простой тест, когда просто использование файла creds не удалось. Здесь все еще есть проблема, я не понимаю, так как обновление файла creds также не удалось, но у меня есть работающая система.
- AWS созданные роли
Хотя мое предположение было правильным, что наборы разрешений определены как роли, у них есть доверительные отношения, которые не были распространены на моего главного пользователя-администратора (мое плохое), И его нельзя изменить, так как он был создан AWS автоматически и заблокирован.
- Предоставлять разрешения вручную
Итак, хотя я могу предоставить группе разрешения на выполнение роли программно через Terraform, мне нужно вручную создать роль в целевой учетной записи, которая расширяет доверие и, следовательно, разрешения для основной учетной записи.