Terraform: Как лучше всего выполнить цикл по набору каталогов и применить блок ace gen2 с поиском azure ad для каждой итерации

#azure #azure-active-directory #terraform #terraform-provider-azure

Вопрос:

Я никоим образом не эксперт по терраформированию, так что это может быть технически невозможно.

Мой вариант использования: у меня есть файловая система adls gen2, и мне нужно создать каталоги в этой файловой системе. Каталоги, очевидно, будут иметь короткое имя, и к каждому из них должен быть применен блок ace (acl). Я хочу каким-то образом связать имя каталога с группой azure ad, где я могу затем выполнить поиск группы с помощью источника данных azuread_group и получить идентификатор объекта группы, чтобы применить его к новому каталогу.

Я попытаюсь описать, что я пытаюсь сделать:

 dir_group_assoc = {
  "folder_name_1": "Azure AD Group 1",
  "folder_name_2": "Azure AD Group 2"
}

data "azuread_group" "group-name" {
  display_name = "Azure AD Group *" <-- replaced with the value from above K/V pair.
}

resource "azurerm_storage_data_lake_gen2_path" "sftp-root-subdirs" {
  for_each           = toset(["keys from K/V pair above"])
  path               = each.key
  filesystem_name    = azurerm_storage_data_lake_gen2_filesystem.sftp-root.name
  storage_account_id = azurerm_storage_account.working-storage_account.id
  resource           = "directory"

  ace {
    scope       = "access"
    type        = "group"
    permissions = "rwx"
    id          = data.azurerm_client_config.current_client_config.object_id["value from K/V pair above"]
  }
}
 

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

Ответ №1:

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

 variable "folder-ad-group" {
  type = map(string)
  default = {
    "folder_name_1" = "Azure AD Group 1",
    "folder_name_2" = "Azure AD Group 2"
  }
}

data "azuread_group" "ad-group-lookup" {
  for_each     = var.folder-ad-group
  display_name = lookup(var.folder-ad-group, each.key)
}

resource "azurerm_storage_data_lake_gen2_filesystem" "data-lake-sftp-path" {
  for_each           = data.azuread_group.ad-group-lookup
  name               = each.key
  storage_account_id = azurerm_storage_account.working-storage_account.id

  ace {
    scope       = "access"
    type        = "group"
    id          = lookup(data.azuread_group.ad-group-lookup, each.key).object_id
    permissions = "rwx"
  }
}
 

И мой результат был именно таким, как вы и ожидали. Блоки ТУЗА выглядели так:

   # azurerm_storage_data_lake_gen2_filesystem.data-lake-sftp-path["folder_name_1"] will be created
    resource "azurerm_storage_data_lake_gen2_filesystem" "data-lake-sftp-path" {
        id                 = (known after apply)
        name               = "folder_name_1"
        storage_account_id = "super subscription"

        ace {
            id          = "object_id_of_azure_ad_group_1"
            permissions = "rwx"
            scope       = "access"
            type        = "group"
        }
    }

  # azurerm_storage_data_lake_gen2_filesystem.data-lake-sftp-path["folder_name_2"] will be created
    resource "azurerm_storage_data_lake_gen2_filesystem" "data-lake-sftp-path" {
        id                 = (known after apply)
        name               = "folder_name_2"
        storage_account_id = "super subscription"

        ace {
            id          = "object_id_of_azure_ad_group_2"
            permissions = "rwx"
            scope       = "access"
            type        = "group"
        }
    }