modules/role_assignments_for_policy/locals.tf (40 lines of code) (raw):
# The following locals are used to convert provided input
# variables to locals before use elsewhere in the module
locals {
policy_assignment_id = var.policy_assignment_id
scope_id = var.scope_id
principal_id = var.principal_id
role_definition_ids = distinct(var.role_definition_ids)
additional_scope_ids = var.additional_scope_ids
}
# Determine the list of Role Definitions to create per scope
locals {
role_assignment_path = "/providers/Microsoft.Authorization/roleAssignments/"
role_assignment_scopes = distinct(concat(
[local.scope_id],
local.additional_scope_ids,
))
role_definition_ids_by_scope = {
for scope in local.role_assignment_scopes :
scope => local.role_definition_ids
if scope != null
}
role_assignments = flatten([
for scope, role_definition_ids in local.role_definition_ids_by_scope :
[
for role_definition_id in role_definition_ids :
{
resource_id = "${scope}${local.role_assignment_path}${uuidv5(uuidv5(uuidv5("url", role_definition_id), local.policy_assignment_id), scope)}"
scope = scope
role_definition_id = role_definition_id
}
]
])
# Extract the scope from each Role Assignment ID (will only be associated with a single scope).
azurerm_role_assignments = {
for role_assignment in local.role_assignments :
(role_assignment.resource_id) => {
name = basename(role_assignment.resource_id)
scope = role_assignment.scope
principal_id = local.principal_id
role_definition_name = null
role_definition_id = role_assignment.role_definition_id
}
}
}