Azure Bicep is a domain-specific language (DSL) designed for deploying and managing Azure resources. It offers several advantages, including a more concise syntax compared to ARM templates, improved readability, enhanced maintainability, and a gentler learning curve.
How Does it Work?
A Bicep file is automatically converted into an ARM template (JSON) when a deployment is submitted to Azure.
Pre-requisites
Ensure you have an Azure Account
Install Azure CLI
Install Bicep CLI (az bicep install)
Check out our Getting Started with ARM Templates guide if you’re unfamiliar with the basics of ARM templates.
Resources
The syntax for defining a resource is:
<resource-properties>
}
To define a resource, use the resource keyword followed by:
<symbolic-name>: The symbolic name isn’t the same as the resource name, and it is used to reference the resource in other sections of your Bicep file.
<full-type-name> and <api-version>: For the available resource types and versions, see Bicep resource reference.
<resource-properties>: name and location are properties that can be found in nearly every resource. After setting those values, we need to set the properties that are specific to the resource type we are using.
Create a main.bicep file with the following content:
name: ‘myuniquestorage001‘
location: resourceGroup().location
kind: ‘StorageV2‘
sku: {
name: ‘Standard_GRS’
}
}
Execute the command az group create -l eastus -n MyResourceGroup to create the resource group where our resources will be stored. Afterward, run the following command:
Parameters
The syntax for defining a parameter is:
param <parameter-name> <parameter-data-type> = <default-value>
To define a parameter, use the param keyword followed by:
<parameter-name>: The name of the parameter. It cannot have the same name as a variable, resource, output, or another parameter in the same scope.
<parameter-type>: We can find the complete list of data types here.
<default-value>: The default value is used when a value is not supplied during deployment.
<decorator-name>: Parameters use decorators for constraints or metadata. The list of decorators can be found here.
Update the main.bicep file with the following content:
param storageAccountName string = ‘myuniquestorage001‘@description(‘storage account location’)
param location string = resourceGroup().locationresource storageAccount ‘Microsoft.Storage/storageAccounts@2022-09-01‘ = {
name: storageAccountName
location: location
kind: ‘StorageV2‘
sku: {
name: ‘Standard_GRS’
}
}
To pass inline parameters, you can execute a command like this:
Variables
The syntax for defining a variable is:
To define a variable, use the var keyword followed by:
<variable-name>: A variable cannot share the same name as a parameter, module, or resource.
<variable-value>: Note that we do not need to specify a data type for the variable. The type is inferred from the value provided.
Update the main.bicep file using the following content:
param storageAccountPrefix string@description(‘storage account location’)
param location string = resourceGroup().locationvar storageAccountName = ‘${toLower(storageAccountPrefix)}${uniqueString(resourceGroup().id)}‘resource storageAccount ‘Microsoft.Storage/storageAccounts@2022-09-01‘ = {
name: storageAccountName
location: location
kind: ‘StorageV2‘
sku: {
name: ‘Standard_GRS’
}
}
Execute the following command:
Outputs
The syntax for defining an output is:
To define a variable, use the output keyword followed by:
<output-name>: An output can have the same name as a parameter, variable, module, or resource.
<output-data-type>: Can use the same data types of the parameters.
<output-value>: The value we want to expose.
Update the main.bicep file with the content provided below:
param storageAccountPrefix string@description(‘storage account location’)
param location string = resourceGroup().locationvar storageAccountName = ‘${toLower(storageAccountPrefix)}${uniqueString(resourceGroup().id)}‘resource storageAccount ‘Microsoft.Storage/storageAccounts@2022-09-01‘ = {
name: storageAccountName
location: location
kind: ‘StorageV2‘
sku: {
name: ‘Standard_GRS’
}
}output endpoints object = storageAccount.properties.primaryEndpoints
Execute the following command to deploy the resource and filter the output (How to query Azure CLI command output using a JMESPath query):
In conclusion, by understanding the core concepts of resources, parameters, variables, and outputs, you can effectively leverage Bicep to streamline your Azure deployments and make your infrastructure as code more accessible and maintainable. We encourage you to check the official documentation here to explore the full potential of this tool. Thanks, and happy coding.