Use constants in Azure Bicep to simplify your IaC life.
Azure is an ecosystem full of constants, identifiers, IDs or role definitions. Unfortunately, ARM and Bicep do not provide as much support as they could.
So you have to become active yourself, as bitter as it sounds.
Json Files
Bicep allows via loadJsonContent the possibility to use the contents of Json files to make them available in Bicep.
So if I want to access a RoleID, I can store it flat in a json.
// roleids.json
{
"Contributor": "b24988ac-6180-42a0-ab88-20f7382dd24c",
}
This can now be loaded and used.
var roleIds = loadJsonContent('../roleids.json')
module rbac 'services/rbac.bicep' = {
name: 'appconfig-rbac-${envName}'
params: {
appConfigName: appConfig.outputs.name
roleId: roleIds.Contributor
type: 'ServicePrincipal'
}
}
Module Outputs
The alternative is to declare a separate module with static outputs.
output Contributor string = 'b24988ac-6180-42a0-ab88-20f7382dd24c'
This module can now be called.
module roleConstants './services/builtInRoles.bicep' = {
name: 'roleConstants-${envName}'
}
And be addressed as a module in Bicep as usual
module rbac 'services/rbac.bicep' = {
name: 'appconfig-rbac-${envName}'
params: {
appConfigName: appConfig.outputs.name
roleId: roleConstants.outputs.Contributor
type: 'ServicePrincipal'
}
}
As can be seen: Simplifications are possible.
But I agree with all the people who say that this should have been implemented by Microsoft instead of everyone having to do it themselves.
But maybe that will come - eventually.