When using Bicep to assign Azure RBAC roles, make roleAssignments deterministic and correct by:
.id (avoid brittle string concatenation).Example pattern:
resource roleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
scope: subscription()
name: '43d0d8ad-25c7-4714-9337-8ba259a9fe05' // role definition GUID
}
resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
name: 'id-${uniqueString(resourceGroup().id)}'
location: resourceGroup().location
}
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(managedIdentity.properties.principalId, roleDefinition.id, resourceGroup().id)
scope: resourceGroup() // make scope explicit
properties: {
roleDefinitionId: roleDefinition.id
principalId: managedIdentity.properties.principalId
principalType: 'ServicePrincipal'
}
}
Apply this consistently anywhere you create roleAssignments (storage, Key Vault, Digital Twins, etc.) to prevent duplicate/conflicting assignments and reduce deployment flakiness.