Azure Resource Manager (ARM) is the deployment and management layer for Microsoft Azure, and ARM templates are its native infrastructure-as-code format. Every action in Azure - through the portal, CLI, or SDK - goes through Resource Manager, which means an ARM template can declare any Azure resource. You describe the resources you want in a JSON document, submit it, and ARM creates or updates them to match, in the right dependency order.
Templates and declarative deployment
An ARM template is a JSON file with sections for parameters, variables, the resources to deploy, and outputs. It's declarative: you state the desired resources and their properties, and Resource Manager works out the order and the changes. Deployments are idempotent - submitting the same template again converges to the same state rather than duplicating resources - and can run in incremental mode (add/update only) or complete mode (delete resources not in the template).
{
"$schema": "https://schema.management.azure.com/...deploymentTemplate.json#",
"resources": [{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-01-01",
"name": "[parameters('storageName')]",
"location": "[resourceGroup().location]",
"sku": { "name": "Standard_LRS" },
"kind": "StorageV2"
}]
}
Bicep: the readable layer on top
Raw ARM JSON is verbose, so Microsoft introduced Bicep, a concise domain-specific language that compiles down to ARM templates. Bicep is the recommended way to author ARM deployments today - same engine and capabilities, far less boilerplate - and it transpiles to the JSON that Resource Manager actually executes.
Where it fits
ARM is the choice for teams committed to Azure that want native, fully supported infrastructure as code with no extra tooling. It only manages Azure, so multi-cloud shops typically use Terraform instead; the parallel on Google Cloud is Cloud Deployment Manager. Configuration of software inside the deployed VMs is then often handled by Ansible.
Frequently asked questions
What is the difference between ARM templates and Bicep? Bicep is a concise language that compiles to ARM JSON; same engine and features, much less verbosity. Microsoft recommends Bicep for new work.
What do incremental and complete mode mean? Incremental adds or updates resources and leaves others alone; complete mode also deletes any resource in the resource group that isn't in the template.
Can ARM manage non-Azure resources? No - it only manages Azure. For multiple clouds, a cross-cloud tool like Terraform is the usual choice.