Создание IAM роли в AWS с помощью Terraform

Введение
В этой статье мы разберём создание роли IAM (Identity and Access Management) в AWS с использованием Terraform. Предполагается, что у вас есть базовые знания Terraform и концепций IAM. Если вы хотите изучить IAM глубже, обратитесь к официальной документации AWS.
Кратко: роль IAM — это сущность, которой можно делегировать права для выполнения операций в AWS; роль может приниматься другими аккаунтами, сервисами или пользователями через sts:AssumeRole.
Важно: храните access_key и secret_key в безопасном месте. В продакшне используйте подходы с краткоживущими секретами или профилями экземпляров (instance profile) вместо долговременных ключей в файлах.
H2: Предварительные требования
- Базовые знания Terraform.
- Установленный Terraform на вашей машине.
- AWS-аккаунт.
- Access key и Secret key от пользователя IAM с правами, достаточными для создания ролей и привязки политик.
Примечание: в примерах ниже используется регион eu-west-3, замените на свой по необходимости.
Что мы сделаем
- Напишем Terraform-конфигурации для создания IAM роли.
- Применим конфигурации, чтобы создать роль в AWS.
- При необходимости удалим созданную роль с помощью terraform destroy.
Подготовка директории и файлов
Создайте отдельную директорию и перейдите в неё:
mkdir terraform cd terraform
Используйте любой удобный редактор (vim, VS Code, nano) и создайте три файла: variables.tf, terraform.tfvars и main.tf.
main.tf — конфигурация провайдера и ресурсы
Создайте файл main.tf. В нём настраивается провайдер AWS, формируется документ политики assume role и создаётся ресурс aws_iam_role с привязками политик.
vim main.tf
provider "aws" {
region = "${var.region}"
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
}
data "aws_iam_policy_document" "cross_account_assume_role_policy" {
statement {
effect = "Allow"
principals {
type = "AWS"
identifiers = var.principal_arns
}
actions = ["sts:AssumeRole"]
}
}
resource "aws_iam_role" "cross_account_assume_role" {
name = var.name
assume_role_policy = data.aws_iam_policy_document.cross_account_assume_role_policy.json
}
resource "aws_iam_role_policy_attachment" "cross_account_assume_role" {
count = length(var.policy_arns)
role = aws_iam_role.cross_account_assume_role.name
policy_arn = element(var.policy_arns, count.index)
}Объяснение ключевых аргументов:
- assume_role_policy — политика, разрешающая другой сущности принимать роль (sts:AssumeRole).
- policy_arn — ARN управляемой политики, которую нужно прикрепить к роли.
variables.tf — объявление переменных
Создайте variables.tf и объявите переменные, которые использует main.tf.
vim variables.tf
variable "access_key" {
description = "Access key to AWS console"
}
variable "secret_key" {
description = "Secret key to AWS console"
}
variable "region" {
description = "Region of AWS VPC"
}
variable "name" {
default = "myrole"
type = "string"
description = "The name of the role. "
}
variable "principal_arns" {
default = ["123456789012"]
type = list(string)
description = "ARNs of accounts, groups, or users with the ability to assume this role."
}
variable "policy_arns" {
default = ["arn:aws:iam::aws:policy/AdministratorAccess"]
type = list(string)
description = "List of ARNs of policies to be associated with the created IAM role"
}Пояснение переменных:
- principal_arns — список идентификаторов (ARN) аккаунтов, групп или пользователей, которым разрешено assume роли. Можно передать несколько.
- policy_arns — список ARN управляемых политик, которые будут прикреплены к роли. По умолчанию в примере используется AdministratorAccess.
Примечание безопасности: в большинстве случаев назначать AdministratorAccess не рекомендуется. Используйте принцип наименьших привилегий — присваивайте только те права, которые действительно нужны.
terraform.tfvars — значения переменных
Файл terraform.tfvars содержит конкретные значения для region, access_key и secret_key. Не храните чувствительные данные в репозиториях.
vim terraform.tfvars
region = "eu-west-3"
access_key = "AKIAQ6GAIA5XFLXF6HOV"
secret_key = "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"После создания у вас должны быть три файла: variables.tf, terraform.tfvars и main.tf.
H2: Применение конфигурации — init, plan, apply
Перед выполнением команд убедитесь, что access_key и secret_key корректны и имеют нужные привилегии.
- Инициализация провайдера:
terraform init
Эта команда загрузит плагин провайдера AWS.
- Просмотр плана изменений:
terraform plan
- Применение изменений (создание ресурсов):
terraform apply
После успешного выполнения вы увидите, что были добавлены новые ресурсы. Проверьте консоль AWS → IAM → Roles, чтобы убедиться, что роль создана.
Удаление ресурсов
Если роль больше не нужна, выполните:
terraform destroy
Эта команда удалит все ресурсы, описанные в конфигурации.
Когда такой подход не подходит (контрпримеры)
- Многоаккаунтные среды с централизованным управлением прав: лучше использовать Terraform-модули и центральные политики, а не вручную создавать роли в каждом аккаунте.
- Если требуется временный доступ на уровне конкретной сессии — рассмотрите использование AWS STS и временных токенов вместо постоянных ключей.
- Если вы используете CI/CD, хранение access_key/secret_key в terraform.tfvars не подходит; лучше передавать учётные данные через провайдер и окружение CI (secrets, AWS profiles, OIDC).
Альтернативные подходы
- Использовать aws_iam_role и aws_iam_policy_resource (встраиваемые политики) вместо прикрепления управляемых политик.
- Создать Terraform-модуль, который инкапсулирует роль и стандартные политики для повторного использования.
- Управлять правами через Infrastructure-as-Code другого формата (CloudFormation, Pulumi) если это требуется организацией.
Модель мышления и эвристики
- Принцип наименьших привилегий: разграничивайте права по задачам.
- Разделение обязанностей: администратор создаёт роли, разработчики используют роли через assume.
- Идём от минимального к максимальному: сначала тестовая роль с ограниченными правами, затем расширение по мере необходимости.
Чек-листы по ролям (по ролям в организации)
Для разработчика:
- Роль с правами чтения на S3 и чтения/записи в тестовые ресурсы.
- Ограничение доступа к продовым аккаунтам.
- Журналирование действий (CloudTrail).
Для операционной команды (ops):
- Ограниченные права на инстансы, ведение логов, перезапуск сервисов.
- MFA для выполнения критичных операций.
Для безопасности (security):
- Доступ только к сервисам мониторинга и расследования.
- Отдельный набор прав для аудита.
Процедура (SOP) — быстрый playbook для создания роли
- Подготовить директорию и файлы (main.tf, variables.tf, terraform.tfvars).
- Заполнить terraform.tfvars и не коммитить его в VCS.
- Выполнить terraform init → terraform plan.
- Просмотреть план, подтвердить изменения, выполнить terraform apply.
- Проверить создание роли в консоли IAM.
- Добавить запись о созданной роли в инвентарь ресурсов.
- При необходимости удалить через terraform destroy.
Критерии приёмки
- Роль создана и отображается в AWS Console → IAM → Roles.
- assume_role_policy содержит ожидаемые principal_arns и разрешение sts:AssumeRole.
- У роли прикреплены ожидаемые policy_arns.
- Вся конфигурация находится под контролем версий (кроме секретов) и соответствует требованиям безопасности.
Тесты и случаи приёмки
- Тест 1: Попытаться выполнить sts:AssumeRole из аккаунта, указанного в principal_arns — ожидание: успех.
- Тест 2: Попытаться выполнить sts:AssumeRole из неразрешённого аккаунта — ожидание: отказ.
- Тест 3: Проверить, что привязанные политики дают доступ, ожидаемый командой (например, список S3-бакетов).
Отладка — распространённые ошибки и решения
- AccessDenied при применении terraform: убедитесь, что access_key/secret_key имеют права iam:CreateRole и iam:AttachRolePolicy.
- Ошибка формата JSON в assume_role_policy: проверьте data.aws_iam_policy_document и не добавляйте лишние символы.
- Политика не прикрепилась: проверьте правильность ARN в policy_arns.
Безопасность и усиление защиты
- Избегайте AdministratorAccess в большинстве случаев.
- Используйте управляемые политики с минимальным набором прав.
- Храните секреты в менеджерах секретов (AWS Secrets Manager, Vault) или используйте IAM Roles for Service Accounts/Instance Profiles.
- Включите CloudTrail и держите логи действий по IAM.
Пример вариации: роль для кросс-аккаунтного доступа (ReadOnly)
Если вам нужна роль только для чтения в другом аккаунте — замените policy_arns на:
policy_arns = ["arn:aws:iam::aws:policy/ReadOnlyAccess"]И в principal_arns укажите ARN аккаунта или конкретного пользователя.
Мини-шаблон (чеклист файлов)
- main.tf — провайдер, aws_iam_policy_document, aws_iam_role, aws_iam_role_policy_attachment
- variables.tf — объявление переменных
- terraform.tfvars — значения переменных (не коммитить в публичные репозитории)
- .gitignore — добавить terraform.tfvars и файлы с секретами
Краткий словарь (1-строчная глоссарий)
- IAM Role — сущность, которая при даёт временные полномочия для выполнения действий в AWS.
- ARN — Amazon Resource Name, уникальный идентификатор ресурса.
- sts:AssumeRole — операция, позволяющая принять роль и получить временные креденшалы.
Дополнительно — диаграмма потока (Mermaid)
flowchart LR
A[Пользователь в аккаунте A] -->|sts:AssumeRole| B[Роль в аккаунте B]
B --> C[AWS ресурсы с привилегиями роли]
subgraph Terraform
D[main.tf]
E[variables.tf]
F[terraform.tfvars]
end
D -->|apply| BЗаключение
В статье мы прошли полный цикл: подготовка файлов конфигурации Terraform, создание IAM роли с привязкой политик, проверка результата в AWS Console и удаление ресурса. Также рассмотрены примеры альтернатив, рекомендации по безопасности, чек-листы и критерии приёмки.
Ключевые рекомендации:
- Не назначайте AdministratorAccess по умолчанию.
- Храните секреты безопасно и используйте временные креденшалы.
- Интегрируйте роли в процессы CI/CD через безопасные механизмы доставки секретов.
Спасибо за чтение. При возникновении ошибок внимательно проверяйте права учетной записи, синтаксис JSON в политиках и корректность ARN.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента