Azure Virtual Machines – Scale Configuration

← Back to VMs

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

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