Architecture Azure

Azure Landing Zone: Resource Organization — Management Groups, Subscription Strategy, Naming & Resource Group Structure

Where this fits

The Azure Landing Zone (ALZ) conceptual architecture is split into eight design areas grouped into two themes: Environment design (the platform plumbing — Identity, Network Topology and Connectivity, Resource Organization) and Governance & operations (Security, Management, Governance, Platform Automation and DevOps, and the cross-cutting Azure Billing and Microsoft Entra Tenant decision). Resource Organization is part 3 of this series, and it is deliberately foundational: it decides the shape of your tenant — the management group tree that policy and RBAC hang off, the subscriptions that act as your primary unit of scale and isolation, and the naming and tagging conventions that make everything after it queryable, governable, and billable. Get this wrong and every later design area inherits the debt; get it right and Policy, Defender for Cloud, Cost Management, and your platform pipelines all snap into place.

Azure Landing Zone Design Areas — animated overview

The management group hierarchy

What it is

A management group (MG) is a container above the subscription level that lets you apply Azure Policy assignments, Azure RBAC role assignments, and (in some cases) Cost Management views to many subscriptions at once through inheritance. Every Entra tenant has a single, non-deletable Tenant Root Group whose ID equals the tenant ID. You can nest MGs up to six levels deep below root (excluding the root level and the subscription level), and a single MG can hold up to a large number of children, but depth — not width — is what bites you. A subscription can live in exactly one MG at a time; an MG can contain both child MGs and subscriptions.

The thing that makes MGs the load-bearing wall of the whole landing zone is policy and access inheritance: an assignment at a parent flows down to every descendant subscription and resource, and it cannot be broken by a child (a child can only add more restriction, never remove a parent’s Deny or weaken a parent’s RBAC deny assignment). This is exactly why the ALZ reference hierarchy exists — it is an opinionated tree designed so the right guardrails land at the right altitude.

The ALZ reference hierarchy

The Cloud Adoption Framework ships a canonical hierarchy. Under Tenant Root you create a single top-level MG — conventionally named with your org’s intermediate root prefix, e.g. Contoso or simply alz — and beneath it the archetype branches:

Tenant Root Group
└── Contoso  (intermediate / top-level management group)
    ├── Platform
    │   ├── Identity        (DC/Entra Domain Services, identity VMs)
    │   ├── Management       (Log Analytics, Automation, monitoring)
    │   └── Connectivity     (hub vNet, Azure Firewall, ExpressRoute, DNS)
    ├── Landing Zones
    │   ├── Corp             (internal apps, NO public ingress, hub-routed)
    │   └── Online           (internet-facing apps, public endpoints allowed)
    ├── Sandbox              (loose guardrails, fast experimentation)
    └── Decommissioned       (cancelled subs awaiting deletion, locked down)

Why each branch exists:

Management group Purpose Representative guardrails assigned here
Intermediate root (Contoso) The single place to apply org-wide, non-negotiable policy so the Tenant Root Group stays clean and ungoverned-by-default Allowed locations, required tags, deny classic resources, Defender for Cloud auto-provisioning, diagnostic-to-Log-Analytics
Platform Shared services the whole org consumes; tighter change control Stronger RBAC, no public IP exceptions, DDoS, key-vault purge protection
Platform/Identity Domain controllers, Entra Domain Services, identity infra Restrict NSG/UDR changes, deny public network on identity stores
Platform/Management Centralized Log Analytics workspace, Automation, monitoring Enforce diagnostic settings, retention floors
Platform/Connectivity Hub networking, Azure Firewall, ExpressRoute/VPN, private DNS zones Deny IP forwarding exceptions, enforce firewall in path
Landing Zones Where application teams’ subscriptions live Baseline app guardrails: encryption, private endpoints preferred, deny unmanaged disks
Landing Zones/Corp Apps with no public ingress, reachable only via hub Deny public IP on NICs, force routes through hub
Landing Zones/Online Apps that legitimately expose public endpoints Allow public IP but mandate WAF/Front Door, TLS minimums
Sandbox Innovation space, isolated from production guardrails Minimal deny set, budget caps, network isolation from hub
Decommissioned Holding pen for cancelled subscriptions Read-only/locked, blanket deny on new resource creation

How to do it well

Concrete artifacts, decisions, and tools

Subscription strategy and democratization

What it is

