Overview
This guide shows how to configure scaling for Azure Virtual Machines using Azure Scale Sets, Azure Automation, and custom scripts. Choose between automatic scaling based on metrics or manual adjustments to meet workload demands.
Prerequisites
- An Azure subscription with
OwnerorContributorrights. - Existing Virtual Machine Scale Set (VMSS) or the intent to create one.
- Azure CLI 2.45+, PowerShell 7+, or Azure Portal access.
Configure Auto‑scale
Step 1 – Create a Scale Set
az vmss create \
--resource-group MyResourceGroup \
--name MyScaleSet \
--image UbuntuLTS \
--upgrade-policy-mode Automatic \
--admin-username azureuser \
--generate-ssh-keys \
--instance-count 2
Step 2 – Define Auto‑scale Rules
az monitor autoscale create \
--resource-group MyResourceGroup \
--resource MyScaleSet \
--autoscale-name vmssAutoscale \
--min-count 2 \
--max-count 10 \
--count 2
az monitor autoscale rule create \
--resource-group MyResourceGroup \
--autoscale-name vmssAutoscale \
--condition "Percentage CPU > 70 avg 5m" \
--scale out 2 \
--cooldown 5
Step 3 – Verify Settings
az monitor autoscale show \
--resource-group MyResourceGroup \
--name vmssAutoscale
Manual Scale Operations
Increase Instance Count
az vmss scale \
--resource-group MyResourceGroup \
--name MyScaleSet \
--new-capacity 5
Decrease Instance Count
az vmss scale \
--resource-group MyResourceGroup \
--name MyScaleSet \
--new-capacity 3
PowerShell Example
# Connect to Azure
Connect-AzAccount
# Create or update autoscale settings
$scaleSet = Get-AzVmss -ResourceGroupName "MyResourceGroup" -VMScaleSetName "MyScaleSet"
$autoscale = New-AzAutoscaleSetting -ResourceGroupName "MyResourceGroup" `
-TargetResourceId $scaleSet.Id `
-Name "vmssAutoScale" `
-Minimum 2 -Maximum 10 -Default 2
Add-AzAutoscaleRule -AutoscaleSetting $autoscale `
-MetricName "Percentage CPU" `
-MetricResourceId $scaleSet.Id `
-Operator GreaterThan -Threshold 70 `
-TimeGrain "PT1M" -Statistic Average -TimeWindow "PT5M" `
-ScaleActionDirection Increase -ScaleCount 2 -Cooldown "PT5M"
Azure CLI – Advanced Metrics
# Scale out when network in > 500 MBps
az monitor autoscale rule create \
--resource-group MyResourceGroup \
--autoscale-name vmssAutoscale \
--condition "Network In > 500 avg 5m" \
--scale out 3 \
--cooldown 10
ARM Template Snippet
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Compute/virtualMachineScaleSets",
"apiVersion": "2023-07-01",
"name": "[parameters('vmssName')]",
"location": "[resourceGroup().location]",
"sku": {
"name": "Standard_D2s_v3",
"tier": "Standard",
"capacity": 2
},
"properties": {
"upgradePolicy": {
"mode": "Automatic"
},
"virtualMachineProfile": {
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer",
"sku": "18.04-LTS",
"version": "latest"
}
},
"osProfile": {
"computerNamePrefix": "vmss",
"adminUsername": "azureuser",
"linuxConfiguration": {
"disablePasswordAuthentication": true,
"ssh": {
"publicKeys": [
{
"path": "/home/azureuser/.ssh/authorized_keys",
"keyData": "[parameters('sshKey')]"
}
]
}
}
}
},
"overprovision": true
}
},
{
"type": "Microsoft.Insights/autoscaleSettings",
"apiVersion": "2015-04-01",
"name": "vmssAutoscale",
"location": "[resourceGroup().location]",
"properties": {
"targetResourceUri": "[resourceId('Microsoft.Compute/virtualMachineScaleSets', parameters('vmssName'))]",
"enabled": true,
"profiles": [
{
"name": "AutoScaleProfile",
"capacity": {
"minimum": "2",
"maximum": "10",
"default": "2"
},
"rules": [
{
"metricTrigger": {
"metricName": "Percentage CPU",
"metricNamespace": "",
"timeGrain": "PT1M",
"statistic": "Average",
"timeWindow": "PT5M",
"timeAggregation": "Average",
"operator": "GreaterThan",
"threshold": 70
},
"scaleAction": {
"direction": "Increase",
"type": "ChangeCount",
"value": "2",
"cooldown": "PT5M"
}
}
]
}
]
}
}
]
}
Frequently Asked Questions
- Can I scale based on custom metrics? Yes. Publish custom metrics to Azure Monitor and reference them in autoscale rules.
- What is the cooldown period? Cooldown prevents rapid scaling. Set it based on workload stabilization time.
- How does scaling affect load balancers? Instances are automatically added or removed from Azure Load Balancer backend pools.