Гид по технологиям

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

• 6 min read • DevOps • Обновлено 21 Nov 2025
Terraform: создать IAM роль в AWS
Terraform: создать IAM роль в AWS

Диаграмма процесса создания и присвоения IAM-роли с Terraform

Введение

В этой статье мы разберём создание роли IAM (Identity and Access Management) в AWS с использованием Terraform. Предполагается, что у вас есть базовые знания Terraform и концепций IAM. Если вы хотите изучить IAM глубже, обратитесь к официальной документации AWS.

Кратко: роль IAM — это сущность, которой можно делегировать права для выполнения операций в AWS; роль может приниматься другими аккаунтами, сервисами или пользователями через sts:AssumeRole.

Важно: храните access_key и secret_key в безопасном месте. В продакшне используйте подходы с краткоживущими секретами или профилями экземпляров (instance profile) вместо долговременных ключей в файлах.

H2: Предварительные требования

  1. Базовые знания Terraform.
  2. Установленный Terraform на вашей машине.
  3. AWS-аккаунт.
  4. Access key и Secret key от пользователя IAM с правами, достаточными для создания ролей и привязки политик.

Примечание: в примерах ниже используется регион eu-west-3, замените на свой по необходимости.

Что мы сделаем

  1. Напишем Terraform-конфигурации для создания IAM роли.
  2. Применим конфигурации, чтобы создать роль в AWS.
  3. При необходимости удалим созданную роль с помощью 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 корректны и имеют нужные привилегии.

  1. Инициализация провайдера:

terraform init

Эта команда загрузит плагин провайдера AWS.

  1. Просмотр плана изменений:

terraform plan

  1. Применение изменений (создание ресурсов):

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 для создания роли

  1. Подготовить директорию и файлы (main.tf, variables.tf, terraform.tfvars).
  2. Заполнить terraform.tfvars и не коммитить его в VCS.
  3. Выполнить terraform init → terraform plan.
  4. Просмотреть план, подтвердить изменения, выполнить terraform apply.
  5. Проверить создание роли в консоли IAM.
  6. Добавить запись о созданной роли в инвентарь ресурсов.
  7. При необходимости удалить через 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.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро