
Why Cloud Migrations Fail: The Expensive Trap of Lift-and-Shift
You made it past discovery. Now here's where most teams celebrate too early.
This is Lesson 2 of my five-part series, Why Cloud Migrations Fail. Lesson 1 covered the discovery mistake — skipping the inventory and dependency mapping that every good migration is built on. But getting discovery right doesn't guarantee a successful migration. It just clears the way for the next mistake, and it's one of the most common ones I see: lift-and-shift without optimizing anything.
Once discovery is done, teams lift everything as-is and shift it straight to the cloud. No optimization, no right-sizing — just moving the mess, and the cost, along with it.
Lift-and-shift feels fast. It hits the deadline. It looks like progress. But if you migrate a server running at 15% utilization, you don't fix the waste — you just relocate it. Same over-provisioned CPU, same bloated storage, same idle RAM. Only now you're paying cloud rates for it every single month.
This is the mistake most people don't see coming, because on the surface it looks like a win. The migration completed on time. The servers are in the cloud. Leadership sees green checkmarks. Then the first full billing cycle comes in, and the "win" starts looking like next quarter's budget overrun.
Why This Happens: On-Prem Habits Don't Translate to the Cloud
In the on-premises world, over-provisioning was the default because you had to buy hardware for maximum possible peak demand. That often meant paying for 80% unused capacity, sitting idle, just in case. It was wasteful, but it was a fixed, sunk cost — buy it once, live with it for years.
The cloud doesn't work that way, and that's exactly why lift-and-shift is so dangerous. In the cloud, every gigabyte of unused RAM and every underutilized vCPU isn't a sunk cost anymore — it's a recurring monthly charge. The waste that used to be invisible on a five-year-old server purchase order becomes a visible, itemized line on next month's cloud bill. Moving an over-provisioned environment into the cloud doesn't eliminate that waste. It puts a meter on it.
A Real Example: The 32-vCPU Server Running at 8%
Here's a pattern I see constantly on real assessments. A client has a VM provisioned with 32 vCPUs. When you pull the actual utilization data — not the allocated spec sheet, the real 90-day performance history — that VM is averaging just 8% utilization.
If that server gets lifted and shifted as-is, the client pays cloud rates for 32 vCPUs of capacity every month, indefinitely, to run a workload that needs a fraction of that. The fix isn't complicated: analyze the last 90 days of CPU, memory, and I/O metrics before the first server is even replicated, and migrate to the cloud instance size that matches actual usage — not allocated usage. That single step, done before migration instead of after, saves real money from the very first billing cycle instead of six months into a "we'll optimize it later" cleanup project that rarely happens.
This is the core difference between modeling a migration off what a client currently has provisioned versus what they actually use. Most competitors in this space model based on current allocated hardware size. That's inefficient by design — it just carries the on-prem waste forward and gives it a cloud price tag.
Real Optimization: What Right-Sizing Actually Requires
Real optimization means right-sizing before you cut over — not guesswork, not "we'll revisit it in Q3." The baseline numbers worth holding onto:
● 20% headroom on compute — enough buffer to absorb normal variability without over-provisioning again
● 30% headroom on storage — accounting for growth without paying for capacity that sits empty for years
But right-sizing the instance is only the first layer. A complete cost optimization strategy — the kind that actually protects the ROI a migration was supposed to deliver — works in layers:
1. Right-size based on utilization, not allocation. This is the foundation everything else builds on. If an application only uses 10% of its CPU and 15% of its RAM on average, provision a smaller instance. This alone eliminates the fastest and largest source of waste.
2. Add auto-scaling. Static right-sizing addresses the size of the box. Auto-scaling addresses how often you're paying for that size. Instead of keeping a large fleet running 24/7, provision minimum resources and let the cloud scale up automatically for peak traffic — and just as importantly, scale back down when demand drops. You only pay for what you're using at that exact moment.
3. Layer in commitment pricing for stable workloads. Once workloads are running reliably and right-sized, it's time to address the price of the box, not just the size. Reserved Instances and savings plans let you commit to a capacity type for one or three years in exchange for discounts often reaching 50% or more off on-demand pricing. Spot instances go further — up to 90% off — for fault-tolerant, flexible, or stateless workloads like batch processing or rendering, where the cloud provider reclaiming capacity on short notice isn't a dealbreaker. The strategy is blending these: reserved capacity or savings plans for foundational workloads, spot instances for the workloads that can tolerate interruption.
4. Rethink the architecture itself, not just the pricing model. The deepest savings don't come from buying resources cheaper — they come from eliminating the need to buy them at all. Serverless architecture means you stop paying for idle servers entirely; you only pay when code is actually running. Non-production environments are another major, frequently ignored opportunity — dev and test rarely need production-grade specs, and reducing their footprint plus scheduling shutdowns outside business hours routinely delivers savings of 60% or more.
5. Treat optimization as continuous, not a one-time event. Cloud resources are dynamic. Prices, usage patterns, and available services change constantly. A migration that was perfectly right-sized on cutover day can drift out of alignment within months if nobody's watching. Tools like AWS Cost Explorer, Azure Cost Management, and AWS Trusted Advisor exist specifically to surface underutilized resources and unattached volumes on an ongoing basis. For clients running multi-cloud environments
Signs a Migration Plan Is About to Repeat the On-Prem Waste
Before workloads move, these are the tells that optimization is being skipped in favor of hitting a deadline:
● The migration plan sizes cloud instances off the current allocated spec sheet, not off real utilization data. If the target instance size matches what's currently provisioned rather than what's actually consumed, the waste is being carried forward, not eliminated.
● "We'll right-size after go-live" is the plan. In practice, this rarely happens. Once a migration is declared complete and the team moves to the next project, revisiting instance sizes drops to the bottom of the priority list — usually until finance asks why the cloud bill doubled.
● Dev and test environments are provisioned identically to production, with no shutdown schedule outside business hours. This is one of the easiest wins available, and it's the one most often skipped simply because nobody owns it.
● There's no purchasing strategy beyond on-demand pricing. Stable, predictable workloads sitting entirely on on-demand rates — with no reserved instances or savings plans in place — means paying full price for capacity that could be discounted 50% or more.
● Nobody owns cost visibility after cutover. If there's no recurring review of spend, no one will notice that a right-sized environment on day one has drifted back toward over-provisioned by month six, as new workloads get added without the same scrutiny the original migration received.
If more than one of these applies to a migration in progress, the fix isn't to rush optimization in after the fact — it's to pull the utilization data now, before more workloads land on top of the ones that were never right-sized to begin with.
This is precisely the layer the MWC Cloud Assessment Tool is built around — a right-sizing calculator with 20% compute and 30% storage headroom baked in, migration wave planning, and cost estimate modeling across AWS, Azure, and GCP, so the instance size a client migrates to is based on 90 days of real usage instead of whatever they happened to have provisioned on-prem.
Discovery Tells You What You Have. Optimization Tells You What You Actually Need.
That distinction is the entire lesson. Skip optimization, and the cloud doesn't save the client money — it just builds them faster, more scalable infrastructure for the exact same waste they had on-prem, with a monthly invoice that makes the waste impossible to ignore.
The teams that get this right don't treat right-sizing as a nice-to-have cleanup step for later. They build it into the migration plan from day one — analyzing real utilization data before the first server is replicated, and pairing that with a purchasing strategy and an architecture that keeps optimizing long after go-live.
Lesson 1 was discovery. Lesson 2 is optimization. In Lesson 3, we'll look at what happens when the migration strategy itself is wrong for the workload — because right-sizing a server doesn't help much if it never belonged in that cloud environment to begin with.
If you're planning a migration: don't guess. Assess. And once you've assessed, right-size before you migrate — not after.
This post is based on Lesson 2 of the "Why Cloud Migrations Fail" video series, part of the Modernize Without Compromise Executive Blueprint.
We modernize without compromise.
