Skip to content
DevOps AI ToolKit
Newsletter
All guides
Azure with AI By James Joyner IV · · 9 min read

Azure Error Guide: 'SkuNotAvailable' VM Size Not Available in Region or Zone

Fix the Azure SkuNotAvailable error: diagnose SKUs not offered in a region or zone, capacity allocation failures, subscription enablement, retired sizes, and policy restrictions.

  • #azure
  • #troubleshooting
  • #errors
  • #compute

Overview

A SkuNotAvailable error means the requested VM size cannot be provisioned for this subscription in the chosen region (or availability zone) at this time. Azure decides this at the control plane based on what the region offers, what the subscription is enabled for, what capacity exists in the target zone, and any SKU restrictions. The request fails before a VM is created — the size is simply not available where and how you asked for it.

You will see this from az vm create, an ARM/Bicep deployment, or a scale-set operation:

(SkuNotAvailable) The requested VM size 'Standard_D4s_v5' is not available in the current region 'westus2'. Find available sizes using https://aka.ms/azureskus or run 'az vm list-skus --location westus2'. The requested size may be available in another region or availability zone.
Code: SkuNotAvailable

And a closely related capacity failure surfaces as AllocationFailed / zonal allocation, which is often confused with the same root problem:

"code": "AllocationFailed",
"message": "Allocation failed. We do not have sufficient capacity for the requested VM size in this zone. You can try creating the VM in a different zone, reducing the VM size, or restricting the size to a region with available capacity."

It occurs most often when picking a newer size in an older region, pinning a specific availability zone, or scaling out in a zone that has run short of capacity.

Symptoms

  • A vm create or scale-set deployment fails with (SkuNotAvailable) naming a specific size and region.
  • A zone-pinned deployment fails while a non-zonal (regional) deployment of the same size succeeds.
  • The size shows up in az vm list-skus but with a restrictions entry for the region or zone.
  • Intermittent AllocationFailed during scale-out even though the size is “available”.
az vm list-skus --location westus2 --size Standard_D4s_v5 --all \
  --query "[].{Name:name, Restrictions:restrictions[].reasonCode}" -o table
Name              Restrictions
----------------  -------------------
Standard_D4s_v5   ['NotAvailableForSubscription']
az vm list-skus --location westus2 --size Standard_D4s_v5 --zone \
  --query "[].{Name:name, Zones:locationInfo[0].zones}" -o table
Name              Zones
----------------  -------
Standard_D4s_v5

Common Root Causes

1. The SKU is not offered in the region

Newer or specialized sizes roll out to regions over time; an older region may simply not carry the family at all.

az vm list-skus --location westus2 --size Standard_D4s_v5 --all \
  --query "[].{Name:name, Tier:tier}" -o table
Name    Tier
------  ------

An empty result means Standard_D4s_v5 is not offered in westus2 — pick another region or a size that is listed.

2. The SKU is not available in the chosen availability zone

The size exists in the region but not in the specific zone you pinned. A regional (no-zone) deployment may still succeed.

az vm list-skus --location westus2 --size Standard_D8s_v5 --zone \
  --query "[].{Name:name, Zones:locationInfo[0].zones}" -o table
Name              Zones
----------------  ---------
Standard_D8s_v5   ['1', '3']

The size is offered in zones 1 and 3 only — a deployment pinned to zone 2 fails with SkuNotAvailable.

3. Capacity restriction / zonal allocation failure

Even when offered, a zone can be temporarily out of capacity, producing AllocationFailed (or a capacity-reason restriction). This is transient and load-dependent, not a configuration error.

az vm list-skus --location westus2 --size Standard_D8s_v5 --all \
  --query "[].restrictions[].{Type:type, Reason:reasonCode, Zones:restrictionInfo.zones}" -o json
[
  {
    "Type": "Zone",
    "Reason": "NotAvailableForSubscription",
    "Zones": [ "2" ]
  }
]

A zone-scoped restriction (or a runtime AllocationFailed) means try another zone, a regional deployment, or a different size.

4. Subscription not enabled for the SKU/offer

