Cloud can be tricky sometimes. Find out what scenarios we've ran into that are worth being mentioned and explained.
Have you encountered a DeploymentNotFound error when using Azure Bicep, despite your code being syntactically correct? This issue can be frustrating, especially when working with Bicep modules that have dependencies.
In this guide, we’ll explore:
• What causes the DeploymentNotFound error
• How Azure Resource Manager (ARM) processes Bicep files
• Why module dependencies create this issue
• Effective fixes using conditional logic and ternary expressions
_______________________________________________________________________________
Understanding the DeploymentNotFound Error
Scenario: Failing Bicep Deployment
Let’s assume we have a Bicep template that includes three modules:
✔ ModuleA – No dependencies, always deployed.
✔ ModuleB – Depends on ModuleA, deployed conditionally (parDeployModuleB).
✔ ModuleC – Depends on ModuleB, but ModuleB may not always be deployed.
Bicep Code with Conditional Deployment
param parDeployModuleB bool = false
module modA 'ModuleA.bicep' = {
name: 'deploy-module-a'
}
module modB 'ModuleB.bicep' = if (parDeployModuleB) {
name: 'deploy-module-b-${uniqueString(modA.name)}'
params: {
parUseModuleAOutputs: modA.outputs.outModuleA
}
}
module modC 'ModuleC.bicep' = {
name: 'deploy-module-c-${uniqueString(modB.name)}'
params: {
parUseModuleBOutputs: modB.outputs.outModuleB
}
}
Why Does This Fail?
{
"error": {
"code": "DeploymentNotFound",
"message": "Deployment 'deploy-module-b-xyz123' could not be found."
}
}
How Azure Resource Manager (ARM) Processes Bicep Modules
az bicep build --file main.bicep
"parameters": {
"parUseModuleBOutputs": {
"value": "[reference(resourceId('Microsoft.Resources/deployments', format('deploy-module-b-{0}', uniqueString('deploy-module-a'))), '2020-10-01').outputs.outModuleB.value]"
}
}
param parDeployModuleB bool = false
module modB 'ModuleB.bicep' = {
name: 'deploy-module-b-${uniqueString(modA.name)}'
params: {
parUseModuleAOutputs: modA.outputs.outModuleA
}
}
Why This Works:
module modC 'ModuleC.bicep' = {
name: 'deploy-module-c-${uniqueString(modB.name)}'
params: {
parUseModuleBOutputs: parDeployModuleB ? modB.outputs.outModuleB : ''
}
}
Why This Works:
module modC 'ModuleC.bicep' = if (parDeployModuleB) {
name: 'deploy-module-c-${uniqueString(modB.name)}'
params: {
parUseModuleBOutputs: modB.outputs.outModuleB
}
}
🚨 This does NOT work! 🚨
param parDeployModuleB bool = false
module modA 'ModuleA.bicep' = {
name: 'deploy-module-a'
}
module modB 'ModuleB.bicep' = if (parDeployModuleB) {
name: 'deploy-module-b-${uniqueString(modA.name)}'
params: {
parUseModuleAOutputs: modA.outputs.outModuleA
}
}
module modC 'ModuleC.bicep' = {
name: 'deploy-module-c-${uniqueString(modB.name)}'
params: {
parUseModuleBOutputs: parDeployModuleB ? modB.outputs.outModuleB : ''
}
}