Cloud Modernization Frameworks: A Step-by-Step Migration Roadmap

A cloud modernization framework is a repeatable, phased method for moving legacy applications to the cloud and improving them along the way. The roadmap we recommend has six phases: discover what you run, decide a disposition for each application, prepare a governed landing zone, migrate in small waves, modernize incrementally, and operate against measurable outcomes. The order matters more than the tooling. Most migrations that stall do so because a team skipped discovery or tried to rearchitect everything at once.
This post walks through each phase with the artifacts, decisions, and checks we find useful in practice.
Why Migrations Stall Without a Framework
If you lead a platform or infrastructure team, you have probably seen some of these:
- Unknown dependencies. A "simple" lift-and-shift breaks because a batch job on another server reads a shared file path nobody documented.
- Rearchitecture paralysis. Every application is treated as a candidate for microservices, so nothing ships for quarters.
- Governance arrives late. Accounts, networking, and identity are configured ad hoc, then must be rebuilt once security reviews catch up.
- No definition of done. The workload is "in the cloud," but cost, reliability, and delivery speed are no better than before.
The major cloud providers each publish an adoption framework that addresses these problems at the organizational level: the AWS Cloud Adoption Framework, the Microsoft Cloud Adoption Framework for Azure, and the Google Cloud Adoption Framework. They are worth reading. The roadmap below is a practitioner's distillation of the patterns those frameworks share, focused on what an engineering team actually does week to week.
A Six-Phase Cloud Modernization Framework
Phase 1: Discover and Inventory
You cannot plan a migration for systems you have not catalogued. The goal of discovery is a single, queryable inventory that captures each application's technical shape and its business context.
Combine automated discovery (agent-based or network-flow tools from your cloud provider or a third party) with interviews of application owners. Tools find connections. People explain why those connections exist and which ones are business-critical.
We keep the inventory as structured data in version control so it can be diffed, reviewed, and scored:
# inventory/order-service.yaml
name: order-service
owner: commerce-platform-team
business_criticality: high # high | medium | low
runtime: java-8 / tomcat-8.5
data_stores:
- type: oracle-12c
size_gb: 420
shared_with: [billing-batch, reporting-etl]
inbound_dependencies: [web-storefront, mobile-api]
outbound_dependencies: [payment-gateway, smtp-relay]
compliance_scope: [pci]
change_frequency: weekly
known_constraints:
- "Hardcoded IPs in config for payment-gateway"
- "Nightly batch writes to /mnt/shared/exports"
Exit criteria for this phase: every in-scope application has an owner, a dependency list validated by that owner, and a criticality rating.
Phase 2: Decide a Disposition for Each Application
With the inventory in hand, assign each application a migration strategy. The industry vocabulary here is the "Rs." Gartner introduced a five-R model in 2010, and AWS later expanded it into what is now commonly described as the 7 Rs:
- Retire: decommission it.
- Retain: leave it where it is, for now.
- Rehost: lift and shift to cloud VMs.
- Relocate: move at the hypervisor level (for example, VMware workloads) without changing the VMs.
- Repurchase: replace with a SaaS product.
- Replatform: make targeted changes, such as moving to a managed database or containers.
- Refactor / Rearchitect: redesign for cloud-native capabilities.
The mistake we see most often is defaulting to Refactor because it sounds most "modern." Refactoring is the most expensive option and should be reserved for applications where it unlocks clear business value. A simple, transparent scoring rubric keeps the conversation honest:
def suggest_disposition(app: dict) -> str:
"""First-pass heuristic. A human makes the final call."""
if app["business_value"] == "low" and app["usage"] == "minimal":
return "retire"
if app.get("saas_equivalent_available") and not app.get("differentiating"):
return "repurchase"
if app.get("regulatory_hold") or app.get("hardware_dependency"):
return "retain"
if app["change_frequency"] in ("daily", "weekly") and app.get("differentiating"):
return "refactor"
if app.get("uses_commercial_db") or app.get("self_managed_middleware"):
return "replatform"
return "rehost"
The heuristic is not the decision. It is a starting point that forces each exception to be argued explicitly, which is where the useful conversations happen.
Phase 3: Prepare the Landing Zone
A landing zone is the pre-configured, governed cloud foundation that workloads move into: account or subscription structure, network topology, identity and access, logging, and guardrails. Build it before the first production workload moves, and build it as code.
At minimum, your landing zone should define:
- Account/subscription hierarchy separating production, non-production, security tooling, and shared services.
- Network design, including hybrid connectivity back to on-premises for the duration of the migration.
- Identity federation with your existing identity provider, plus least-privilege role patterns.
- Centralized logging and audit that application teams cannot disable.
- Policy guardrails (for example, blocking public storage buckets or unapproved regions).
Each provider publishes reference guidance for this: AWS Control Tower, the Azure landing zone design areas, and Google's landing zone design documentation.
Phase 4: Migrate in Waves
Group applications into waves based on the dependency graph from Phase 1. Applications that talk to each other heavily should usually move together, or you will pay for latency and egress across the hybrid link.
A practical wave plan:
- Wave 0 (pilot): one or two low-criticality applications with few dependencies. The goal is to test the landing zone, the runbook, and the rollback process, not to move volume.
- Waves 1 to N: progressively larger and more critical groups, each with a written runbook, a cutover window, and a tested rollback path.
- Final wave: the hardest, most entangled systems, tackled once the team has real experience.
For every cutover, document the data synchronization approach (replication, snapshot and restore, or dual writes), the DNS or traffic-switch mechanism, and the conditions that trigger rollback. Rehearse it in non-production first.
Phase 5: Modernize Incrementally
Migration and modernization are separate activities. Once a workload is stable in the cloud, you can improve it without the pressure of a data center exit date.
For larger systems, we favor the Strangler Fig pattern described by Martin Fowler: put a routing layer in front of the legacy application and peel off functionality into new services one route at a time.
# Routing layer: new services take over specific paths;
# everything else still goes to the legacy monolith.
upstream legacy_monolith { server legacy.internal:8080; }
upstream orders_service { server orders.internal:8080; }
server {
listen 443 ssl;
location /api/orders/ {
proxy_pass http://orders_service;
}
location / {
proxy_pass http://legacy_monolith;
}
}
Each extracted route is a small, reversible change. If the new service misbehaves, you point the route back. This is the core of practical application modernization: small steps, each one independently valuable.
Phase 6: Operate, Measure, and Optimize
Define "done" in measurable terms before you start, then track it. Useful signals include:
- Delivery performance: the four DORA metrics (deployment frequency, lead time for changes, change failure rate, and time to restore service).
- Reliability: service-level objectives agreed with the business, not just uptime.
- Cost: unit cost per transaction or per customer, reviewed regularly under a FinOps practice. The FinOps Foundation framework is a good reference.
- Security posture: findings from policy-as-code and configuration scanning, trended over time.
The provider well-architected frameworks (AWS, Azure, Google Cloud) offer structured review questions for this ongoing optimization.
Common Failure Modes to Plan Around
- Treating the roadmap as linear. In practice, Phase 6 findings feed back into Phase 2 dispositions. Revisit them.
- Underestimating data. Large or shared databases often dictate wave boundaries and cutover windows more than application code does.
- Skipping the pilot. Wave 0 exists to surface landing zone and runbook gaps cheaply.
- Leaving ownership vague. Every migrated workload needs a named team responsible for running it in the cloud.
- Ignoring industry constraints. Data residency, audit, and retention requirements vary by sector and can change the target architecture. Reviewing how these play out in regulated industries early saves rework.
Where to Start This Quarter
If you are at the beginning of a legacy to cloud program, a reasonable first 90 days looks like this:
- Stand up the inventory as code and get owner sign-off on the top 20 applications by criticality.
- Run the disposition rubric and hold a review where every Refactor decision must be justified.
- Build the landing zone in infrastructure as code, with security and networking stakeholders in the review loop.
- Pick a Wave 0 pilot and complete one full cutover, including a rehearsed rollback.
If you need senior engineers to accelerate any of these steps, you can see the kinds of cloud and platform engineering capabilities we bring to this work.
FAQ
What is a cloud modernization framework?
A cloud modernization framework is a structured, phased approach for moving applications to the cloud and improving them over time. It typically covers discovery, migration strategy selection, landing zone preparation, wave-based migration, incremental modernization, and ongoing optimization.
What is the difference between cloud migration and application modernization?
Migration moves a workload to a cloud environment, often with minimal change (rehosting or relocating). Application modernization changes the application itself, for example by adopting managed services, containers, or a service-oriented architecture. Many teams migrate first and modernize afterward to reduce risk.
How do I choose between rehosting and refactoring?
Rehost when speed matters and the application is stable, rarely changed, or not strategically differentiating. Refactor when the application changes frequently, is core to the business, and its current architecture limits delivery speed or scalability. A scoring rubric helps, but the final call should involve both engineering and business owners.
What is a landing zone, and why build it first?
A landing zone is the governed cloud foundation covering accounts, networking, identity, logging, and policy guardrails. Building it first means every migrated workload inherits consistent security and operational controls, rather than each team inventing its own and needing remediation later.
How long does a cloud migration roadmap take?
It depends on the number of applications, their interdependencies, data volumes, and regulatory constraints. Rather than relying on generic estimates, run discovery and a pilot wave first. Your actual pilot results give you a far more reliable basis for planning the remaining waves.


