IaC - Azure Bicep - First steps

Infrastructure as a Code series. In this series, I’ll try to present all aspects of working with IaC, starting with preparation of the work environment.
Benefits of using Azure Bicep
- Simple syntax - if You are using JSON teplates You’ll see that Bicep is easier to read.
- Repeatable results - overtime You will use Your template You’ll see that results are deployed in a consistent manner.
- Modularity - You don’t need to build one big template - it can be split to modules that covers set of resources.
- Native integration with Azure
- No state or state files to manage
- It’s totally free
Tools
First template
Our first template will contain:
- Resource group
- Azure Virtual Network
main.bicep:
//scope of template
targetScope = 'subscription'
//parameters section
param location string
param rgName string
param vnetName string
param vnetAddrSpace string
param snet1AddrSpace string
param snet2AddrSpace string
param snet3AddrSpace string
//modules section
module resourceGroup1 'rg.bicep' = {
name: rgName
params: {
location: location
rgName: rgName
}
}
//reference to existing resource
resource resGrp 'Microsoft.Resources/resourceGroups@2021-04-01' existing = {
name: rgName
}
module vNetwork 'vnet.bicep' = {
name: rgName
scope: resGrp
params: {
location: location
vnetName: vnetName
vnetAddrSpace: vnetAddrSpace
snet1AddrSpace: snet1AddrSpace
snet2AddrSpace: snet2AddrSpace
snet3AddrSpace: snet3AddrSpace
}
}
rg.bicep:
//scope of template
targetScope = 'subscription'
//parameters section
param rgName string
param location string
//resources section
resource resGrp 'Microsoft.Resources/resourceGroups@2021-04-01' = {
name: rgName
location: location
}
net.bicep:
//parameters section
param vnetName string
param vnetAddrSpace string
param snet1AddrSpace string
param snet2AddrSpace string
param snet3AddrSpace string
param location string
//variables section
var snet2Name = 'AzureBastionSubnet'
var snet3Name = 'GatewaySubnet'
var snet1Name = 'default'
//resources section
resource vnet 'Microsoft.Network/virtualNetworks@2019-11-01' = {
name: vnetName
location: location
properties: {
addressSpace: {
addressPrefixes: [
vnetAddrSpace
]
}
subnets: [
{
name: snet1Name
properties: {
addressPrefix: snet1AddrSpace
}
}
{
name: snet2Name
properties: {
addressPrefix: snet2AddrSpace
}
}
{
name: snet3Name
properties: {
addressPrefix: snet3AddrSpace
}
}
]
}
}
How to run deployment?
Azure Cli:
az deployment sub create \
--name firstBicepDeployment \
--subscription 'xxxx-yyyyy-zzzz-yyyy' \
--template-file main.bicep \
--parameters param1=value1 param2=value2 \
--location westeurope
Powershell:
New-AzSubscriptionDeployment `
-name firstBicepDeployment `
-subscription 'xxxx-yyyy-zzzz-yyyy' `
-templatefile main.bicep `
-param1 value1
-param2 value2
in this example I used:
az deployment sub create \
--name firstBicepDeployment \
--subscription 'xxxx-yyyyy-zzzz-yyyy' \
--template-file main.bicep \
--parameters location=westeurope rgName=azr-tst-rg vnetName=azr-tst-vnet-001 vnetAddrSpace=10.0.0.0/16 snet1AddrSpace=10.0.0.0/24 snet2AddrSpace=10.0.253.0/24 snet3AddrSpace=10.0.254.0/24 \
--location westeurope
Converting
If we have JSON template from work environment we can decompile it to Bicep template.
az bicep decompile --file myfile.json
This command will create myfile.bicep file in directory where it was run. There can be some warnings and errors that You will need to fix after decompiling.