Testing ARM Templates using Azure Cloud Shell (PowerShell)

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

Leave a comment

Please note, comments need to be approved before they are published.