2.3 Azure Resource Manager (ARM) Overview
Key Takeaways
- Azure Resource Manager (ARM) is the single control plane for Azure — every request from the Portal, CLI, PowerShell, REST API, or SDK passes through it.
- ARM authenticates the caller via Microsoft Entra ID, then authorizes against RBAC and Azure Policy before any action runs.
- ARM enables declarative infrastructure-as-code through ARM templates (JSON) and Bicep, which are idempotent and order resources by dependency.
- Each Azure service is delivered by a resource provider (for example Microsoft.Compute) that must be registered in the subscription before its resource types can be used.
- ARM supports tags, parallel deployment, and consistent results regardless of which tool issued the request.
What Azure Resource Manager Is
Azure Resource Manager (ARM) is the deployment and management service — the single control plane — for all of Azure. Whether you click in the Azure Portal, type an Azure CLI command, run an Azure PowerShell cmdlet, call the REST API, or use a language SDK, the instruction is converted into an identical request that is sent to the ARM endpoint. ARM is what makes the result the same no matter which tool you choose.
The exam's favorite one-liner: all Azure management tools talk to Azure through ARM. There is no "back door" to a resource that bypasses ARM.
The ARM request lifecycle
Every management action follows the same path:
- You issue a request from Portal / CLI / PowerShell / REST / SDK.
- ARM receives the request at its endpoint.
- Authentication — ARM confirms who you are using Microsoft Entra ID (formerly Azure AD); the request carries a bearer token.
- Authorization — ARM confirms what you may do by checking RBAC role assignments and evaluating Azure Policy (a policy can deny the action outright).
- Routing — ARM forwards the validated request to the correct resource provider.
- Execution — the resource provider performs the work (creates the VM, provisions the storage account).
- Response — ARM returns the result and status to you.
Exam reflex: ARM authenticates and authorizes before anything is created. If a question asks "what stops an unauthorized create," the answer is ARM's authorization step (RBAC + Policy), not a firewall.
Resource providers
Each Azure service is delivered by a resource provider — a service that supplies a family of resource types. The type name format is provider/resourceType, e.g. Microsoft.Compute/virtualMachines.
| Resource provider | Example resource types |
|---|---|
| Microsoft.Compute | Virtual machines, VM scale sets, managed disks |
| Microsoft.Storage | Storage accounts, blob containers |
| Microsoft.Network | Virtual networks, load balancers, NSGs |
| Microsoft.Sql | SQL servers, SQL databases |
| Microsoft.Web | App Service plans, Function apps |
A provider must be registered in a subscription before its types can be deployed. Many are auto-registered on first use, but a brand-new or rarely used service may need manual registration — a real-world gotcha worth knowing.
Infrastructure as code: ARM templates and Bicep
ARM enables declarative deployment: you describe the desired end state and ARM figures out how to reach it.
- ARM templates are JSON files listing the resources to deploy.
- Bicep is a cleaner domain-specific language that compiles ("transpiles") down to an ARM template — same engine, friendlier syntax.
Key properties the exam tests:
- Declarative — you state what, not how.
- Idempotent — deploying the same template repeatedly yields the same result; existing matching resources are left as-is rather than duplicated.
- Dependency-aware — ARM reads
dependsOnrelationships and deploys in the correct order. - Parallel — independent resources deploy at the same time for speed.
Worked example
You submit a Bicep file that defines a virtual network, then a subnet inside it, then a VM with a NIC in that subnet. ARM deploys the virtual network first, the subnet next, and the VM last because of the dependency chain — even though you listed them in any order. Re-running the same file changes nothing because the deployment is idempotent.
Cross-cutting ARM features
- RBAC — fine-grained permissions at any scope in the hierarchy.
- Tags — key/value metadata for cost reporting and organization (for example
costCenter=marketing). - Locks —
CanNotDeleteorReadOnlylocks guard critical resources from accidental change.
Bottom line: ARM is the consistent, secured, idempotent gateway to Azure. Every tool, every template, every API call goes through it.
Choosing Your Interface to ARM
All of these tools front the same ARM API, so the choice is about workflow, not capability:
| Tool | Best for | Notes |
|---|---|---|
| Azure Portal | Visual, ad-hoc tasks and learning | Browser GUI; good for one-offs, weak for repeatability |
| Azure CLI | Cross-platform scripting | az commands; Bash/Linux-friendly |
| Azure PowerShell | Windows automation | Az module cmdlets |
| REST API / SDKs | Custom apps and integrations | Programmatic access from your own code |
| Cloud Shell | Browser-based CLI/PowerShell | No local install; authenticated automatically |
For repeatable deployments, prefer infrastructure as code (ARM templates or Bicep) over clicking in the Portal, because templates are version-controlled, reviewable, and idempotent.
ARM Templates vs Bicep — what to remember
| Aspect | ARM template | Bicep |
|---|---|---|
| Format | JSON | Concise DSL that transpiles to JSON |
| Readability | Verbose | Cleaner, less boilerplate |
| Engine | ARM | Same ARM engine after transpile |
| Net result | Identical deployment | Identical deployment |
Because Bicep compiles down to an ARM template, anything you can deploy with one you can deploy with the other; Bicep simply improves the authoring experience. Both are declarative and idempotent.
Management Locks Protect Critical Resources
A frequent ARM exam topic is resource locks, applied at the resource, resource-group, or subscription scope and inherited downward:
- CanNotDelete — authorized users can read and modify the resource but cannot delete it.
- ReadOnly — users can read the resource but cannot modify or delete it (more restrictive than RBAC).
Locks are the guardrail that stops an accidental delete of, say, a production database, even by an account that otherwise has Owner rights.
Worked end-to-end scenario
A developer runs az deployment group create with a Bicep file that defines a virtual network, a dependent subnet, and a VM. ARM authenticates the developer through Microsoft Entra ID, checks that their RBAC role allows the create and that no Azure Policy denies it, then deploys the virtual network first, the subnet second, and the VM last based on the dependency chain — deploying any independent resources in parallel. A CanNotDelete lock on the resource group would still permit this create but block a later accidental delete.
Bottom line revisited: Know the lifecycle (authenticate → authorize → route → execute), that all tools share ARM, that providers must be registered, and that templates/Bicep are declarative and idempotent.
An administrator manages identical resources using both Azure CLI scripts and the Azure Portal. Why do both tools produce consistent results?
In the ARM request lifecycle, what does ARM do immediately after authenticating the caller through Microsoft Entra ID and before the resource provider acts?
A team deploys the same Bicep file three times in a row. The first run creates a storage account and a virtual network; the next two runs report no changes. Which ARM property explains this?
A developer tries to deploy a resource type from a service that has never been used in the subscription, and the deployment fails. What is a likely ARM-related cause?