ARM Template Structure and Syntax | Azure ARM

Azure Resource Manager (ARM) templates are JSON files used to define the infrastructure and configuration of resources in Microsoft Azure. They follow a specific structure and syntax that allows you to declaratively specify the desired state of your resources. In this tutorial, we will explore the key components of ARM templates and understand their syntax with examples.

css Copy code

1. Template Structure

An ARM template consists of the following sections:

  • $schema: Specifies the URI of the JSON schema used for validation. For example: "$schema": ""
  • contentVersion: The version of the template. For example: "contentVersion": ""
  • parameters: Defines input parameters that users can provide during deployment. For example: "parameters": { "location": { "type": "string", "defaultValue": "East US", "metadata": { "description": "Location for the resources." } } }
  • variables: Allows you to define variables for use within the template. For example: "variables": { "storageAccountType": "Standard_LRS" }
  • resources: This section is used to define the Azure resources to be deployed. For example: "resources": [ { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2022-01-01", "name": "[variables('storageAccountName')]", "location": "[parameters('location')]", "sku": { "name": "[variables('storageAccountType')]" }, "kind": "StorageV2", "properties": {} } ]
  • outputs: Defines the values to be returned after deployment. For example: "outputs": { "storageAccountEndpoint": { "type": "string", "value": "[reference(variables('storageAccountName')).primaryEndpoints.blob]" } }

2. Syntax and Expressions

ARM templates use the JSON syntax for defining resources and configurations. Additionally, they support expressions enclosed in square brackets [ ] to reference variables, parameters, or functions. The expressions are evaluated during deployment to produce the desired configuration. For example:

{ "name": "[parameters('virtualMachineName')]", "type": "Microsoft.Compute/virtualMachines", "apiVersion": "2022-01-01", "location": "[resourceGroup().location]", "properties": { "hardwareProfile": { "vmSize": "[parameters('virtualMachineSize')]" } } }

Common Mistakes with ARM Template Structure and Syntax

  • Incorrectly referencing parameters or variables in expressions.
  • Missing required fields in resource definitions.
  • Invalid JSON syntax or structure.

Frequently Asked Questions (FAQs)

1. Can I use JavaScript or other programming languages in ARM templates?

No, ARM templates only support expressions in the JSON syntax. They cannot include JavaScript or other programming languages.

2. How can I define conditional deployments in ARM templates?

You can use functions like if() and equals() to define conditions and control resource deployments based on those conditions.

3. Can I deploy multiple resources of the same type using a single ARM template?

Yes, you can define an array of resource objects in the "resources" section to deploy multiple resources of the same type.

4. Are ARM templates idempotent?

Yes, ARM templates are idempotent, which means you can deploy the same template multiple times without causing any issues or duplications. The template ensures that the desired state is achieved, regardless of the current state of the resources.

5. Can I use parameters with default values in ARM templates?

Yes, you can define parameters with default values in ARM templates. Users can override these values during deployment if needed.


ARM templates provide a structured and declarative way to define Azure resources and configurations. By understanding the template structure and JSON syntax, you can create powerful templates for managing your Azure infrastructure efficiently. Avoiding common mistakes and leveraging expressions will enable you to deploy resources consistently and accurately.