GilteqGilteq
Back to Blog
Cloud & Infrastructure6 min read

Migrating to AWS Without Downtime: What We Learned

Moving a live production system to AWS sounds risky. Here is the approach we took to cut over without a single minute of downtime, including the mistakes we almost made.

When a client asked us to migrate their existing backend services to AWS, the non-negotiable requirement was simple: no downtime. Their platform was live, processing real users, and any outage during the migration would directly impact their business.

Here is exactly what we did.

Start With a Full Audit Before Touching Anything

The first mistake teams make with migrations is jumping straight to infrastructure. Before we wrote a single Terraform file, we spent time mapping every dependency in the existing system: databases, third-party integrations, background jobs, scheduled tasks, file storage, email triggers.

A migration plan is only as good as your understanding of what you are actually migrating. Hidden dependencies are what cause outages.

Run the Two Environments in Parallel

Rather than doing a hard cutover, we provisioned the full AWS environment alongside the existing one and ran both in parallel for two weeks. This gave us time to:

- Verify that the AWS environment behaved identically under real traffic patterns

- Catch any configuration differences between environments

- Test SNS notification delivery, SQS queue processing, and S3 integrations with actual data

AWS SNS was a key part of this system. We set up topics and subscriptions in the new environment and tested them against staging data before any production traffic touched them.

Use DNS-Based Traffic Shifting, Not a Hard Cutover

When it came time to switch, we used DNS-based traffic shifting rather than flipping a switch. We lowered TTLs well in advance, then shifted traffic in increments: 10%, 25%, 50%, 100%.

At each increment we monitored error rates, response times, and queue processing. If anything looked wrong at any stage, rolling back was a matter of updating a single DNS record.

Nothing went wrong. But the ability to roll back cleanly is the only reason you can move confidently at all.

Keep the Old Environment Warm for 72 Hours

After reaching 100% traffic on AWS, we kept the old environment running for 72 hours before decommissioning it. Not because we expected to roll back, but because 72 hours covers a full business cycle. You will catch anything that only shows up at end of day, overnight, or the following morning.

What Almost Went Wrong

One background job was reading a config value from an environment variable that existed on the old server but had not been added to the new environment. It was not caught in testing because the job only runs once a day at 3am.

We caught it in the parallel-run phase because we had logging in place for every background task execution. Without that logging, it would have silently failed in production for 24 hours before anyone noticed.

Log everything, especially the things that run quietly in the background.

The Outcome

The migration completed with zero downtime, zero data loss, and a measurable improvement in response times thanks to the proximity of services within AWS. The client moved to a more cost-efficient infrastructure model and gained access to native AWS services that had not been available before.

The unglamorous truth about cloud migrations is that the technical work is the easy part. The discipline is in the preparation.

Want to work with us?

Let us talk through your project.

Request a Briefing