A subscription is the primary boundary for scale (quota/limits), billing, policy/RBAC inheritance, and blast-radius isolation in Azure. Resource Organization’s job is to define how you carve workloads into subscriptions and — critically — to democratize their creation: instead of a central team being a bottleneck that hand-builds every subscription, the platform team publishes a subscription vending process that hands application teams a fully-governed, network-connected, policy-compliant application landing zone subscription on demand, within guardrails.

Why it matters

Subscriptions are where Azure’s hard and soft limits apply (e.g. role assignments per subscription, resource groups, public IPs, regional vCPU quotas, route tables). Packing everything into one giant subscription means you hit ceilings, you can’t separate prod from non-prod blast radius, your cost reporting is muddy, and a single noisy team’s quota request can stall everyone. Conversely, a thoughtless explosion of subscriptions creates management sprawl. The ALZ answer is a repeatable unit — the application landing zone — plus a vending machine to mint them consistently.

Subscription design patterns

Pattern Boundary you get Best when
Per workload/application (recommended ALZ default) Clean cost, RBAC, and quota isolation per app Most application landing zones; one app’s family of environments
Per environment (Prod / Non-Prod separate subs) Strong prod blast-radius isolation; different policy strictness per stage Regulated workloads; when prod change control must differ sharply
Per business unit / domain Chargeback alignment, delegated ownership Decentralized orgs with strong BU autonomy
Per geography / data residency Data-sovereignty and locality enforcement Multinationals with residency law (EU, India, etc.)
Shared platform subscriptions One each for Connectivity, Management, Identity Always, for the Platform MG — keep platform out of app subs

The mainstream ALZ guidance: one subscription per application landing zone, and within it use resource groups or separate subscriptions per environment depending on isolation needs. Treat subscriptions as a unit of management and scale, not as something precious — they’re cheap to create and you should be willing to spin up many.

Democratization via subscription vending

Subscription vending is the productized flow that makes democratization real:

  1. A team submits a request (ServiceNow ticket, a PR to a repo, or a self-service portal form) with metadata: app name, owner, cost center, environment, required network connectivity, budget.
  2. An automated pipeline (the subscription vending Terraform/Bicep module, e.g. Azure/lz-vending) creates the subscription under the correct billing scope, places it in the correct management group (so it inherits guardrails the instant it exists), assigns RBAC (the app team gets Owner/Contributor scoped to their sub, not the platform), wires networking (peers the spoke vNet to the hub, registers DNS), applies budgets and tags, and registers required resource providers.
  3. The team receives a ready-to-use, compliant subscription — typically in minutes — with no standing elevated access to the platform.

This is the heart of democratization: application teams move at their own speed inside guardrails they cannot remove, and the platform team governs by policy-as-code rather than by gatekeeping tickets.

Concrete artifacts, decisions, and tools

Naming and tagging standards

What it is

A naming convention is a deterministic, documented scheme for how every Azure resource, resource group, subscription, and management group is named; a tagging strategy is the set of metadata key/value pairs attached to resources, resource groups, and subscriptions to carry information that the name can’t (or shouldn’t) — owner, cost center, environment, data classification, criticality. Together they are what turn a tenant from a pile of GUIDs into a queryable, billable, auditable system.

Why it matters

You cannot manage what you cannot identify. Names are largely immutable for many resource types (you can’t rename a storage account or a VM without recreating it), so the cost of getting naming wrong is rework at scale. Tags drive cost allocation/showback/chargeback in Cost Management, automation targeting (start/stop, backup policy selection), operational routing (who to page), and compliance reporting (which resources hold regulated data). Crucially, tags are not inherited by default — a resource does not automatically get its resource group’s tags — which is precisely why you enforce them with policy.

Designing the naming convention

Microsoft’s CAF recommends a component-based pattern. A practical, hyphen-delimited template:

<resource-type>-<workload/app>-<environment>-<region>-<instance>
Component Example token Notes
Resource type vm, st, rg, kv, vnet, pip, nsg, law Use the CAF abbreviation list; some types (storage, Key Vault) forbid hyphens and have length limits
Workload / app kvfin, payments Short, stable app code
Environment prod, dev, test, uat, sbx Pick a fixed, enumerated set
Region eus2, cin (Central India), weu Map Azure regions to short codes once, org-wide
Instance 001, 002 Zero-padded for sortability

Worked examples:

