
1. Objective
This procedure describes how to validate and test Azure Resource Manager (ARM) Templates using Azure Cloud Shell without deploying Resources or Incurring Cost.
2. Prerequisites
Active Azure Subscription
Access to Azure Portal
ARM Template Files: template.json and optional: parameters.json
3. Open Azure Cloud Shell
Sign in to Azure Portal, click Cloud Shell (Top Navigation Bar), select PowerShell environment and wait for initialization to complete
4. Upload Template File (If you do not have Directory Stricture test one at the time)
In Cloud Shell, click Upload/Download files and Upload: template.json and parameters.json (if used) or you can just upload template.json and pass parameters inline via PowerShell
To verify upload use ls the expected output is to see template.json and parameters.json or just template.json if you are passing parameters inline via PowerShell.
5. Verify Resource Group
Ensure the target Resource Group exists: Get-AzResourceGroup -Name RG-ARM-TEMPLATES If it does not exist create it: New-AzResourceGroup -Name RG-ARM-TEMPLATES -Location eastus
6. Validate Template (No Deployment)
This step checks: syntax, parameters and resource dependencies
Test-AzResourceGroupDeployment `
-ResourceGroupName RG-ARM-TEMPLATES `
-TemplateFile template.json
If parameters are required use parameters.json (if you have it and uploaded)
Test-AzResourceGroupDeployment `
-ResourceGroupName RG-ARM-TEMPLATES `
-TemplateFile template.json `
-TemplateParameterFile parameters.json
Expected Result: No errors returned and command completes successfully
This confirms the template is valid and ready for deployment.
7. Preview Deployment (-WhatIf)
This step simulates deployment without creating resources.
New-AzResourceGroupDeployment `
-ResourceGroupName RG-ARM-TEMPLATES `
-TemplateFile template.json `
-TemplateParameterFile parameters.json `
-WhatIf
Expected Output: List of resources to be created, example: Resource changes: 2 to create (Microsoft.Storage/storageAccounts, Microsoft.Network/virtualNetworks)
What this Confirms: Correct resource creation plan, proper dependency resolution , valid configuration
8. Important Notes
No Cost During Testing, Test-AzResourceGroupDeployment → No deployment
-WhatIf → No deployment . These steps are safe and do not incur charges
Parameter Handling
Required parameters must be provided use parameters.json for repeatable testing or use inline parameters for quick validation
Naming Constraints
Some resources require unique names: Storage Accounts, App Services, SQL Servers
use randomization if needed:"mystorage$(Get-Random)"
9. Common Issues
Missing Parameters
Error: A parameter is missing
Fix: Provide parameter in command or parameters.json
Invalid Resource Configuration
Error: InvalidTemplateDeployment
Fix: Review resource properties, check schema compliance or quota or SKU limitations
Error: SubscriptionIsOverQuotaForSku
Fix: Use What-If instead of full validation, change SKU or region if needed
10. Summary
The recommended testing workflow is:
Upload template files, validate template (Test-AzResourceGroupDeployment)
Preview deployment (What-If) and review expected output.
This ensures templates are correct, safe, and ready for deployment without creating resources.
Ways to pass parameters to a reusable ARM template
1. parameters.json file, most common for repeatable deployments, good for dev / test / prod environments used with: -TemplateParameterFile parameters.json
2. Inline via PowerShell (at deployment time), good for quick testing and good for dynamic values -storageAccountName mystorage01
3. CI/CD Pipelines, Azure DevOps and GitHub.
4. Azure CLI: --parameters storageAccountName=mystorage01
5. Template Specs / Linked Templates (Advanced), parameters passed from parent template, used in modular deployments.
This procedure provides a complete, repeatable method for testing ARM templates in Azure Cloud Shell using PowerShell, including validation, preview, expected results, and troubleshooting.
A reusable ARM template separates deployment logic from configuration by using parameters, while a non-reusable template embeds configuration directly in the template, requiring manual edits for each use.
0 comments