Some sizes (GPU, HPC, high-memory, certain spot families) require the subscription/offer to be enabled. The restriction reason is NotAvailableForSubscription.

az vm list-skus --location eastus --size Standard_NC6s_v3 --all \
  --query "[].{Name:name, Reason:restrictions[].reasonCode}" -o table
Name                Reason
------------------  -----------------------------------
Standard_NC6s_v3    ['NotAvailableForSubscription']

NotAvailableForSubscription here means the subscription/offer is not enabled for that GPU family — a support/quota request is needed to unlock it.

5. Retired or replaced SKU

Older sizes get retired and stop being offered for new deployments. The size disappears from list-skus for the region even though it once worked.

az vm list-skus --location eastus --size Standard_D2_v2 --all \
  --query "[].{Name:name}" -o table
az vm list-sizes --location eastus \
  --query "[?name=='Standard_D2_v2']" -o table

An empty result for a formerly valid size signals a retired SKU — migrate to the current-generation equivalent (e.g., a Dsv5 size).

6. Restricted by Azure Policy / SKU restriction

An allowedVirtualMachineSKUs (or deny) policy can block sizes not on an approved list. This is usually reported as RequestDisallowedByPolicy, but is frequently mistaken for SkuNotAvailable since both block the size.

az policy assignment list --query "[?contains(displayName, 'SKU') || contains(displayName, 'size')].{Name:displayName, Definition:policyDefinitionId}" -o table
az policy state list --filter "complianceState eq 'NonCompliant'" \
  --query "[?contains(policyDefinitionName, 'sku')].{Policy:policyDefinitionName, Effect:policyDefinitionAction}" -o table
Policy                          Effect
------------------------------  ------
allowed-vm-skus-prod            deny

A deny policy restricting VM SKUs blocks any size not in its allowed list, regardless of regional availability.

Diagnostic Workflow

Step 1: Capture the exact size and region from the error

az vm create -g rg-prod -n gpu-01 --image Ubuntu2204 --size Standard_D4s_v5 --location westus2 --debug 2>&1 \
  | grep -iE "SkuNotAvailable|AllocationFailed|not available in the current region"

Note the size, the region, and whether the message mentions a zone or an allocation/capacity issue.

Step 2: Confirm the SKU is offered in the region at all

az vm list-skus --location <REGION> --size <VM_SIZE> --all \
  --query "[].{Name:name, Restrictions:restrictions[].reasonCode}" -o table

Empty means not offered — choose another region or size. A row with restrictions means it is offered but blocked; read the reason next.

Step 3: Check zone availability and restrictions

az vm list-skus --location <REGION> --size <VM_SIZE> --zone \
  --query "[].{Name:name, Zones:locationInfo[0].zones, Restrictions:restrictions[].restrictionInfo.zones}" -o json

If your pinned zone is not in Zones (or appears under a restriction), deploy regionally or pick an available zone.

Step 4: Distinguish capacity from subscription enablement

az vm list-skus --location <REGION> --size <VM_SIZE> --all \
  --query "[].restrictions[].{Type:type, Reason:reasonCode}" -o table

NotAvailableForSubscription points to enablement/quota (open a request); a runtime AllocationFailed points to transient capacity (retry elsewhere).

Step 5: Find a working size/region and rule out policy

# Which regions offer this size without restriction?
az vm list-skus --size <VM_SIZE> --all \
  --query "[?!(restrictions)].{Region:locationInfo[0].location}" -o table
# Sizes actually deployable in the region now
az vm list-sizes --location <REGION> -o table
# Any SKU-restricting policy?
az policy assignment list --query "[?contains(displayName,'SKU')]" -o table

Pick an unrestricted region/size, confirm it is not policy-blocked, then redeploy.

Example Root Cause Analysis

A deployment pins Standard_D8s_v5 to availability zone 2 in westus2 and fails:

(SkuNotAvailable) The requested VM size 'Standard_D8s_v5' is not available in the current region 'westus2'. The requested size may be available in another region or availability zone.