Resource Name
Resource group for the payments app, prod, Central India rg-payments-prod-cin-001
Storage account (no hyphens, ≤24 chars, globally unique, lowercase) stpaymentsprodcin001
Key Vault (3–24 chars, globally unique) kv-payments-prod-cin
Virtual network vnet-payments-prod-cin-001
Log Analytics workspace law-mgmt-prod-cin-001

Naming rules that save pain: respect per-type length and character constraints (the storage and Key Vault cases above), keep globally-unique names collision-resistant by including app+env+region, decide case policy (lowercase everywhere is safest), and avoid encoding things that change often (don’t bake a team’s name into an immutable resource — use a tag instead).

Designing the tagging strategy

Split tags into mandatory (policy-enforced) and optional/recommended:

Tag key Example value Class Purpose
Environment Production Mandatory Policy strictness, cost split
CostCenter FIN-4412 Mandatory Chargeback/showback in Cost Management
Owner payments-team@contoso.com Mandatory Operational contact / paging
Application payments-core Mandatory Group all resources of one app across RGs
DataClassification Confidential Mandatory Compliance, access reviews
Criticality Tier1 Recommended SLA, DR prioritization
ManagedBy terraform Recommended Distinguish IaC vs click-ops resources
ExpiresOn 2026-12-31 Recommended Sandbox/temp cleanup automation

How to enforce it — the part that actually matters

A standard nobody enforces is a wish. Use Azure Policy as the enforcement engine:

For naming, Azure Policy can’t do arbitrary regex on names natively for every type, so enforce naming through Modify/Deny on name patterns where supported, plus module-level enforcement in IaC (the Terraform/Bicep modules compute names from inputs so humans never type them) and pipeline validation (a CI check, e.g. the Azure naming module Azure/naming/azurerm, that fails the build on a non-conforming name).

Concrete artifacts, decisions, and tools

Resource group structure

What it is

A resource group (RG) is a logical container inside a subscription that holds related resources. Every resource lives in exactly one RG; an RG has its own region (metadata location, independent of where its resources sit), can hold resources from many regions, and is itself a scope for RBAC, Azure Policy, locks, and tags. RGs are the finest grain at which you delegate access and apply guardrails before you reach individual resources.

Why it matters

RG structure determines lifecycle blast radius (deleting an RG deletes everything in it), delegation (you can give a team Contributor on just one RG), policy/lock placement, and how cleanly your cost and resource inventory reads. Two anti-patterns dominate real tenants: the mega-RG (hundreds of unrelated resources in one bucket, impossible to delete or delegate safely) and the RG-per-resource sprawl (no logical grouping, RBAC nightmare). The structuring principle that resolves both: group by shared lifecycle, shared ownership, and shared region. If resources are created, updated, and deleted together by the same team, they belong together.

How to structure them well

Resource group Contents Rationale
rg-payments-prod-cin-app App Service / AKS workload, app config Deployed and scaled as a unit
rg-payments-prod-cin-data SQL, Cosmos, storage — stateful Different lifecycle (you rarely tear down data with the app); stricter locks
rg-payments-prod-cin-net vNet, NSGs, private endpoints, UDRs Networking changes on its own cadence; locked down
rg-payments-prod-cin-shared Key Vault, Log Analytics, managed identities Shared across tiers, longest lifecycle

Concrete artifacts, decisions, and tools

Real-world enterprise scenario

Helios Financial Group is a fictional pan-India digital lender with ~1,400 employees, a regulated workload profile (RBI data-localization obligations), and 60+ application teams migrating from a single sprawling “everything” subscription into Azure properly. Their CCoE adopts the ALZ Terraform accelerator and works the Resource Organization design area end to end.

Management group hierarchy. They deploy an intermediate root MG helios under Tenant Root, leaving Tenant Root assignment-free except for break-glass exclusions. Under helios: Platform (with Identity, Management, Connectivity), Landing Zones (with Corp and Online), Sandbox, and Decommissioned. Because RBI residency matters, they add geo sub-tiers under Landing Zones/CorpCorp-IN-Central and Corp-IN-South — to pin an Allowed locations policy (centralindia, southindia) at exactly the right altitude. They set the default management group to a Quarantine MG so any subscription created outside vending lands locked-down until reviewed. Artifact: a 6-node MG diagram and a policy-assignment matrix showing the Azure Security Benchmark initiative + 11 custom ALZ policies assigned at helios, residency policy at the geo tiers, and Deny public IP at Corp.

