Rejected approach: documentation alone. Starting with documentation alone was not enough here. The auditor expected evidence that recovery worked, and a plan to fail over to an empty region could not provide it. The infrastructure had to come before the procedure.
Chosen approach: build recovery infrastructure and perform an actual failover. This gave us a measured recovery time and evidence for the auditor. It also gave the team a procedure they could rely on during a real disaster.
S3 Cross-Region Replication Instead of Lambda: Fewer Points of Failure During Recovery
The main obstacle was coordination with the development team, rather than infrastructure. For this platform, enabling native S3 replication required changes to how the application wrote objects, and the development team was reluctant to make them.
The obvious workaround was a Lambda-based copy pipeline. It would have worked, but we deliberately rejected it. A Lambda copy pipeline adds a separate custom component that can fail independently, within the very mechanism that must work when the primary region is unavailable.
We followed up with the development team daily for a week until the application changes were shipped. S3 objects now replicate natively, without a separate custom copy service.
An Organisational Audit Blocker: When More Documentation Will Not Help
The DR nonconformity was held up by communication with the auditor, rather than engineering tasks. Additional documentation would not have changed that.
Escalating to management representatives resolved the issue. We initiated that escalation alongside the technical work. Distinguishing technical blockers from organisational ones helped us avoid delays and meet the deadline.
The Hardest Part: Making Regional Failover Repeatable
Performing a regional failover on a live platform without disruption is difficult. Making it repeatable is even harder.
A one-off failover demonstrates a result for a specific infrastructure state. Changes that affect recovery require another test. To turn the exercise into automated tests, we had to answer several questions.
What exactly does “recovered” mean for each class of service? In what order must services come back online? Which settings are still tied to Frankfurt without that dependency being documented?
Answering these questions took most of the work, rather than the failover itself. At the next audit, the team will be able to present the results of repeated recovery tests.
Custom Solutions: DR Tests, a Runbook, and Replication
A suite of 9 automated disaster recovery tests. Built specifically for this platform, the tests separately exercise regional failover and Availability Zone failure scenarios. They verify that core customer-facing services actually serve requests afterwards, rather than merely having pods scheduled on Kubernetes nodes. The client retains the suite and can run it independently.
A recovery runbook with an ordered sequence of steps. It defines the recovery order for each class of service and the dependencies between them. Alongside it, we wrote 15 internal policies to make the procedures clear to the auditor and executable by other engineers.
Replication to the recovery region. The configuration covers data, secrets, and container images. We included images and secrets as essential recovery dependencies. For S3, we modified the application to enable native replication without an intermediary copy service.
Architecture Before and After: From Single-Region to Multi-Region
Before
- A single region, Frankfurt, held everything: services, databases, secrets, images, and backups.
- No infrastructure in a second region.
- No S3 cross-region replication.
- No end-to-end recovery test or documented procedure.
- Recovery knowledge held by individual engineers.
After
- A primary region in Frankfurt and a recovery region in London.
- Data, secrets, images, and S3 objects replicated to the recovery region.
- Native S3 replication without a separate copy service.
- Core services failed over to London in 128 minutes during testing on live infrastructure.
- 9 automated tests covering regional failover and multi-AZ resilience separately.
- A recovery runbook and 15 internal policies.
Technology Stack
- Cloud: AWS across two regions (EKS, S3, CloudFront, Route 53, Secrets Manager, ECR, WAF, managed data stores)
- Containers and orchestration: Kubernetes, Helm
- IaC and CI/CD: Terraform, GitHub Actions
- Data: MongoDB Atlas, Redis
- Application and analytics: Next.js, Metabase
- Monitoring: Datadog
Technical Highlights
- Native S3 Cross-Region Replication instead of a Lambda-based copy pipeline.
- Separate testing of multi-region and multi-AZ resilience as distinct failure domains, rather than a single vague “high availability” claim.
- Replication of container images and secrets as essential recovery dependencies.
- Disaster recovery tests maintained as code.