Chapter 11 ยท AZ-305 bridge
The Microsoft Cloud Adoption Framework
Chapters 1 to 10 were about building things right. The last two chapters are about building the right things, the way an architect thinks. The Cloud Adoption Framework (CAF) is Microsoft's guidance for taking a whole organisation to the cloud: why, in what order, with which people, and on which foundation. In the lab you build an Azure landing zone-style management group hierarchy and put guardrails on it.
CAF and the Well-Architected Framework (chapter 12) aren't tested on AZ-104, but they're part of the AZ-305 prerequisites learning path, and AZ-305 questions assume you think in their terms. The chapter 10 cleanup already deleted the lab environment; these two labs are self-contained and create only free resources.
Theory
What CAF is
The Cloud Adoption Framework is a collection of documentation, best practices, templates and tools from Microsoft, based on what worked (and failed) at thousands of customers. It isn't a product you deploy and it doesn't cost anything. Think of it as a playbook with answers to questions like:
- Why are we moving to the cloud, and how do we know it worked?
- Which workloads go first, and what do we do with each one?
- Who does what: which teams and skills do we need?
- What foundation (subscriptions, network, identity, policies) must exist before the first workload lands?
- How do we stay secure, compliant and in budget once we're running?
CAF works at the level of the organisation and its whole cloud estate. The Well-Architected Framework (chapter 12) works at the level of one workload. You need both: CAF builds the city, WAF designs each building.
The CAF lifecycle
CAF is organised into methodologies. Four of them follow each other as you start; three run continuously next to everything else:
Strategy: why are we doing this?
Many cloud projects fail not on technology but because nobody agreed on why they were doing it. The Strategy methodology makes this explicit:
- Motivations: what triggers the move. Often a critical business event: a datacenter lease ending, end of support for hardware or software, a merger, a compliance requirement. Other motivations are about innovation: new products, AI, faster releases, global reach.
- Business outcomes: the measurable results the business expects, with KPIs. For example: "cut infrastructure costs by 20% in two years" (fiscal), "release new features weekly instead of quarterly" (agility), "serve customers in Asia with <100 ms latency" (reach), "99.95% availability for the web shop" (performance).
- Business case: costs vs. expected returns. Azure Migrate's business case and the TCO calculator help here.
- First project: pick a workload that's low risk and visible, to learn and to show early success.
Requirements in AZ-305 case studies are usually business outcomes in disguise: "minimise costs", "minimise administrative effort", "the solution must remain available if a datacenter fails". Before you pick a service, ask which outcome the requirement serves.
Plan: what moves, how, and who does it?
The digital estate and the 5 Rs
The digital estate is your inventory of everything you run: servers, apps, databases, data. You collect it (for example with Azure Migrate discovery, chapter 7) and then decide for each workload what to do with it. This is called rationalisation, and CAF uses the "5 Rs" plus two extra options:
| Option | What you do | Example |
|---|---|---|
| Rehost ("lift and shift") | Move as-is to Azure VMs. Fastest, least change, least cloud benefit. | A VMware VM becomes an Azure VM with Azure Migrate |
| Refactor | Small changes so the app runs on PaaS. | A .NET web app moves from IIS on a VM to App Service |
| Rearchitect | Change the architecture to use cloud capabilities. | A monolith is split into microservices on Container Apps |
| Rebuild | Rewrite the app cloud-native from scratch. | A new app on Functions and Cosmos DB replaces the old one |
| Replace | Stop running it yourself; buy SaaS. | An on-premises CRM is replaced with Dynamics 365 |
| Retire / Retain | Switch it off, or leave it on-premises for now. | An unused reporting server; a mainframe |
The further down the table, the more effort, but also the more cloud benefit (less to manage, better scaling). A datacenter exit with a hard deadline usually means mostly rehost first, and modernise later.
People and skills
Technology is the easy part. CAF's Plan methodology also covers:
- A skills readiness plan: who needs which training (a guide like this one is part of it).
- A cloud adoption plan: the backlog of workloads, in waves, often tracked in Azure DevOps (CAF provides a template).
- Teams and roles. Typical ones: a cloud strategy team (business and IT leaders), a cloud adoption team (does the migrations), a cloud platform team (builds and runs the landing zones), a cloud governance team and a security team. In mature organisations a Cloud Center of Excellence (CCoE) brings these together and spreads best practices.
Ready: Azure landing zones
Before the first workload moves, you need a prepared environment with identity, networking, policies, monitoring and subscriptions in place. CAF calls this an Azure landing zone. The idea: the platform is built once by a central team, and every workload "lands" in a subscription that's already governed and connected.
- Platform landing zones: subscriptions with shared services that every workload uses: identity (e.g. domain controllers), management (central Log Analytics, automation), connectivity (the hub VNet, firewall, VPN/ExpressRoute gateways, DNS).
- Application landing zones: one or more subscriptions per workload, created from a template (subscription vending), peered to the hub and covered by inherited policies.
You built a small version of this in this guide: vnet-hub with shared DNS was a platform piece, vnet-spoke was the workload's network.
The management group hierarchy
The Azure landing zone reference architecture organises subscriptions in a management group hierarchy that follows what kind of workload runs there, not the org chart. Policies and RBAC are assigned at the management groups, so every subscription inherits them (chapter 2):
- Intermediate root: never assign at the Tenant Root Group directly; use your own top group so you can test changes and keep control.
- Corp: internal apps, connected to the hub, typically deny public IPs and require private endpoints.
- Online: internet-facing apps, public endpoints allowed but behind a WAF.
- Sandbox: for learning and experiments, not connected to the corporate network, often with budgets.
- Decommissioned: subscriptions on their way out, with policies that block new resources.
Design areas and how to deploy
CAF describes the decisions behind a landing zone in eight design areas. You already know most of them from this guide:
| Design area | Typical decisions | Chapter |
|---|---|---|
| Billing & Entra tenant | Enrollment type, how many tenants (usually one) | 1 |
| Identity & access management | RBAC model, PIM, break-glass accounts, Conditional Access | 1, 2 |
| Resource organisation | Management groups, subscriptions, naming and tagging | 2, this chapter |
| Network topology & connectivity | Hub-and-spoke or Virtual WAN, IP plan, DNS, private endpoints | 3, 6, 7 |
| Security | Defender for Cloud, Key Vault, encryption, Zero Trust | 6 |
| Management | Central Log Analytics, Update Manager, backup and DR | 9, 10 |
| Governance | Azure Policy initiatives, cost management, compliance | 2 |
| Platform automation & DevOps | Everything as code, pipelines for the platform | 4 |
You don't have to build all of this by hand. Microsoft provides landing zone accelerators: a portal-based deployment, and Bicep and Terraform modules (based on Azure Verified Modules). Small organisations can start small and expand; large ones usually deploy the full reference architecture from day one.
Adopt: migrate and innovate
Adopt is where workloads actually move or get built:
- Migrate: move workloads in waves, each following assess โ deploy โ release. Tools: Azure Migrate, Database Migration Service and Data Box (chapter 7). Most early waves are rehost.
- Modernize: refactor and rearchitect migrated workloads to PaaS to get more cloud value.
- Innovate (cloud-native): build new solutions with cloud services, for example AI, analytics and serverless (chapter 8).
Govern, Secure and Manage
These three run all the time, across the whole estate:
- Govern: a governance team identifies risks (data leaving the EU, runaway costs, untagged resources), writes policies ("all resources must be in EU regions"), enforces them with Azure Policy, RBAC, budgets and tags (chapter 2), and monitors compliance. The aim is guardrails that keep teams safe without slowing them down.
- Secure: applies Zero Trust and defense in depth (chapter 6) to the estate: security roles, posture management with Defender for Cloud, incident response, and keeping the business running during attacks.
- Manage: run the cloud day to day. Set an operations baseline for everything (monitoring, patching, backup), then add more for critical workloads based on their criticality and the business commitments (SLAs, RTO, RPO). Tools: Azure Monitor (chapter 9), Azure Update Manager, Backup and Site Recovery (chapter 10).
Naming and tagging conventions
A small but very practical part of CAF (and part of the Ready methodology): agree on names and tags before you create anything, because most Azure resources can't be renamed.
CAF recommends a name built from components, for example:
<resource type>-<workload>-<environment>-<region>-<instance>
vm-sqlshop-prod-weu-001 rg-webshop-dev-weu vnet-hub-prod-weu-001
- The type prefix uses CAF's abbreviations list:
rg,vnet,snet,vm,nsg,pip,lbe/lbi,kv,log,stโฆ This guide used them from chapter 2 on. - Some resources have stricter rules: storage accounts allow only lowercase letters and digits (3โ24) and must be globally unique, which is why yours was called
staz104xx01without dashes.
Tags (chapter 2) carry information that doesn't fit in a name. CAF's common minimum set: workload/application name, owner, environment, cost center or business unit, criticality and data classification. Enforce the important ones with Azure Policy ("Require a tag on resource groups", "Inherit a tag from the resource group").
The AZ-305 "design governance" questions are CAF questions: where in the management group hierarchy to assign a policy, how many subscriptions to use (one per workload and environment is the landing zone default), and how to separate platform and workload responsibilities. When in doubt, picture the landing zone diagram above and ask which box the requirement belongs to.
- Module: Introduction to the Microsoft Cloud Adoption Framework
- Cloud Adoption Framework overview
- CAF Strategy
- CAF Plan
- What is an Azure landing zone?
- Landing zone design areas
- Management groups in a landing zone
- CAF Govern
- Define your naming convention
- Abbreviation recommendations for Azure resources
- Define your tagging strategy
Self-check
1. A company must leave its datacenter in 9 months because the lease ends. In CAF terms, what is this?
B. It's why they move. A business outcome would be measurable, like "reduce hosting costs by 15%".
2. An on-premises .NET web app moves to App Service with only configuration changes. Which R is that?
C. Small changes to run on PaaS. Rehost would be a VM; rebuild is a rewrite; replace is SaaS.
3. Internal workloads must never get a public IP address. Where do you assign a "deny public IP" policy in the landing zone hierarchy?
A. Corp holds internal workloads; Online workloads need public endpoints. Assign at the highest level where it applies to everything below, and no higher.
4. Which subscriptions belong in the Platform management group?
D. Platform is for shared services. A, B and C go to Landing zones, Sandbox and Decommissioned.
5. What is the main difference between CAF and the Well-Architected Framework?
B. Use them together: CAF for the estate and its foundation, WAF for each workload on it.
6. Why do Microsoft's naming guidelines matter so much before you deploy?
C. Renaming usually means recreating, so the convention has to be in place first.
Lab: from strategy to a governed landing zone skeleton
You play the cloud architect for a fictional company, Fabrikam Logistics: first on paper (strategy, rationalisation, naming), then in Azure (a landing zone management group hierarchy with policies). Everything you create in Azure is free, and the last step removes it.
Fabrikam runs 120 servers in a rented datacenter whose lease ends in 14 months. Leadership wants lower hosting costs and faster delivery of new features for its customer portal. Four of its applications:
- TrackIt: a parcel-tracking web app in ASP.NET on IIS, maintained in-house.
- FleetDB: a Windows server running a vendor's fleet-planning software that only supports Windows Server; the vendor has no cloud version.
- HR-Pay: an on-premises HR and payroll package. The vendor offers the same product as SaaS.
- ReportBox: an old reporting server. Usage logs show nobody has opened it in 18 months.
The variables from chapter 0 ($RG, $LOC, $LOC2, $INIT, $ST, $ACR, $MYIP) load automatically in every terminal; if they don't, run . ~/az104.env. Any other variable a task needs is set at the top of that task's Azure CLI solution, so every solution works on its own in a fresh terminal.
-
Task ยท on paper
Write Fabrikam's cloud strategy on one page
Write down:
- the motivation (what's triggering the move);
- two business outcomes, each with a measurable KPI;
- which of the four apps you'd move first, and why.
Done when- Each outcome has a number and a deadline in it.
- Your first workload is low risk and its success is visible.
Example answer
- Motivation: a critical business event, the datacenter lease ending in 14 months. Secondary: innovation for the customer portal.
- Outcome 1 (fiscal): hosting costs at least 20% lower than the current datacenter contract within 24 months.
- Outcome 2 (agility): TrackIt releases go from quarterly to every two weeks within 12 months of moving.
- First workload: TrackIt. In-house code (you control it), customer-visible (a quick win to show), and a good learning case for PaaS. Retiring ReportBox is an even easier first "win", but it doesn't teach the team anything about Azure.
-
Task ยท on paper
Rationalise the four applications
Choose one R (rehost, refactor, rearchitect, rebuild, replace, retire or retain) for each application, with one sentence of reasoning, and name the Azure service or tool you'd use.
Done when- All four apps have an R, a reason and a target.
Example answer
App R Why and how TrackIt Refactor In-house ASP.NET code can move to App Service with small changes (App Service migration assistant); slots make frequent releases easy, which serves outcome 2. FleetDB Rehost Vendor software tied to Windows Server: move the VM with Azure Migrate server migration. Revisit when the vendor offers something better. HR-Pay Replace The vendor's SaaS removes servers, patching and upgrades entirely. ReportBox Retire Unused for 18 months. Archive its data to a storage account (Archive tier, chapter 7), then switch it off. -
Task ยท on paper
Agree on names and tags
Using CAF's naming pattern and abbreviations, write the names for TrackIt's production resources in West Europe: its resource group, App Service plan, web app, key vault and storage account. Then list the tags every TrackIt resource group must carry.
Done when- Every name follows one pattern, and the storage account name is valid.
- You have at least four tags, including an owner.
Hint
Look up the abbreviations for App Service plan, web app, key vault and storage account in the CAF abbreviations list (linked under "Read more").
Example answer
rg-trackit-prod-weu-001 asp-trackit-prod-weu-001 app-trackit-prod-weu-001 kv-trackit-prod-weu-001 (max 24 characters, globally unique) sttrackitprodweu001 (lowercase letters and digits only, globally unique)Tags:
workload=trackit,env=prod,owner=<team or person>,costcenter=<code>,criticality=high,dataclass=confidential. -
Task
Build the landing zone management groups
Create this management group hierarchy under the Tenant Root Group (IDs and display names may be the same):
mg-az104 (intermediate root) โโโ mg-az104-platform โ โโโ mg-az104-identity โ โโโ mg-az104-management โ โโโ mg-az104-connectivity โโโ mg-az104-landingzones โ โโโ mg-az104-corp โ โโโ mg-az104-online โโโ mg-az104-sandbox โโโ mg-az104-decommissionedDone when- Management groups in the portal shows the tree exactly like this.
- You can say which of Fabrikam's four apps (after your rationalisation) would get a subscription under which group.
Hint
Create parents before children. In the CLI,
--parenttakes the parent's ID. New groups can take a minute to appear in the portal tree.Solution ยท Portal
- Management groups โ Create: ID
mg-az104, display namemg-az104. It's created under the Tenant Root Group. - Open
mg-az104โ Create (inside it):mg-az104-platform,mg-az104-landingzones,mg-az104-sandbox,mg-az104-decommissioned. - Open
mg-az104-platformโ create the three platform children; openmg-az104-landingzonesโ createmg-az104-corpandmg-az104-online.
Mapping: TrackIt production โ Online (customer-facing); FleetDB โ Corp (internal); HR-Pay and ReportBox โ no subscription (SaaS and retired).
Solution ยท Azure CLI
az account management-group create -n mg-az104 --display-name mg-az104 for C in platform landingzones sandbox decommissioned; do az account management-group create -n mg-az104-$C --display-name mg-az104-$C --parent mg-az104 done for C in identity management connectivity; do az account management-group create -n mg-az104-$C --display-name mg-az104-$C --parent mg-az104-platform done for C in corp online; do az account management-group create -n mg-az104-$C --display-name mg-az104-$C --parent mg-az104-landingzones done az account management-group show -n mg-az104 --expand --recurse \ --query "{root:name, children:children[].{name:name, children:children[].name}}" -o json -
Task
Put guardrails at the right level
Assign three built-in policies, each at the highest management group where it should apply and no higher:
- Allowed locations: only your two lab regions, for everything Fabrikam owns.
- Require a tag on resource groups: tag
owner, for all workload subscriptions (not platform, not sandbox). - Not allowed resource types: block
Microsoft.Network/publicIPAddressesfor internal workloads only.
Done when- Three assignments exist, on
mg-az104,mg-az104-landingzonesandmg-az104-corp. - Opening Policy โ Assignments with scope
mg-az104-corpshows all three (two inherited). Why?
Hint
Assignment names at management group scope can be at most 24 characters. Built-in definition IDs: Allowed locations
e56962a6-4747-49cd-b67b-bf8b01975c4c, Require a tag on resource groups96670d01-0a4d-4649-9c89-2d3abc0a5025, Not allowed resource types6c112d4e-5bc7-47ae-a041-ea2d9dccd749.Solution ยท Portal
- Policy โ Assignments โ Assign policy. Scope: management group
mg-az104. Definition Allowed locations, nameallowed-locations; Parameters: your two regions. Create. - Again, scope
mg-az104-landingzones, definition Require a tag on resource groups, namerequire-owner-tag, tag nameowner. - Again, scope
mg-az104-corp, definition Not allowed resource types, namedeny-public-ip, typeMicrosoft.Network/publicIPAddresses. - Assignments, scope filter
mg-az104-corp: you see all three, because assignments inherit down the hierarchy (chapter 2).
Solution ยท Azure CLI
# Variables for this task MG=/providers/Microsoft.Management/managementGroups az policy assignment create -n allowed-locations --scope $MG/mg-az104 \ --policy e56962a6-4747-49cd-b67b-bf8b01975c4c \ --params "{\"listOfAllowedLocations\":{\"value\":[\"$LOC\",\"$LOC2\"]}}" az policy assignment create -n require-owner-tag --scope $MG/mg-az104-landingzones \ --policy 96670d01-0a4d-4649-9c89-2d3abc0a5025 --params '{"tagName":{"value":"owner"}}' az policy assignment create -n deny-public-ip --scope $MG/mg-az104-corp \ --policy 6c112d4e-5bc7-47ae-a041-ea2d9dccd749 \ --params '{"listOfResourceTypesNotAllowed":{"value":["Microsoft.Network/publicIPAddresses"]}}' az policy assignment list --scope $MG/mg-az104-corp --disable-scope-strict-match \ --query "[].{name:name, scope:scope}" -o table -
Task ยท optional, lab subscription only
Land a subscription in Corp and test the guardrails
Move your lab subscription into
mg-az104-corp. Then try to create a resource group without anownertag, then one with it, and in that group a public IP. Afterwards, move the subscription back to the Tenant Root Group.Done when- The untagged resource group and the public IP were both refused with
RequestDisallowedByPolicy, and you know which assignment blocked each. - The subscription is back under the Tenant Root Group and the test group is deleted.
Hint
Policy can take up to 30 minutes to take effect after a move. If the first attempt succeeds, delete what you made and try again later. Don't do this with a subscription that other people use.
Solution ยท Azure CLI
# Variables for this task MG=/providers/Microsoft.Management/managementGroups SUB=$(az account show --query id -o tsv) TENANT=$(az account show --query tenantId -o tsv) az account management-group subscription add -n mg-az104-corp --subscription $SUB # wait a few minutes, then: az group create -n rg-caf-test -l $LOC # refused: require-owner-tag az group create -n rg-caf-test -l $LOC --tags owner=$INIT # allowed az network public-ip create -g rg-caf-test -n pip-caf-test --sku Standard # refused: deny-public-ip az group delete -n rg-caf-test --yes az account management-group subscription add -n $TENANT --subscription $SUB # back to the rootThe Tenant Root Group's ID is your tenant ID, which is why
$TENANTworks as a management group name. - The untagged resource group and the public IP were both refused with
-
Task
Clean up
Remove the three policy assignments and all ten management groups. Make sure your subscription isn't under any of them.
Done whenaz account management-group list --query "[?starts_with(name,'mg-az104')].name" -o tsvreturns nothing (or onlymg-az104-labfrom chapter 2, if you kept it).
Hint
A management group can only be deleted when it has no children: delete from the leaves up.
Solution ยท Azure CLI
# Variables for this task MG=/providers/Microsoft.Management/managementGroups az policy assignment delete -n deny-public-ip --scope $MG/mg-az104-corp az policy assignment delete -n require-owner-tag --scope $MG/mg-az104-landingzones az policy assignment delete -n allowed-locations --scope $MG/mg-az104 for C in identity management connectivity corp online; do az account management-group delete -n mg-az104-$C; done for C in platform landingzones sandbox decommissioned; do az account management-group delete -n mg-az104-$C; done az account management-group delete -n mg-az104
- You can explain CAF's methodologies and where landing zones, the 5 Rs and naming conventions fit.
- You built and removed a landing zone management group hierarchy with policies at three levels.
Cost: nothing. Management groups and policy assignments are free.