Migration

Moving an insurance ledger to AWS without stopping the business

Nine months moving core policy and transaction services off on-premises virtualisation into a multi-account AWS Organization, with Transit Gateway carrying traffic between 30+ VPCs and the remaining datacentre.

Confidential, insurance9 months6 engineersUpdated August 18, 2026
Zero
downtime at cutover
30+
VPCs on one Transit Gateway
40%
lower operating cost
Architecture

What we built

Multi-account AWS Organization with Transit Gateway connecting shared services, workload accounts and the on-premises datacentre
Multi-account AWS Organization with Transit Gateway connecting shared services, workload accounts and the on-premises datacentreOpen full size

An insurer running policy administration, claims and a transaction ledger on ageing on-premises virtualisation wanted to be on AWS. What they could not have was a maintenance window: the ledger is written to during business hours in several states, and a day of downtime is a regulatory conversation, not an inconvenience.

What we walked into

Around forty services with dependencies nobody had drawn in years, a single flat network where everything could reach everything, and a database that three separate applications wrote to directly. The first six weeks produced no migration at all. They produced a dependency map and an agreed order of moves.

Accounts before networks

We set up AWS Organizations first, because account boundaries are the only isolation that cannot be undone by a bad IAM policy later.

  • Separate accounts per environment and per business domain, so claims cannot read policy data by accident
  • Service Control Policies denying regions the business does not operate in, and denying anyone the ability to turn off CloudTrail
  • A dedicated logging account that other accounts can write to and nothing can delete from
  • A shared services account holding the Transit Gateway, DNS and the Direct Connect attachment

One hub, thirty-plus VPCs

Every workload account got its own VPC. Peering them pairwise would have been unmanageable, so everything attaches to a Transit Gateway in the shared services account, with route tables per segment.

  • Production, non-production and shared services on separate Transit Gateway route tables, so non-production cannot route to production at all
  • The on-premises datacentre attached at the same hub, which is what let services move one at a time rather than all at once
  • Route 53 Resolver rules forwarding internal zones both directions during the overlap period

The routing was the part we spent most design time on. A loop between the on-premises network and a transit route table is easy to create and unpleasant to debug at four in the morning, so the route tables are generated from CloudFormation rather than edited by hand.

The ledger cutover

The database moved by replication, not by export. An RDS instance ran as a replica of the on-premises database for weeks while we validated row counts and checksums nightly. The cutover itself was:

  • Freeze writes at the application tier for a few minutes
  • Confirm replication lag at zero
  • Promote the RDS instance
  • Flip the internal DNS record
  • Unfreeze

We rehearsed it twice against a copy of production in an isolated account before doing it for real. Both rehearsals found something. The first found an application with a hardcoded host, the second found a batch job nobody had mentioned.

Where it landed

  • No business downtime at cutover. The freeze window was measured in minutes and fell outside transacting hours
  • 30+ VPCs on one Transit Gateway with no routing loops in production
  • About 40% lower operating cost, mostly from retiring hardware and right-sizing instances that had been provisioned for a five-year peak
  • Environments now rebuild from CloudFormation, which the previous estate could not do at all

What was hard

Discovery. The technical work was ordinary; finding out what actually talked to what was not. Two services were found only because they broke in a rehearsal. Budget for that phase honestly, or the schedule discovers it for you.

What we still do

We run the platform: patching, backup verification, cost review each month, and the on-call rotation for the shared networking layer. The application teams own their own accounts.

Project

Client

Confidential, insurance

Duration

9 months

Team

6 engineers

Category

Migration

AWS OrganizationsTransit GatewayCloudFormationAmazon RDSRoute 53IAM
Questions

Questions about this build

Anything missing, email [email protected].

How do you migrate a ledger without downtime?

Replicate first, cut over last. RDS replication ran alongside the on-premises database for weeks, we rehearsed the cutover twice against production data in an isolated account, and the actual switch was a DNS change with the old system still warm behind it.

Why AWS Organizations rather than one account?

An insurer has teams that must not be able to touch each other's data. Separate accounts per environment and business domain, with Service Control Policies setting hard boundaries, means a mistake in one account cannot reach another. One account with careful IAM relies on nobody ever making that mistake.

Is Transit Gateway worth it for 30 VPCs?

Yes. Peering 30 VPCs pairwise is 435 connections and a routing table nobody can reason about. Transit Gateway made it one hub with route tables per segment, and the on-premises link attached in the same place.

How long did this actually take?

Nine months end to end with six engineers, of which the first two were discovery and no migration at all. The estimate people usually want to hear is three months; on a regulated ledger it is not true.

More work

Two others we can talk about

Kubernetes

EKS Cluster Setup for Enterprise Application

Complete Amazon EKS cluster setup with advanced networking, security, and monitoring for a large-scale enterprise application serving millions of users.

Read it
Compliance

A PCI-DSS platform for a buy-now-pay-later lender

Six months building the AWS environment a BNPL lender is audited on: ECS Fargate in private subnets, Aurora PostgreSQL with read replicas, KMS envelope encryption and rotation, WAF and Shield at the edge.

Read it

Send us your AWS bill

Thirty minutes with an engineer, no slide deck. We will tell you what we would change first and what it would cost to have us do it.

Talk to an engineer