Доступ / ссылки на ресурсы, созданные for_each

#azure #terraform #terraform-provider-azure

#azure #terraform #terraform-provider-azure

Вопрос:

В настоящее время я пытаюсь создать несколько azurerm_role_definition с их соответствующими azurerm_role_assignment для всех моих подписок. Я хочу делать это динамически, а не жестко со subscription_id значениями. Я могу создать создать карту subscriptions_map , а затем с for_each помощью create azurerm_role_defitions (ов). Однако теперь мне нужно ссылаться на определения в azurerm_role_assignment . Каков наилучший подход для этого?

 
# Configure the Microsoft Azure Provider
provider "azurerm" {
  features {}
}

# AD App
resource "azuread_application" "test-app" {
  display_name = "test-app"
}

# Service Principal
resource "azuread_service_principal" "test-app" {
  application_id = azuread_application.test-app.application_id
}

# Available subscriptions
data "azurerm_subscriptions" "available" {
}

locals {
  subscriptions_map = {
    for obj in data.azurerm_subscriptions.available.subscriptions.* : obj.display_name => obj
  }
}

# Role definition 
resource "azurerm_role_definition" "test-app" {
  for_each           = local.subscriptions_map
  role_definition_id = "00000000-0000-0000-0000-000000000000"
  name               = "custom-role-definition-${each.value.display_name}"
  scope              = each.value.id
  
  permissions {
    actions     = ["Microsoft.Resources/subscriptions/resourceGroups/read"]
    not_actions = []
  }

  assignable_scopes = [
    each.value.id,
  ]
}

# Role assignment 
resource "azurerm_role_assignment" "test-app" {
  for_each           = local.subscriptions_map
  name               = "00000000-0000-0000-0000-000000000000"
  scope              = each.value.id

  #Help here
  role_definition_id = azurerm_role_definition.test-app.*.role_definition_resource_id
  
  principal_id       = azuread_service_principal.test-app.object_id
}

 

Ответ №1:

Поскольку вы использовали for_each in azurerm_role_definition.test-app , вы можете ссылаться на отдельные определения, созданные по имени ключа. Так что ваш azurerm_role_assignment.test-app может быть:

 # Role assignment 
resource "azurerm_role_assignment" "test-app" {

  for_each           = local.subscriptions_map

  name               = "00000000-0000-0000-0000-000000000000"
  scope              = each.value.id

  #Help here
  role_definition_id = azurerm_role_definition.test-app[each.key].role_definition_resource_id
  
  principal_id       = azuread_service_principal.test-app.object_id
}