Динамическое назначение ролей в Azure с Terraform

Вопрос или проблема

Я хочу динамически создавать Azure Key Vault и выполнять назначение ролей на основе YAML конфигурационного файла. Формат YAML файла следующий:

kv1:
  - "[email protected]"
  - "[email protected]"
kv1:
  - "[email protected]"
  - "[email protected]"

Это дает мне карту Terraform в следующем формате:

{
  "kv1" = [
    "[email protected]",
    "[email protected]",
  ]
  "kv2" = [
    "[email protected]",
    "[email protected]",
  ]
}

На данный момент у меня есть следующее для создания различных ключевых хранилищ:

locals {
  key_vault_config = yamldecode("${file("../keyvaults.yaml")}")
}

data "azurerm_resource_group" "rg" {
  name = local.resource_group_name
}

resource "azurerm_key_vault" "this" {
  for_each                   = local.key_vault_config
  name                       = each.key
  location                   = data.azurerm_resource_group.rg.location
  resource_group_name        = data.azurerm_resource_group.rg.name
  enable_rbac_authorization  = true
  ...
}

Теперь мне нужно каким-то образом динамически добавить правильных пользователей к правильным ключевым хранилищам, используя azuread_user/azuread_users и azurerm_role_assignment, но я не знаю, как это сделать. У пользователей должна быть роль role_definition_name = "Key Vault Administrator", для одного ключевого хранилища/пользователя это будет выглядеть следующим образом:

data "azuread_user" "this" {
  user_principal_name = each.value.email
}

resource "azurerm_role_assignment" "this" {
  scope                = azurerm_key_vault.this.id
  role_definition_name = "Key Vault Administrator"
  principal_id         = azuread_user.this.object_id
}

Ответ или решение

Для динамического назначения ролей пользователям в Azure при использовании Terraform и на основе конфигурационного файла в формате YAML, вам необходимо выполнить несколько шагов. Давайте проанализируем ваш код и завершим функциональность, чтобы корректно создать хранилища ключей и назначить пользователям подходящие роли.

1. Парсинг YAML конфигурации

Вы уже правильно используете yamldecode, чтобы прочитать конфигурацию ключевых хранилищ из файла keyvaults.yaml. Это создаёт локальную переменную local.key_vault_config, которая содержит мапу ключевых хранилищ и связанных с ними пользователей.

2. Создание ключевых хранилищ

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

3. Динамическое назначение ролей

Теперь мы добавим динамическое назначение ролей для каждого пользователя. Вам нужно будет использовать два цикла: один для создания ключевых хранилищ, и другой для назначения ролей конкретным пользователям в соответствии с вашим YAML-файлом. Пример кода ниже:

locals {
  key_vault_config = yamldecode(file("../keyvaults.yaml"))
}

data "azurerm_resource_group" "rg" {
  name = local.resource_group_name
}

resource "azurerm_key_vault" "this" {
  for_each                  = local.key_vault_config
  name                      = each.key
  location                  = data.azurerm_resource_group.rg.location
  resource_group_name       = data.azurerm_resource_group.rg.name
  enable_rbac_authorization = true
  ...
}

# Динамическое назначение ролей пользователям
resource "azurerm_role_assignment" "this" {
  for_each = {
    for kv, users in local.key_vault_config : kv => users
  }

  principal_id         = azuread_user.this[each.value].object_id
  role_definition_name  = "Key Vault Administrator"
  scope                = azurerm_key_vault.this[each.key].id
}

# Получение данных пользователей
data "azuread_user" "this" {
  for_each = toset(flatten([
    for kv, users in local.key_vault_config : [
      for user in users : {
        kv   = kv
        email = user
      }
    ]
  ]))

  user_principal_name = each.value.email
}

Пояснения к коду:

  1. Циклы – Мы используем for_each для перебора пары ключ-значение в вашей конфигурации ключевых хранилищ и их пользователях.

  2. Получение данных пользователей – В секции data "azuread_user" "this" мы создаем набор пользователей, используя логическую конструкцию, чтобы создать уникальный id для каждого пользователя, связанного с конкретным ключевым хранилищем.

  3. Назначение ролей – Мы связываем principal_id с конкретным пользователем и применяем его к scope, который будет соответствовать текущему ключевому хранилищу.

Проверьте на соответствие:

  • Убедитесь, что в вашем YAML-файле правильно указаны адреса электронной почты пользователей.
  • Убедитесь, что пользователи существуют в Azure AD перед выполнением Terraform.

Этот подход обеспечит динамическое создание хранилищ ключей в Azure и назначения ролей каждому пользователю в соответствии с их соответствующими хранилищами.

Оцените материал
Добавить комментарий

Капча загружается...