Вопрос или проблема
Я хочу динамически создавать 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
}
Пояснения к коду:
-
Циклы – Мы используем
for_each
для перебора парыключ-значение
в вашей конфигурации ключевых хранилищ и их пользователях. -
Получение данных пользователей – В секции
data "azuread_user" "this"
мы создаем набор пользователей, используя логическую конструкцию, чтобы создать уникальный id для каждого пользователя, связанного с конкретным ключевым хранилищем. -
Назначение ролей – Мы связываем
principal_id
с конкретным пользователем и применяем его кscope
, который будет соответствовать текущему ключевому хранилищу.
Проверьте на соответствие:
- Убедитесь, что в вашем YAML-файле правильно указаны адреса электронной почты пользователей.
- Убедитесь, что пользователи существуют в Azure AD перед выполнением Terraform.
Этот подход обеспечит динамическое создание хранилищ ключей в Azure и назначения ролей каждому пользователю в соответствии с их соответствующими хранилищами.