The message hints at a zone/region issue. First, is the size offered in the region at all?

az vm list-skus --location westus2 --size Standard_D8s_v5 --all \
  --query "[].{Name:name, Restrictions:restrictions[].reasonCode}" -o table
Name              Restrictions
----------------  --------------
Standard_D8s_v5

No restrictions at the region level — the size is offered in westus2. So the problem is the zone:

az vm list-skus --location westus2 --size Standard_D8s_v5 --zone \
  --query "[].{Name:name, Zones:locationInfo[0].zones}" -o table
Name              Zones
----------------  ---------
Standard_D8s_v5   ['1', '3']

The size is available only in zones 1 and 3; the template pinned zone 2, which does not offer it — hence SkuNotAvailable.

Fix: target an available zone (or drop the zone pin for a regional deployment):

az vm create -g rg-prod -n app-zone1 --image Ubuntu2204 \
  --size Standard_D8s_v5 --location westus2 --zone 1

The VM allocates in zone 1 and reaches running.

Prevention Best Practices

  • Query az vm list-skus --location <region> --size <size> --all before committing a size to a region, and prefer current-generation families that are broadly available.
  • Check zone availability with az vm list-skus ... --zone for any zone-pinned or zone-redundant deployment, and validate every zone you intend to spread across.
  • Treat AllocationFailed as transient capacity: build retry/fallback into automation (alternate zone, alternate size, alternate region) rather than failing the whole deploy.
  • Request enablement/quota up front for specialized families (GPU/HPC/high-memory) so NotAvailableForSubscription does not surprise a launch.
  • Keep allowedVirtualMachineSKUs policy lists in sync with what teams actually deploy, so policy denials are not mistaken for regional unavailability.
  • For quick triage, the free incident assistant can separate a true SkuNotAvailable from a capacity or policy block. More walkthroughs live in the Azure guides.

Quick Command Reference

# Is the size offered in the region? (restrictions reveal blocks)
az vm list-skus --location <REGION> --size <VM_SIZE> --all --query "[].{Name:name, Restrictions:restrictions[].reasonCode}" -o table

# Zone availability and zone-scoped restrictions
az vm list-skus --location <REGION> --size <VM_SIZE> --zone --query "[].{Name:name, Zones:locationInfo[0].zones}" -o json

# Full restriction detail (type + reason + zones)
az vm list-skus --location <REGION> --size <VM_SIZE> --all --query "[].restrictions[]" -o json

# Where is this size unrestricted?
az vm list-skus --size <VM_SIZE> --all --query "[?!(restrictions)].{Region:locationInfo[0].location}" -o table

# Sizes deployable in the region right now
az vm list-sizes --location <REGION> -o table

# SKU-restricting policy?
az policy assignment list --query "[?contains(displayName,'SKU')]" -o table
az policy state list --filter "complianceState eq 'NonCompliant'" -o table

# Deploy to a known-good zone
az vm create -g <RG> -n <NAME> --image <IMAGE> --size <VM_SIZE> --location <REGION> --zone <ZONE>

Conclusion

A SkuNotAvailable error means the requested VM size cannot be provisioned for your subscription in the chosen region or zone right now. The usual root causes:

  1. The SKU is not offered in the region at all.
  2. The SKU is offered in the region but not in the availability zone you pinned.
  3. A transient capacity/zonal allocation failure (AllocationFailed) in the target zone.
  4. The subscription/offer is not enabled for the family (NotAvailableForSubscription).
  5. The size has been retired and is no longer offered for new deployments.
  6. An Azure Policy SKU restriction blocks the size (often seen as RequestDisallowedByPolicy).

Pull the size, region, and any zone from the error, then walk list-skus (region) → list-skus --zone → restriction reason → policy. The fix is almost always choosing an available zone/region/size or requesting enablement for a restricted family.

Free download · 368-page PDF

Download the Free 500-Prompt DevOps AI Toolkit

500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.

  • 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
  • Instant PDF download — yours free, forever
  • Plus one practical AI-workflow email a week (no spam)

Single opt-in · unsubscribe anytime · no spam.