How do you migrate workloads off IDC servers to the cloud? A step-by-step path: asset inventory, 6R classification, migration waves, data migration options, DNS cutover and rollback criteria, plus the six most common pitfalls.
The hard part of migrating off IDC servers is not moving them. Installing an image, copying files, spinning up a cloud instance — none of that is difficult. What turns a migration into a multi-month, over-budget project is three things nobody calculates up front: what systems you actually have, how they depend on each other, and how you get back if it goes wrong.
The path in one line: take inventory → assign a 6R strategy to each system → plan waves → pilot on a low-risk system → move data and traffic in batches → keep a real rollback window → verify before decommissioning the old machines. Skip any step and you pay for it twice later.
Do not start moving yet: a migration is not a machine move
Many first-time migrations fail not because the technology choice was wrong but because the goal was defined wrong. Write the goal as "move 30 servers to the cloud" and the project dies the moment the move finishes: nothing improved, costs went up, and nobody knows what to do next. For the full phase breakdown and what each phase has to deliver, see the cloud migration solution.
Three verifiable goals work far better:
- Capability parity or better: availability, scale-out speed, and recovery time (often written as RTO under 30 minutes, RPO under 5) genuinely beat the on-premises setup
- Predictable cost: you can explain every line of the bill, spot idle resources, and bound monthly variance
- Maintainability: a new engineer can stand up an environment from documentation in 30 minutes instead of relying on one veteran memory
Write those three down and every later trade-off has a basis. "Rehost only, change nothing" is reasonable under that goal. But if your goal is recovery time from 4 hours down to 30 minutes, rehosting alone cannot get you there and the database has to move too.
Judge success by charts, not by geography: availability and latency curves, the cost curve, and time-to-recover. Measure those baselines before you migrate, or you have nothing to compare against afterwards.
Step 0: take inventory of what you actually have
This is the dullest step and the one that decides everything. A typical mid-size company (20–50 servers, 10–30 systems) needs 2–4 weeks to produce a system list plus a dependency table. It does not need to be pretty — it only needs to answer four questions:
- What runs here? Domain, application name, version, owner. Anything with no owner goes straight into the retire candidates column.
- What does it depend on? Who calls it, and who does it call (databases, caches, internal APIs, third-party endpoints).
- What does it assume about its environment? Hard-coded IPs, local file paths, hosts file entries, shared storage, scheduled jobs.
- Can it be cut? Any access in the last 90 days? Confirmed with the business owner?
The biggest inventory trap is hidden dependency. An IP baked into code, a script path hard-coded in crontab, a deploy script that exists only on one engineer laptop — none of that shows up in any configuration document. Only a full end-to-end run exposes it.
Two techniques that work: derive dependencies from network traffic (firewall and load balancer logs beat asking people), and get a written "do we still need this?" confirmation from each business owner. A signed list is what lets you decommission later without an argument.
Give every system a strategy: the 6R model
Not everything is worth moving. The 6R model sorts each system into one strategy, and its main job is to stop a relocation from turning into a full rewrite. For a first migration, most systems only need the first row.
| Strategy | What it means | Good fit | Downtime | Typical share |
|---|---|---|---|---|
| Rehost (lift and shift) | Run as-is on cloud VMs, no application change | In-house but legacy, no time to refactor | Minutes to hours | 60–80% |
| Replatform | Adopt managed database, containers, load balancer; keep business logic | Web services, middleware, databases | Minutes | 10–20% |
| Refactor | Break into services, replace self-built components with managed ones | Platforms you intend to keep evolving | Near zero (canary) | Low, but longest |
| Repurchase | Buy a product instead of building it | CRM, OA, monitoring, ticketing | None | Frequently underestimated |
| Retire | Confirm nobody uses it, shut it down | Zombie services, untouched test environments | None | Often 10–20% |
| Relocate | Change datacentre or provider, keep the architecture | Already on cloud, moving region or vendor | Depends on data sync | Not an on-prem migration |
Those shares are industry experience, not a conclusion about your own estate — measure yours. The row worth extra time during inventory is Retire: deleting unused systems routinely removes a fifth of the migration work, and a fifth of the risk, before you spend anything.
Decision order: ask "do we still need it" (Retire / Repurchase) first, then "is a rewrite worth it" (Refactor), and only then "how do we move it" (Rehost / Replatform). Ask in the other order and you will carefully migrate a system that should have been deleted.
Slice the work: how to plan migration waves
Cutting over everything at once is where incidents cluster. Work in waves instead, ordered from the outside in, with an observation period between each:
| Wave | Contents | Entry criteria | Typical duration |
|---|---|---|---|
| Wave 0 pilot | One or two non-critical services: website, test environment, internal tools | Failure does not cost revenue and can be fixed in working hours | 3–6 weeks |
| Wave 1 stateless | Stateless web and API services, static sites, scheduled jobs | No local data dependency; instances rebuildable at any time | 4–8 weeks |
| Wave 2 stateful | Primary databases, caches, queues, object storage | Downtime window and rollback plan designed and agreed | 6–10 weeks |
| Wave 3 long tail | Legacy systems, internal reporting, old middleware | Functional degradation acceptable, or replaced by SaaS | Rolling |
Allow 2–4 weeks of observation between waves, with no new migration work in that window. Do only three things: check the bill for surprises, run a retrospective on the last wave, fix the monitoring. Teams that skip this usually end up debugging three fronts at once by wave three.
Each wave also needs an entry gate, and all four must pass before it starts:
- The previous observation period has elapsed with no open P1 or P2 issues
- The system list for this wave is confirmed and every downstream consumer knows
- The rollback plan is written and its criteria have been walked through once on paper
- Monitoring, alert recipients, and backup policies are live in the cloud environment
Pilot first: prove the whole path on a low-risk system
A pilot is not "migrate something small". Its only purpose is to burn through every process pitfall before touching the core business: how access is requested, how networking is opened, how images are built, how monitoring attaches, where alerts go, who responds. All of this is slow the first time and fast the second time.
Three conditions for the pilot system: low business value (nobody pages if it dies), broad enough dependencies (at least a database and one outbound call), and migratable within two or three days (nothing that needs code changes).
- Open a test account on the cloud provider, grant least privilege, and run one full deploy end to end
- Connect IDC to the VPC: VPN or dedicated link short-term, dedicated link if it stays
- Script the deployment so a fresh environment is rebuildable in under 30 minutes
- Attach monitoring, then deliberately kill an instance to confirm the alert chain works
- Write the retrospective: what broke, how long each step really took, what can be automated
The measured duration of each step from that pilot is your only credible basis for scheduling later waves. It is usually 2–3× longer than an uninformed estimate, especially for access approval and network provisioning.
Moving data: freeze-and-copy versus live replication
Data movement is the only part of the project that causes real business downtime, and how you choose determines what you can promise the business.
| Approach | Flow | Downtime window | Fits |
|---|---|---|---|
| Freeze and copy (offline) | Stop writes → back up → transfer → restore → verify → repoint | Tens of minutes to a few hours | Data in the hundreds of GB or less; a planned outage is acceptable |
| Live replication | Full sync first, then stream the delta, wait only for the tail at cutover | Seconds to a few minutes | Large data sets that cannot take a long write freeze |
| Dual write or change-data-capture | Write to both at the application layer, or replicate via binlog / WAL | Close to zero | Hard requirement for zero downtime; highest build cost and conflict handling |
Estimating the window: restore time ≈ data volume ÷ effective transfer rate × 1.3. The 1.3 covers index rebuild, log replay, and verification. Use a measured transfer rate, never the advertised bandwidth.
Whichever route you take, verification is not optional. Do at least these four, because missing any one of them surfaces lost data only after cutover:
- Row counts on the key tables, including the delta row count
- Boundary checks on the smallest and largest primary keys, to catch a truncated tail
- Timestamp range of the most recent records on both sides
- A business-level reconciliation — recompute yesterday order totals on both sides; that, not row counts, is the final judge
Cutover and rollback: taking the DNS switch
The DNS switch is the one action that takes effect globally and cannot be undone quickly. So the rollback plan is fixed before cutover, not improvised during it.
| Moment | Action | Rollback trigger |
|---|---|---|
| T-7 days | Lower the TTL on affected domains from the default down to 300 seconds | — |
| T-1 day | Stop delta writes and scheduled jobs; take the final full copy | — |
| T | Trigger the final delta sync and verify data consistency | Verification mismatch — abort immediately and resume writes |
| T+5 min | Canary: send 5–10% of traffic to the cloud, watch for 30 minutes | Error rate or P95 latency degrades past the agreed threshold |
| T+1 hour | Full cutover; keep the old environment read-only | — |
| T+24–72 h | Observation period expires, only then decommission old servers | Any P1 inside the window — switch DNS back |
Lower the TTL in advance. At the default 3600 seconds the cutover can take an hour to propagate everywhere, and what you observe will not match what users see. Dropping it to 300 seconds three to seven days early is what makes a five-minute rollback possible.
Agree the rollback criteria in writing with the business owner — for example "cloud P95 latency more than 50% above baseline for 10 minutes" or "error rate above 0.5%". Without shared agreement, the rollback decision stalls at three in the morning over whether something counts as an incident.
And during the observation window, do not delete the old machines or cancel the colocation contract. Demote them to read-only standby. Deleting early removes your way back.
Hybrid coexistence during the transition
For most of the project your workloads exist in both places at once. The hybrid phase usually runs 1–3 months, and three problems have to be solved in it:
- Networking: dedicated link or VPN between IDC and VPC. Capacity is sized on peak; for migration bursts a redundant dedicated link is usually worth it — at minimum confirm the VPN is not the bottleneck at peak.
- Security boundary: firewall openings between the two sides should be time-boxed and source-restricted, and closed out at the end of each wave. Never leave a permanent back door.
- Access: replace the old habit of exposing an admin port to the internet with a bastion host plus VPN or zero-trust access.
One easily missed point: bidirectional sync should never be a steady state. Keeping two active database copies alive between IDC and cloud costs far more to reconcile conflicts than the tens of minutes a write freeze ever would. The hybrid phase should converge to one-directional flow as fast as possible. Hybrid traffic belongs on a private interconnect, not on the public internet — see Cloud Enterprise Network.
Three cross-boundary metrics deserve their own dashboard in this phase, because they reveal trouble earlier than any single-side metric:
- Round-trip time between IDC and cloud: usually higher than intra-region latency, and it caps how fast replication can drain
- Link bandwidth utilisation: replication competes with real traffic; sustained use above 70% means the link needs upgrading
- Count of temporarily opened firewall rules: each wave should close its own; a growing count means the boundary is rotting
Migration is not done until it is verified
"It loads" is not "the migration succeeded". After cutover, work through this list, comparing every item to the pre-migration baseline rather than asking whether the absolute number looks fine:
- Performance parity: P50 / P95 / P99 latency, throughput, error rate versus baseline. Cloud instances of the same spec often benchmark below the equivalent on-prem generation (CPU scores can run 10–30% lower at equal core count), and burstable or shared types more so.
- Functional spot checks: walk the core business paths one by one — login, checkout, payment callback, report export — not just the homepage.
- Monitoring actually works: alerts reach the person on call, and that person knows the response. Generate one deliberately.
- Backup restores: not "the backup job succeeded" but an actual restore drill. Many teams do their first restore on the day they truly need it.
- Cost reconciliation: pull the first full invoice after a week live and explain every line.
Plan 20–30% performance headroom. Machines opened temporarily for the migration, bandwidth used for replication, debug logging left on — these all push sizing upward. Re-tune 2–4 weeks after things stabilise rather than starting small and scaling up repeatedly.
Six pitfalls that recur
These share a shape: almost invisible before the fact, expensive afterwards.
- Hidden dependencies: hard-coded IPs, paths baked into crontab, shared mounts. They surface only at cutover.
- Licensing that does not transfer: some commercial software is licensed per physical CPU or per socket (commonly seen with commercial databases, enterprise middleware, older backup and endpoint agents). On cloud you are billed per vCPU, so cost can rise instead of falling. Confirm the licensing basis before any long commitment.
- Underestimating database downtime: the window is stop-writes + full backup + transfer + restore + verification, which runs several times longer than volume divided by bandwidth.
- Cost surprises: paying for two environments during migration, egress traffic, metered charges on NAT gateways and load balancers, old machines left running. Do not buy reserved instances or savings plans on day one either — watch steady usage for at least 1–2 months first.
- No rollback plan: criteria never agreed, TTL never lowered, old machines deleted early.
- Walking away after cutover: monitoring not attached, backups never drilled, documentation never updated. Three months later nobody dares touch the system.
Set the cost expectation early: during migration the bill typically runs 1.5–3× normal (both environments plus dedicated links plus traffic). Agree that overage with finance at project kickoff or the project gets halted mid-flight. The exact multiple depends on scale; treat assessment and official live pricing as the source of truth.
A realistic timeline and cost shape
A reference cadence for a mid-size company. These are common ranges, not commitments — your inventory and team experience move them:
| Phase | Typical duration | Main output |
|---|---|---|
| Asset inventory and dependency mapping | 2–4 weeks | System list, dependency map, 6R assignment |
| Cloud environment and networking | 2–6 weeks | VPC and permissions, link or VPN, images and deploy scripts |
| Pilot migration | 3–6 weeks | A proven template, a pitfall log, performance baselines |
| Waves 1–2 migration | 2–4 months | Core workloads on cloud, dual-run and cutover |
| Long tail cleanup and colocation exit | 1–3 months | Old machines off, contract ended, cost review |
For a team of 10–20 people migrating 20–50 servers, 4–8 months from kickoff to full decommission is a common total. Surprisingly little of that is writing migration code — most of it is inventory, coordination, waiting for approvals, and re-verification. Say that up front, or the project will be planned as a sprint and end up running as long-term operations.
On cost, separate one-time spend from the long-term structural change. One-time items are dedicated link provisioning, extra traffic during migration, and short-term instance scaling. The structural change is steady-state instance size, whether you move to managed databases and a CDN, and whether you earn a committed-use discount.
- Steady-state monthly spend is usually lower than the old IDC bill (space, power, hardware depreciation) — but the shape changes completely, from fixed cost to usage-driven, and someone has to own the bill
- Do not buy the longest commitment in year one. Observe real usage for 1–2 months, then decide how much to cover with annual or reserved pricing
- Colocation contracts have an early termination notice period that is routinely missing from the schedule; the final months of penalty can be significant
These are experience ranges, not quotes. Actual figures depend on data volume, traffic, number of availability zones, and the specs chosen — treat the formal assessment and official live pricing as the source of truth.
Your next step: start with an asset list
If you have to move this week, you do not need to pick a cloud provider first. Do exactly one thing: pull the server list and fill in four columns per machine — what it runs, who owns it, what it depends on, whether we keep it. Two days of work, and it determines every date that follows.
- Export 90 days of access and traffic logs and mark anything with no traffic as a retire candidate
- Classify each system with 6R and count the rehost / replatform / retire split
- Pick one pilot that satisfies "nobody pages if it breaks" and set a window for it
- Get written confirmation of what the business no longer needs — this is usually the largest single saving
Take that list into region, instance type, and budget discussions and the plan will be far more grounded than one built on intuition — because you now know what is moving, how many systems there are, and which few deserve a real rewrite.
Next step: turn the asset list into a spreadsheet (system, owner, dependencies, data volume, downtime tolerance, 6R category) and bring it to a provider assessment. It shortens the proposal cycle and makes the estimate match the real migration volume. Assessments are often free or low-cost depending on the provider — check their current policy.