🏆 Team Leaderboard

Live ARM/Bicep progress across all teammates

↻ Loading…

🧠 Knowledge Quiz

Test your ARM/Bicep knowledge

☁ Firebase Cross-Device Sync

Sync ARM/Bicep lab progress across devices.

Quick setup:
1. console.firebase.google.com → Create project
2. Realtime Database → Create (test mode)
3. Project Settings → Web app → copy config

📄 ARM / Bicep Cheatsheet

Deployment commands, Bicep syntax, functions & patterns — quick reference

⚡ Azure CLI Deployment Commands

az deployment group create --template-file main.bicepDeploy Bicep/ARM to resource group
az deployment group what-if --template-file main.bicepPreview changes (like terraform plan)
--parameters @params.jsonLoad parameters from file
--parameters key=valueInline parameter override
--mode CompleteComplete mode — removes unlisted resources Danger
az deployment sub create --location eastusSubscription-scope deployment
az deployment mg create --management-group-id myMGManagement group-scope deployment
az deployment group list -g myRGList deployment history

💡 Bicep CLI Commands

az bicep installInstall Bicep CLI
az bicep build --file main.bicepCompile Bicep → ARM JSON
az bicep decompile --file main.jsonARM JSON → Bicep (best-effort)
az bicep publish --file mod.bicep --target br:acr.azurecr.io/bicep/mod:v1Publish module to Bicep Registry
bicep format main.bicepAuto-format Bicep file
az ts create --name mySpec -g myRG --version 1.0 --template-file main.bicepCreate Template Spec
az stack group create --name myStack -g myRG --template-file main.bicep --deny-settings-mode noneCreate Deployment Stack

📝 Bicep Syntax Reference

// targetScope (default: resourceGroup)
targetScope = 'subscription'

// Parameters with decorators
@description('Storage account name')
@minLength(3) @maxLength(24)
@allowed(['Standard_LRS', 'Premium_LRS'])
param storageAccountName string
param location string = resourceGroup().location

@secure()
param adminPassword string

// Variable
var uniqueName = '${storageAccountName}${uniqueString(resourceGroup().id)}'

// Resource
resource sa 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: toLower(uniqueName)
  location: location
  sku: { name: 'Standard_LRS' }
  kind: 'StorageV2'
}

// Output
output blobEndpoint string = sa.properties.primaryEndpoints.blob

🔁 Bicep Loops & Conditions

// Resource loop
param storageNames array = ['sa1', 'sa2']

resource saLoop 'Microsoft.Storage/storageAccounts@2023-01-01' = [for name in storageNames: {
  name: name
  location: location
  sku: { name: 'Standard_LRS' }
  kind: 'StorageV2'
}]

@batchSize(2) // deploy 2 at a time (serial)
resource saSerial ... = [for name in storageNames: { ... }]

// Conditional resource
resource sa 'Microsoft.Storage/storageAccounts@2023-01-01' = if (deployStorage) {
  name: storageAccountName
  ...
}

// Existing resource (read-only reference)
resource existingSa 'Microsoft.Storage/storageAccounts@2023-01-01' existing = {
  name: existingStorageName
}

🏗 Modules

// Local module
module sa './modules/storage.bicep' = {
  name: 'storageDeploy'
  params: {
    name: storageAccountName
    location: location
  }
}

// Access module output
output endpoint string = sa.outputs.blobEndpoint

// Registry module (ACR)
module sa 'br:myacr.azurecr.io/bicep/storage:v1.0' = { ... }

// Public registry module
module sa 'br/public:storage/storage-account:0.4' = { ... }

// Template Spec as module
module app 'ts:<sub-id>/myRG/mySpec:1.0' = { ... }

🧪 ARM Template Functions

uniqueString(rg().id)Deterministic 13-char hash for unique names
concat(a, b, c)Concatenate strings/arrays
format('{0}-{1}', a, b)String formatting
toLower(str)Lowercase string
resourceId('type', 'name')Construct resource ID
reference(res).propertyGet runtime resource property
resourceGroup().locationCurrent resource group location
subscription().subscriptionIdCurrent subscription ID
copyIndex()Current loop index (ARM JSON)
if(cond, trueVal, falseVal)ARM conditional expression

🔒 Security & Compliance

Assert-PSRule -InputPath . -Module PSRule.Rules.AzureValidate templates (PowerShell)
Install-Module PSRule.Rules.AzureInstall PSRule Azure module
az deployment group what-if --result-format FullResourcePayloadsFull before/after diff output
az stack group delete --delete-allDelete stack + all managed resources
--deny-settings-mode denyDeletePrevent manual resource deletion
az policy state trigger-scanTrigger policy compliance scan
bicepconfig.json linter rulesConfigure Bicep linter severity per rule

🔄 Key Vault Parameter Reference

// params.json — reference KV secret at deploy time
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "adminPassword": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.KeyVault/vaults/<kv>"
        },
        "secretName": "adminPassword"
      }
    }
  }
}
🏆

ARM/Bicep Expert!

You've completed all ARM/Bicep labs!

0
Total Labs
0
Completed
0/0
Phase 1-3 Done
0/0
Phase 4-6 Done
Overall ARM/Bicep Progress0%