I had a problem recently where my Bicep templates were failing with an obscure error message:
The incoming request is not recognized as a namespace policy put request.
The Bicep in question was attempting to assign an Azure Service Bus topic subscription’s forwardTo to another queue.
I had ordered everything in the Bicep file correctly, i.e.
- Create the topic
- Create its subscriptions
- Create the queues
- Tell the topic subscription to forward messages to the queue
However, when I looked at the Deployments in the Azure Resource Group, it appeared that they weren’t running in the order I had specified:
This is because by default Bicep templates will run in parallel, unless it detects dependencies. And because my templates were a bit too clever with variables and modules, Bicep was unable to detect my implicit dependencies.
The fix then was to be explicit with my dependencies, using the dependsOn keyword:
// create service bus topics And subscriptions param topicsAndSubscriptions array = [ { topicName: 'property~changed~v1' // ~ is what Azure uses for a forward slash, so this topic is actually property/changed/v1 sanitizedName: 'property-changed' // Azure doesn't like ~ or / in deployment names. subscriptions: [ 'ozone' 'valor' ] } ] module serviceBusTopicsModule './serviceBusTopic.bicep' = [for item in topicsAndSubscriptions : { name: 'serviceBusTopic-${item.sanitizedName}-${deploymentNameSuffix}' params: { serviceBusName: serviceBusModule.outputs.serviceBusOutput.name topicName: item.topicName } }] module topicsSubscriptionModule 'serviceBusTopicSubscription.bicep' = [ for item in topicsAndSubscriptions: { name: 'topicSubscription-${item.sanitizedName}-${deploymentNameSuffix}' params: { serviceBusName: serviceBusModule.outputs.serviceBusOutput.name topicName: item.topicName subscriptions: item.subscriptions } dependsOn: serviceBusTopicsModule }] // Create service bus queues param queueSettings array = [ { name: 'ozone-property-changed-sbq' requiresDuplicateDetection: true } { name: 'valor-property-changed-sbq' requiresDuplicateDetection: false } ] module serviceBusQueueModule './serviceBusQueue.bicep' = { name: 'serviceBusQueue-${deploymentNameSuffix}' params: { serviceBusName: serviceBusModule.outputs.serviceBusOutput.name queueSettings: queueSettings } } module serviceBusTopicSubsciptionForwardModule './serviceBusTopicSubscriptionForward.bicep' = { name: 'serviceBusTopicSubsciptionForward-${deploymentNameSuffix}' params: { serviceBusName: serviceBusModule.outputs.serviceBusOutput.name topicName: 'property~changed~v1' subscriptionName: 'valor' queueName: 'valor-property-changed-sbq' } dependsOn: [serviceBusQueueModule, topicsSubscriptionModule] }