Use constants in Azure Bicep to simplify your IaC life.

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.