Azure arranges things differently from AWS, and the differences cause most early confusion. In AWS the account is the boundary for resources, billing and access. In Azure those jobs are split across a tenant (identity), subscriptions (billing and limits) and resource groups (lifecycle). Once that is clear, the rest of the platform is easier to read.
Naming note, current at this date. Microsoft announced on 11 July 2023 that Azure Active Directory (Azure AD) is now Microsoft Entra ID. It is the same service with a new name, and the rename is rolling through the portal, documentation and tools over the following months, so you will see both names in blog posts and older scripts.
The hierarchy
flowchart TB
T[Microsoft Entra ID tenant<br/>users, groups, apps, managed identities] --> RMG[Root management group]
RMG --> MGP[Management group Platform]
RMG --> MGL[Management group Landing zones]
MGP --> SC[Subscription Connectivity]
MGP --> SM[Subscription Management]
MGL --> SP[Subscription Prod]
MGL --> SD[Subscription Dev]
SP --> RG1[Resource group shop-prod-rg]
SP --> RG2[Resource group shop-data-prod-rg]
RG1 --> VM[VM, VNet, load balancer]
RG2 --> DB[Database, storage account]
POL[Azure Policy and RBAC assignments<br/>inherited downward] -.-> MGL
POL -.-> SP
POL -.-> RG1
Everything below a scope inherits role assignments and policies assigned above it. That is the main lever for governing many subscriptions.
Mapping to AWS
| Azure | Closest AWS idea | Important difference |
|---|---|---|
| Entra ID tenant | IAM Identity Center and the identity provider for an organization | One tenant holds people and applications for many subscriptions |
| Management group | Organizational unit in AWS Organizations | Up to six levels deep; policy and RBAC inherit |
| Subscription | AWS account (billing and limits boundary) | Trusted by one tenant; has its own quotas and a spending boundary |
| Resource group | Roughly a CloudFormation stack or a tag-defined group | Every resource lives in exactly one group; deleting the group deletes everything inside |
| Azure RBAC role assignment | IAM policy attached to a principal | Assigned at a scope; roles are reusable definitions |
| Azure Policy | Service control policies plus AWS Config rules | Can audit, deny, or modify and remediate resources |
| Managed identity | IAM role for a workload (instance profile) | System-assigned or user-assigned, no secrets to store |
| Region such as Central India | Region such as ap-south-1 |
Regions are paired and many support Availability Zones |
| Tags | Tags | Not inherited by default; use Policy to enforce or copy them |
Roles and scopes
Access is granted by assigning a role to a principal (user, group, service principal or managed identity) at a scope:
Scope: management group → subscription → resource group → single resource
Built-in: Owner (everything, including granting access)
Contributor (create and manage resources, cannot grant access)
Reader (view only)
and hundreds of service-specific roles, e.g. Storage Blob Data Reader
az login
az account list --output table
az account set --subscription "shop-prod"
# give a group Contributor on one resource group only
az role assignment create --assignee-object-id <group-object-id> --assignee-principal-type Group \
--role Contributor --scope /subscriptions/<sub-id>/resourceGroups/shop-prod-rg
az role assignment list --scope /subscriptions/<sub-id>/resourceGroups/shop-prod-rg --output table
Principles: assign to groups managed in Entra ID, not individuals; use the narrowest scope that works; prefer built-in roles; keep Owner for very few people. Note that control-plane roles (managing the resource) are separate from data-plane roles (reading blobs or secrets), so a Contributor does not automatically read storage data. Use Privileged Identity Management (a Microsoft Entra ID P2 feature) for just-in-time elevation if your licence includes it.
Organise sensibly
- Subscriptions per environment and workload class: separate production from non-production, and put shared networking or management in their own subscriptions. A subscription is also a blast-radius and quota boundary.
- One resource group per application and environment (
shop-prod-rg,shop-dev-rg), so lifecycle and cost can be understood and deleting the group removes the whole environment. Do not mix long-lived data stores with short-lived test resources in one group. - Naming convention that encodes workload, environment, region and resource type (for example
st-shop-prod-cin-001), following the Cloud Adoption Framework’s abbreviations. Storage account names are global, lowercase and 3 to 24 characters. - Tags:
Env,Owner,CostCenter,Application. Enforce them with Azure Policy (deny creation without them, or modify to inherit from the resource group). - Locks: add a
CanNotDeletelock on critical resource groups, remembering that locks apply to everyone including Owners. - Cost control: set a budget with alerts under Cost Management at the subscription or resource group level before creating anything else, and use cost analysis grouped by tag.
az group create --name shop-dev-rg --location centralindia --tags Env=dev Owner=platform CostCenter=1234
az policy assignment create --name require-owner-tag \
--policy "<definition-id-of-require-a-tag-on-resource-groups>" \
--params '{"tagName":{"value":"Owner"}}' --scope /subscriptions/<sub-id>
az group lock create --name protect --lock-type CanNotDelete --resource-group shop-prod-rg
India has regions in Pune (Central India), Chennai (South India) and Mumbai (West India); check which services and Availability Zones each one supports before choosing, and pick a pair deliberately for disaster recovery.
Governance in practice
- Start with a landing zone layout (the Azure landing zone reference architecture from the Cloud Adoption Framework): platform subscriptions for identity, connectivity and management, and landing-zone subscriptions for workloads under management groups, with policy assigned at the management group.
- Use Azure Policy initiatives for baselines (allowed regions, required tags, deny public storage accounts, require encryption) and run them in audit mode first.
- Turn on the Activity Log export to a Log Analytics workspace for audit, and Microsoft Defender for Cloud (at least the free posture features) for recommendations.
- Protect the tenant: MFA for everyone, conditional access policies, two break-glass emergency accounts excluded from conditional access and monitored, and no standing Global Administrators beyond a small group.
- Manage the structure as code (Bicep or Terraform), not by clicking, so management groups, policies and assignments are reviewable.
Quick checks for newcomers
| Question | Where to look |
|---|---|
| Which tenant and subscription am I using? | az account show |
| Why can I not create this resource? | Role assignments at the scope, Policy denials (activity log), and subscription quota |
| Who can access this resource group? | Access control (IAM) blade, Role assignments |
| What is costing money? | Cost Management, Cost analysis, grouped by resource group or tag |
| Is something blocked by policy? | Policy, Compliance, or the error text naming the policy assignment |