Subscription strategy and democratization. Helios chooses one subscription per application landing zone, with separate Prod and Non-Prod subscriptions for any Tier-1 app (blast-radius isolation that RBI auditors like). Platform gets three dedicated subs (Connectivity, Management, Identity). They stand up subscription vending with Azure/lz-vending: a team opens a PR to a landing-zones repo with a small YAML (app name, cost center, environment, criticality, residency, budget). The pipeline mints the subscription under their MCA invoice section, drops it into Corp-IN-Central or Online, peers its spoke vNet to the regional hub (Azure Firewall + ExpressRoute), registers private DNS, assigns the app team Owner scoped to that subscription only (platform access stays behind Entra PIM), and sets a ₹-denominated budget with action-group alerts at 60/90/100%. Outcome: a previously 3-week, ticket-driven subscription request drops to under 20 minutes, fully compliant, with zero standing platform access for app teams.

Naming and tagging standards. They publish <type>-<app>-<env>-<region>-<instance> with cin/sin region codes and a fixed env set (prod/uat/dev/sbx). Examples in their standard: rg-collections-prod-cin-data, stcollectionsprodcin001, kv-collections-prod-cin. Five mandatory tagsEnvironment, CostCenter, Owner, Application, DataClassification — are enforced by a tagging Azure Policy initiative assigned at helios: Deny on missing tags at create, plus Modify/inherit policies so resources inherit CostCenter and Environment from their RG (since tags don’t inherit natively), backed by remediation tasks that tagged 14,000 pre-existing resources. A CI linter using Azure/naming fails any PR with a non-conforming name. Cost Management is then sliced by CostCenter and Application for monthly showback to each business unit.

Resource group structure. Inside each app subscription the vending baseline seeds four RGs — -app, -data, -net, -shared — with CanNotDelete locks on -data, -net, and -shared. The collections DBA team gets Contributor on *-data only. Platform RGs (rg-hub-connectivity-prod-cin, rg-mgmt-logs-prod-cin) live in the platform subs.

Measurable outcome after one quarter: 47 application landing zones vended (target was 40); 100% mandatory-tag compliance on new resources and 96% across the legacy estate (audited live via Azure Resource Graph KQL); subscription provisioning lead time down ~99% (3 weeks → 20 min); first accurate per-business-unit Azure showback report produced; zero residency-policy violations because Allowed locations is pinned at the geo MG tier and inherited everywhere beneath.

Deliverables & checklist

Common pitfalls

  1. Mirroring the org chart in the management group tree. Departments reorganize constantly; your governance tree shouldn’t. Group MGs by guardrail similarity (what policy/RBAC a workload needs), not by who reports to whom — otherwise the next reorg triggers a tenant-wide MG migration.
  2. Assigning policy at the Tenant Root Group. Anything at root is inescapable and hits break-glass accounts; it also makes the root a single point of governance failure. Put org-wide policy at the intermediate root MG and keep Tenant Root clean.
  3. Centralized subscription creation as a manual bottleneck. Hand-building subscriptions via tickets kills cloud velocity and tempts teams into shadow IT. Productize it with subscription vending so teams self-serve inside guardrails they can’t remove.
  4. Assuming tags inherit. Resources do not inherit their resource group’s or subscription’s tags by default, so cost reports come out half-empty. Use Azure Policy Modify/inherit policies plus remediation tasks — and enforce mandatory tags with Deny at create time.
  5. Encoding volatile facts in immutable names. Many resource names can’t be changed without recreating the resource; baking a team name, owner, or cost center into the name guarantees rework. Keep names structural (type/app/env/region) and put changeable metadata in tags.
  6. Mega-resource-groups or RG-per-resource. Both break delegation and lifecycle management. Structure RGs by shared lifecycle, ownership, and region — separate stateful (-data), networking (-net), and shared (-shared) resources and lock the ones you can’t afford to lose.

What’s next

With the tenant’s shape established, part 4 of the Azure Landing Zone Design Areas turns to Security — the Defender for Cloud, encryption, secrets, and zero-trust controls you assign onto the very management group hierarchy and subscriptions you just built.

AzureLanding ZoneResource OrganizationEnterprise
Need this built for real?

Vinod is a Senior Cloud Architect (22+ yrs) — available for Azure / AWS / GCP architecture, landing zones, and migrations.

Work with me

Comments

// part 3 of 8 · Azure Landing Zone Design Areas

Keep Reading