0
0
Azurecloud~10 mins

VM Scale Sets for auto scaling in Azure - Commands & Configuration

Choose your learning style9 modes available
Introduction
When you run many virtual machines to handle your app, it can be hard to add or remove machines as demand changes. VM Scale Sets help by automatically increasing or decreasing the number of virtual machines based on the workload.
When your website traffic grows during the day and shrinks at night, and you want to save costs by running fewer machines at night.
When you run a batch job that needs more machines to finish faster and fewer machines when idle.
When you want to keep your app available even if some virtual machines fail by automatically replacing them.
When you want to easily manage and update many identical virtual machines as a group.
When you want to respond quickly to sudden spikes in user demand without manual intervention.
Config File - main.tf
main.tf
provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "East US"
}

resource "azurerm_virtual_network" "example" {
  name                = "example-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

resource "azurerm_subnet" "example" {
  name                 = "example-subnet"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_linux_virtual_machine_scale_set" "example" {
  name                = "example-vmss"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  sku                 = "Standard_DS1_v2"
  instances           = 2
  admin_username      = "azureuser"

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  network_interface {
    name    = "example-nic"
    primary = true

    ip_configuration {
      name      = "internal"
      subnet_id = azurerm_subnet.example.id
      primary   = true
    }
  }

  automatic_instance_repair {
    enabled      = true
    grace_period = "PT10M"
  }

  upgrade_mode = "Manual"
}

resource "azurerm_monitor_autoscale_setting" "example" {
  name                = "example-autoscale"
  resource_group_name = azurerm_resource_group.example.name
  target_resource_id  = azurerm_linux_virtual_machine_scale_set.example.id

  profile {
    name = "autoscale-profile"

    capacity {
      minimum = "1"
      maximum = "5"
      default = "2"
    }

    rule {
      metric_trigger {
        metric_name        = "Percentage CPU"
        metric_resource_id = azurerm_linux_virtual_machine_scale_set.example.id
        time_grain         = "PT1M"
        statistic          = "Average"
        time_window        = "PT5M"
        time_aggregation   = "Average"
        operator           = "GreaterThan"
        threshold          = 75
      }

      scale_action {
        direction = "Increase"
        type      = "ChangeCount"
        value     = "1"
        cooldown  = "PT5M"
      }
    }

    rule {
      metric_trigger {
        metric_name        = "Percentage CPU"
        metric_resource_id = azurerm_linux_virtual_machine_scale_set.example.id
        time_grain         = "PT1M"
        statistic          = "Average"
        time_window        = "PT5M"
        time_aggregation   = "Average"
        operator           = "LessThan"
        threshold          = 30
      }

      scale_action {
        direction = "Decrease"
        type      = "ChangeCount"
        value     = "1"
        cooldown  = "PT5M"
      }
    }
  }
}

This Terraform file creates a resource group and a virtual network with a subnet to host the virtual machines.

The azurerm_linux_virtual_machine_scale_set resource defines a scale set with 2 Ubuntu VMs, automatic repair enabled, and manual upgrade mode.

The azurerm_monitor_autoscale_setting resource sets up auto scaling rules based on CPU usage: it adds a VM if average CPU goes above 75% and removes one if it falls below 30%, with cooldown periods to avoid rapid changes.

Commands
This command initializes Terraform in the current directory, downloading the Azure provider and preparing to create resources.
Terminal
terraform init
Expected OutputExpected
Initializing the backend... Initializing provider plugins... - Finding latest version of hashicorp/azurerm... - Installing hashicorp/azurerm v3.64.0... - Installed hashicorp/azurerm v3.64.0 (signed by HashiCorp) Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure.
This command creates the VM Scale Set and autoscale settings in Azure as defined in the Terraform file, without asking for confirmation.
Terminal
terraform apply -auto-approve
Expected OutputExpected
azurerm_resource_group.example: Creating... azurerm_resource_group.example: Creation complete after 2s [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-resources] azurerm_virtual_network.example: Creating... azurerm_subnet.example: Creating... azurerm_virtual_network.example: Creation complete after 3s [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-resources/providers/Microsoft.Network/virtualNetworks/example-vnet] azurerm_subnet.example: Creation complete after 2s [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-resources/providers/Microsoft.Network/virtualNetworks/example-vnet/subnets/example-subnet] azurerm_linux_virtual_machine_scale_set.example: Creating... azurerm_monitor_autoscale_setting.example: Creating... azurerm_linux_virtual_machine_scale_set.example: Still creating... [10s elapsed] azurerm_linux_virtual_machine_scale_set.example: Creation complete after 1m [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-resources/providers/Microsoft.Compute/virtualMachineScaleSets/example-vmss] azurerm_monitor_autoscale_setting.example: Creation complete after 5s [id=/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-resources/providers/microsoft.insights/autoscalesettings/example-autoscale] Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
-auto-approve - Skip manual approval to apply changes immediately
This Azure CLI command lists all virtual machines currently running in the scale set to verify the instances are created.
Terminal
az vmss list-instances --resource-group example-resources --name example-vmss --output table
Expected OutputExpected
InstanceId ComputerName ProvisioningState PowerState ------------ -------------- ------------------- ------------ 0 example-vmss_0 Succeeded VM running 1 example-vmss_1 Succeeded VM running
--output table - Display output in a readable table format
This command shows the autoscale settings applied to the VM Scale Set to confirm the scaling rules are active.
Terminal
az monitor autoscale show --resource-group example-resources --name example-autoscale
Expected OutputExpected
{ "autoscaleSettingResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-resources/providers/microsoft.insights/autoscalesettings/example-autoscale", "enabled": true, "profiles": [ { "name": "autoscale-profile", "capacity": { "minimum": "1", "maximum": "5", "default": "2" }, "rules": [ { "metricTrigger": { "metricName": "Percentage CPU", "operator": "GreaterThan", "threshold": 75 }, "scaleAction": { "direction": "Increase", "value": "1" } }, { "metricTrigger": { "metricName": "Percentage CPU", "operator": "LessThan", "threshold": 30 }, "scaleAction": { "direction": "Decrease", "value": "1" } } ] } ] }
Key Concept

If you remember nothing else from this pattern, remember: VM Scale Sets let you automatically add or remove virtual machines based on demand to keep your app responsive and cost-efficient.

Common Mistakes
Not setting the minimum and maximum instance counts in autoscale rules.
Without limits, the scale set might try to add too many or remove all machines, causing failures or downtime.
Always define sensible minimum and maximum instance counts to keep your app stable and control costs.
Forgetting to specify the subnet ID in the VM Scale Set network configuration.
The scale set VMs won't have network access and will fail to start properly.
Always link the VM Scale Set to a valid subnet by providing the subnet ID.
Using manual upgrade mode without planning updates.
VMs won't update automatically, which can cause security or compatibility issues.
Use manual upgrade mode only if you plan to update VMs yourself; otherwise, consider automatic or rolling upgrades.
Summary
Initialize Terraform to prepare Azure provider and modules.
Apply the Terraform configuration to create a VM Scale Set with autoscaling rules.
Use Azure CLI to list VM instances in the scale set to verify deployment.
Check autoscale settings with Azure CLI to confirm scaling rules are active.