Azure Resource Manager (ARM)

Azure Resource Manager (ARM)

Azure Resource Manager (ARM) Templates Overview

ARM templates are Infrastructure as Code (IaC) that define and deploy Azure resources consistently and automatically.

Template Advantages

  • Deploy all resources as a single operation.

  • Faster and repeatable deployments.

  • No manual, error-prone tasks.

Benefits

  1. Consistency: Same structure and format across tools.

  2. Complex Deployments: Handles resource dependencies automatically.

  3. Error Reduction: Ensures uniform deployment.

  4. Code-Based: Templates can be versioned and documented like software.

  5. Reuse: Parameters allow multiple configurations from the same template.

  6. Linkable: Templates can be modular and combined.

  7. Simplified Orchestration: One deployment handles all resources.


Template Structure (JSON)

{
"$schema": "http://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {},
"functions": [],
"resources": [],
"outputs": {}
}
Element Required Description
$schema Yes JSON schema for template version.
contentVersion Yes Template version for tracking changes.
parameters No Values provided at deployment time.
variables No Reusable values in the template.
functions No User-defined functions.
resources Yes Azure resources to deploy.
outputs No Values returned after deployment.

Template Parameters

Define user input for deployments.

"parameters": {
"adminUsername": {
"type": "string",
"metadata": { "description": "Username for the Virtual Machine." }
},
"adminPassword": {
"type": "securestring",
"metadata": { "description": "Password for the Virtual Machine." }
}
}
  • Limit: 256 parameters per template.

  • Use objects to reduce parameter count.


Template Variables

Reusable values to simplify templates.

"variables": {
"nicName": "myVMNic",
"addressPrefix": "10.0.0.0/16",
"subnetName": "Subnet",
"subnetPrefix": "10.0.0.0/24",
"publicIPAddressName": "myPublicIP",
"virtualNetworkName": "MyVNET"
}

Template Functions

Reusable expressions to reduce repetition.

"functions": [
{
"namespace": "contoso",
"members": {
"uniqueName": {
"parameters": [{ "name": "namePrefix", "type": "string" }],
"output": {
"type": "string",
"value": "[concat(toLower(parameters('namePrefix')), uniqueString(resourceGroup().id))]"
}
}
}
}
]
  • Restrictions: Cannot access variables, call other functions, or use defaults.


Template Resources

Define Azure resources for deployment.

{
"type": "Microsoft.Network/publicIPAddresses",
"name": "[variables('publicIPAddressName')]",
"location": "[parameters('location')]",
"apiVersion": "2018-08-01",
"properties": {
"publicIPAllocationMethod": "Dynamic",
"dnsSettings": {
"domainNameLabel": "[parameters('dnsLabelPrefix')]"
}
}
}
  • apiVersion ensures resource compatibility.

  • Use parameters and variables for flexibility.


Template Outputs

Return information after deployment.

"outputs": {
"hostname": {
"type": "string",
"value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
}
}

Best Practices

  • Comment your templates with // or /* ... */.

  • Use parameters and variables for maintainability.

  • Use QuickStart templates as examples:
    Azure Quickstart Templates


Running ARM Templates with PowerShell

1. Connect to your subscription

Connect-AzAccount
Get-AzContext
Set-AzContext -Subscription <SubscriptionID>

2. Create a Resource Group

New-AzResourceGroup -Name <ResourceGroupName> -Location <AzureRegion>

3. Deploy Template

$templateUri = "<TemplateURL>"
New-AzResourceGroupDeployment -Name <DeploymentName> -ResourceGroupName <ResourceGroupName> -TemplateUri $templateUri
  • Enter parameters when prompted (username, password, DNS label).

  • Automate input with a .ps1 script.

4. Verify Deployment

Get-AzVM
$vm = Get-AzVM -Name <VMName> -ResourceGroupName <ResourceGroupName>
$vm.HardwareProfile.vmSize = "Standard_A3"
Update-AzVM -ResourceGroupName <ResourceGroupName> -VM $vm