AZURE

VMDeploymentFailed - VM Deployment Failed: Template or Extension Error

VMDeploymentFailed signals your ARM template deployment crashed before the VM finished provisioning—template syntax errors, extension install failures, or missing/invalid dependencies (networks, storage, images). ARM throws this 400/409 client-side error after validating templates and dependencies. Failures can hit during VM creation, configuration, or extension installation. While specific to Virtual Machines, similar deployment failures happen in AKS cluster deployments and App Service app deployments. The deployment's provisioningState shows "Failed" with detailed errors in deployment operations.

#Common Causes

  • ARM Template Errors: The template has syntax errors, invalid parameters, or resource definition issues. ARM validates templates before deployment, rejecting malformed JSON, invalid parameter types, or resource schema violations. This is persistent—you must fix the template before retrying.
  • Extension Installation Failure: VM extensions can't install or execute properly. Custom script extensions may fail due to script errors, permission issues, network connectivity problems preventing extension downloads, or invalid extension settings. This is persistent—you must fix the extension issue before retrying.
  • Resource Dependency Failure: Referenced resources (virtual networks, subnets, storage accounts, VM images) don't exist or are in invalid states (not "Succeeded"). ARM validates dependencies before deployment. This is persistent—you must fix dependencies before retrying.

Solutions

  1. 1Step 1: Diagnose - Get deployment details and provisioning state: az deployment group show --resource-group <rg> --name <deployment-name> --query "properties.provisioningState" --output table
  2. 2Step 2: Diagnose - List failed deployment operations with error messages: az deployment operation group list --resource-group <rg> --name <deployment-name> --query "[?properties.provisioningState=='Failed'].{Operation:operationId,Status:properties.provisioningState,Message:properties.statusMessage.message}" --output table
  3. 3Step 3: Diagnose - Validate ARM template before deployment: az deployment group validate --resource-group <rg> --template-file template.json --parameters @parameters.json Fix any validation errors reported.
  4. 4Step 4: Diagnose - Check VM extension status and logs: az vm extension list --resource-group <rg> --vm-name <vm> --query "[].{Name:name,ProvisioningState:provisioningState,Type:type}" --output table Get detailed extension logs: az vm extension show --resource-group <rg> --vm-name <vm> --name <extension> --instance-view
  5. 5Step 5: Fix - Fix template syntax errors, invalid parameters, or resource schema violations based on validation output.
  6. 6Step 6: Fix - Fix extension issues: correct script errors, fix permissions, ensure network connectivity, or update extension settings.
  7. 7Step 7: Fix - Verify all dependencies exist and have provisioningState: "Succeeded". Create missing resources or wait for dependencies to complete.
  8. 8Step 8: Verify - After fixing issues, retry deployment. The deployment should succeed with provisioningState: "Succeeded".

</>Code Examples

VM Deployment Failure Diagnosis
1# This script helps diagnose VMDeploymentFailed by checking deployment status and errors
2
3# Step 1: Set deployment details (replace with your values)
4RESOURCE_GROUP="my-resource-group"
5DEPLOYMENT_NAME="myDeployment"
6VM_NAME="my-vm"
7echo "Diagnosing deployment: ${DEPLOYMENT_NAME}"
8
9# Step 2: Get deployment provisioning state
10echo "Checking deployment provisioning state..."
11PROVISIONING_STATE=$(az deployment group show \
12  --resource-group ${RESOURCE_GROUP} \
13  --name ${DEPLOYMENT_NAME} \
14  --query "properties.provisioningState" \
15  --output tsv 2>/dev/null)
16
17if [ ! -z "${PROVISIONING_STATE}" ]; then
18  echo "Deployment provisioning state: ${PROVISIONING_STATE}"
19  if [ "${PROVISIONING_STATE}" == "Failed" ]; then
20    echo "WARNING: Deployment failed"
21  fi
22else
23  echo "Deployment not found or inaccessible"
24fi
25
26# Step 3: List failed deployment operations with error messages
27echo "Listing failed deployment operations..."
28az deployment operation group list \
29  --resource-group ${RESOURCE_GROUP} \
30  --name ${DEPLOYMENT_NAME} \
31  --query "[?properties.provisioningState=='Failed'].{Operation:operationId,Status:properties.provisioningState,Message:properties.statusMessage.message,Resource:properties.targetResource.id}" \
32  --output table
33
34# Step 4: Validate ARM template (if using templates)
35TEMPLATE_FILE="template.json"
36PARAMS_FILE="parameters.json"
37if [ -f "${TEMPLATE_FILE}" ] && [ -f "${PARAMS_FILE}" ]; then
38  echo "Validating ARM template..."
39  az deployment group validate \
40    --resource-group ${RESOURCE_GROUP} \
41    --template-file ${TEMPLATE_FILE} \
42    --parameters @${PARAMS_FILE} \
43    --output table
44else
45  echo "Template files not found. Skipping template validation."
46fi
47
48# Step 5: Check VM extension status
49echo "Checking VM extension status..."
50az vm extension list \
51  --resource-group ${RESOURCE_GROUP} \
52  --vm-name ${VM_NAME} \
53  --query "[].{Name:name,ProvisioningState:provisioningState,Type:type}" \
54  --output table
55
56# Step 6: Get extension instance view for detailed logs
57echo "Getting extension instance views..."
58EXTENSIONS=$(az vm extension list --resource-group ${RESOURCE_GROUP} --vm-name ${VM_NAME} --query "[].name" -o tsv)
59for ext in ${EXTENSIONS}; do
60  echo "Extension: ${ext}"
61  az vm extension show \
62    --resource-group ${RESOURCE_GROUP} \
63    --vm-name ${VM_NAME} \
64    --name ${ext} \
65    --instance-view \
66    --query "instanceView.statuses" \
67    --output table
68done
69
70# Step 7: Check VM boot diagnostics (if enabled)
71echo "Checking VM boot diagnostics..."
72if az vm boot-diagnostics get-boot-log \
73  --resource-group ${RESOURCE_GROUP} \
74  --name ${VM_NAME} \
75  --output tsv > boot-log.txt 2>&1; then
76  echo "Boot log saved to boot-log.txt"
77else
78  echo "Boot diagnostics not available or not enabled"
79fi
80
81# Step 8: Check resource dependencies
82echo "Checking resource dependencies..."
83# Example: Check if virtual network exists
84VNET_NAME="my-vnet"
85if az network vnet show --resource-group ${RESOURCE_GROUP} --name ${VNET_NAME} --query "provisioningState" -o tsv 2>&1 | grep -q "Succeeded"; then
86  echo "Virtual network ${VNET_NAME} exists and is ready"
87else
88  echo "WARNING: Virtual network ${VNET_NAME} may not exist or is not ready"
89fi

Related Errors

Provider Information

This error code is specific to AZURE services. For more information, refer to the official AZURE documentation.

VMDeploymentFailed - VM Deployment Failed: Template or Extension Error | AZURE Error Reference | Error Code Reference