Aurora Networks runs a regional internet backbone serving four million daily users. Their primary data center was reaching end-of-life and their SLA didn't allow a single second of downtime — not even for thirty seconds. We had nine months. The simplest plan didn't work, the second plan didn't work, and the plan that did work was almost embarrassingly conservative.
Inventory before architecture
We spent six weeks cataloguing every workload, dependency, SLA, and dataset. The point wasn't a diagram. The point was a confidence score — for each service, how sure were we about its real upstream and downstream connections? Anything below 80% confidence got an engineer to find out. By the end we had a map nobody had ever seen before, including Aurora's own SRE team.
A useful surprise: 30% of the services we found were dead. Migrating them would have cost months. Deleting them cost a Slack thread.
Blue-green by region, slow by design
We stood up a parallel AWS environment with Terraform, then moved traffic five percent at a time using DNS and BGP. Each shift had a four-hour soak period. Each soak had a one-click rollback wired and tested. Most days we shifted nothing — we waited.
The legacy stack stayed warm for twelve weeks past final cutover. The cost was real. The peace of mind it bought our oncall team made every dollar worth it.
Numbers
Nine months. 180 services. Zero customer-visible incidents. The annualized cost savings paid back our engagement before the year was out. The team Aurora now runs against the platform is two engineers smaller and on-call rotations are half what they were.
Want this kind of work on your project?
One conversation, honest pricing, recommended engagement model — within a business day.
Keep reading
All articlesHow we estimate software projects (and why most estimates are wrong)
Every estimate is wrong. The useful ones are wrong in known ways. A practical method we've refined across 50+ engagements — and the failure modes we learned to spot first.
The unreasonable effectiveness of plain SQL
ORMs are fine. Until they aren't. After a decade of building data layers on every framework we could find, we keep coming back to plain SQL — and the patterns that make it pleasant.
Why we don't write microservices anymore
We split into microservices because it was 2019. Then we spent three years feeling the cost. Here's what we learned, and how we structure backends in 2025.