Organizing Resource Deployments Using Bicep

Bicep modules

In the realm of cloud infrastructure management, efficient organization and deployment of resources are paramount. With Bicep modules, we can take resource deployment to the next level by organizing and simplifying our deployments. In this article, we will explore how Bicep modules can improve the readability, reusability, and maintainability of our infrastructure as code.

When working with Bicep, we often come across complex deployment scenarios that require multiple resources to be provisioned together. Bicep modules allow us to encapsulate these deployment details into reusable components, making our code more modular and easier to understand.

This is a new series of articles about ‘BiCep’ technology by Microsoft – it is a game changer for resource management in the cloud – well worth investigating if you are a cloud builder!

Key Takeaways:

  • Bicep modules enable the organization and encapsulation of deployment details.
  • Modules can be easily reused for different deployments.
  • Modules can be shared with others through template specs or registries.
  • Dependent modules can be defined using the dependsOn property.
  • Modules can be deployed conditionally and iteratively for more flexibility.

Creating Bicep Modules

In Bicep, modules are a powerful way to organize and encapsulate deployment details, making your resource deployments more manageable and reusable. Let’s explore the syntax, path, and parameters involved in creating Bicep modules.

Module Syntax

When defining a Bicep module, you use the module syntax, which includes the symbolic name, module path, and optional parameters. The module syntax looks like this:

module symbolicName = {
path =

The symbolicName is a symbolic representation of the module and will be used to reference the module in other parts of your Bicep file. The modulePath specifies the location of the module file, which can be a local file or a file in a module registry. Let’s explore the module path in more detail.

Module Path

The module path represents the location of the module file. It can be specified as a local file or a file in a registry, such as the public module registry or a private registry. Here’s how you can define the module path:

  1. If the module file is a local file, you can use a relative path. For example:

path = “./modules/myModule.bicep”

  1. If the module file is in the public module registry, you can use the predefined alias ‘br/public’. For example:

path = “br/public/myModule”

  1. If the module file is in a private module registry, you can use the following syntax:

path = “”

Replace registryName with the name of your private registry. Now that you understand how to define the module path, let’s explore module parameters.

Module Parameters

Parameters in a Bicep module allow you to pass values from the parent Bicep file to the module. They help customize and configure the behavior of the module based on your requirements. To define parameters in a Bicep module, you can use the following syntax:

param parameterName type = defaultValue

The parameterName represents the name of the parameter, the type defines the data type for the parameter, and the defaultValue sets the default value if no value is provided from the parent Bicep file.

With module syntax, module paths, and parameters, you have the building blocks to create and reference Bicep modules effectively. By leveraging modules, you can simplify your deployments and promote reusability across different projects.

Benefit Description
Modularity Break down complex deployments into manageable modules, improving readability and maintainability.
Reusability Easily reuse modules across different deployments, saving time and effort.
Parameterization Customize module behavior by passing parameters from the parent Bicep file.

Now that we have a clear understanding of module creation, let’s move on to Section 3 to explore module deployment and configuration.

Module Deployment and Configuration

When deploying modules in Bicep, there are various configuration options available to ensure smooth and efficient deployment of resources. Let’s explore some of these options:

Parallel Deployment and Dependencies

By default, modules are deployed in parallel, optimizing the deployment process and reducing overall deployment time. However, if a module has dependencies on other modules or resources, these dependencies can be explicitly defined using the dependsOn property in the module definition. This ensures that the dependent modules or resources are deployed before the current module.

Conditional Deployment

In some cases, you may want to deploy a module conditionally based on certain criteria. Bicep allows for conditional deployment using the if expression. By utilizing this expression, you can control whether a module gets deployed based on specific conditions, such as environment variables or parameters.

Iterative Deployment with Batch Size

In certain scenarios, you may need to deploy multiple instances of a module, such as when deploying resources across different regions or environments. Bicep provides the for expression with the batchSize decorator, allowing you to specify the number of instances to be deployed at once. This iterative deployment approach gives you greater flexibility and control over the deployment process.

Scope of Modules

The scope of a module refers to its deployment scope, which can be different from the main Bicep file’s scope. By adding the scope property to the module definition, you can specify where the module should be deployed. This allows you to deploy modules to different scopes within your Azure environment, providing a more granular and targeted deployment strategy.

Module deployment in Bicep offers flexibility and control over how resources are deployed. By utilizing these configuration options, you can optimize your deployment process, manage dependencies effectively, and ensure smooth resource provisioning in Azure.

Path to Module

In Bicep, a module can be sourced from different locations, depending on the specific deployment requirements and preferences. These locations include:

  • Local File: A module can be stored as a local file, allowing for easy access and management within the same directory as the main Bicep file. To reference a local module, the module path is specified using a relative path, indicating the file’s location on the local filesystem.
  • Public Module Registry: Bicep provides a public module registry, which serves as a centralized repository for storing and sharing modules. Modules hosted in the public registry can be accessed by specifying the predefined alias ‘br/public’ as the module path. This allows users to easily leverage community-contributed modules and maintain consistency across multiple deployments.
  • Private Module Registry: For organizations that require greater control and privacy over their modules, Bicep supports private module registries. These registries can be hosted on Azure Container Registry (ACR) or other private repositories. To reference modules from a private registry, the module path is specified using the ‘’ scheme, allowing for secure and controlled access to modules.
  • Template Spec: Bicep also provides integration with Azure Template Specs, which define a specific versioned template and its associated artifacts. Template specs are referenced using the ‘ts://:’ syntax, providing a way to source modules directly from a template spec and ensuring consistent and controlled deployment across environments.

“Bicep offers flexibility in sourcing modules from various locations, allowing users to choose the most suitable approach based on their deployment needs and organizational requirements.”

The table below summarizes the different paths to modules and their corresponding specifications:

Module Location Module Path Format
Local File Relative path to the module file
Public Module Registry br/public
Private Module Registry br:<registry-name>
Template Spec ts:<sub-id>/<rg-name>/<template-spec-name>:<version>

By leveraging these different module sourcing options, Bicep provides a flexible and efficient approach to building modular and reusable infrastructure deployments.


Bicep modules provide a powerful and efficient solution for organizing and simplifying resource deployments in Azure. By encapsulating deployment details and promoting reusability, these modules greatly enhance the maintainability and organization of infrastructure as code.

Whether you choose to utilize the module registry or template specs, Bicep modules offer a seamless deployment experience, contributing to a more efficient and scalable workflow. With Bicep modules, managing and deploying Azure resources becomes streamlined and easily manageable, allowing you to focus on other critical aspects of your projects.

By leveraging Bicep modules, your organization can achieve enhanced organization and maintainability, leading to improved collaboration among development teams. The modularity and encapsulation provided by Bicep modules enable different teams to work on specific modules, reducing the chances of conflicts and errors in resource deployment.

Overall, Bicep modules are a game-changer for resource deployment in Azure. With their ability to organize deployments, improve maintainability, and promote collaboration within your organization, Bicep modules are an indispensable tool for any organization seeking to optimize their infrastructure as code.


Right then, enough learning, go get cloud-lifting with Bicep 😀