Multi-Region Active-Active Architecture on AWS
Naveen Teja
3/2/2026

Single-region architectures carry an inherent risk: a regional AWS outage (which does happen — us-east-1 has experienced multiple significant incidents) takes your entire application offline. For businesses where downtime translates directly to revenue loss or SLA breaches, a multi-region active-active architecture is the only acceptable design.
In an active-active setup, both regions serve live production traffic simultaneously, as opposed to active-passive where a secondary region sits idle waiting for failover. This approach provides sub-100ms global latency by routing users to their geographically nearest endpoint, and achieves Recovery Time Objectives (RTO) measured in seconds rather than minutes.
The key components are: Route 53 with latency-based or geolocation routing policies to direct traffic to the nearest region, Aurora Global Database for sub-second cross-region replication with automatic failover, DynamoDB Global Tables for globally distributed session state, and S3 Cross-Region Replication for static assets. The critical design challenge is handling write conflicts when both regions accept writes simultaneously — DynamoDB Global Tables resolves this with last-writer-wins semantics. The Terraform below configures Route 53 latency-based routing across two regions.
# Route 53 latency-based routing across two regions
resource "aws_route53_record" "api_us" {
zone_id = aws_route53_zone.main.zone_id
name = "api.naveenteja.cloud"
type = "A"
set_identifier = "us-east-1"
latency_routing_policy {
region = "us-east-1"
}
alias {
name = aws_lb.us_east.dns_name
zone_id = aws_lb.us_east.zone_id
evaluate_target_health = true
}
}
resource "aws_route53_record" "api_ap" {
zone_id = aws_route53_zone.main.zone_id
name = "api.naveenteja.cloud"
type = "A"
set_identifier = "ap-south-1"
latency_routing_policy {
region = "ap-south-1"
}
alias {
name = aws_lb.ap_south.dns_name
zone_id = aws_lb.ap_south.zone_id
evaluate_target_health = true
}
}
# DynamoDB Global Table — active-active writes in both regions
resource "aws_dynamodb_table" "global_sessions" {
name = "user-sessions"
billing_mode = "PAY_PER_REQUEST"
hash_key = "session_id"
stream_enabled = true
stream_view_type = "NEW_AND_OLD_IMAGES"
attribute {
name = "session_id"
type = "S"
}
replica {
region_name = "ap-south-1"
}
}You might also like

Migrating from EC2 to AWS Fargate: A Step-by-Step Guide

Implementing AWS GuardDuty with Automated Threat Response

OpenTofu vs Terraform in 2024: Migration Guide and Key Differences

Zero-Trust Networking on AWS with IAM Identity Center and SCPs

AWS Cost Optimization: 10 Terraform Patterns to Cut Your Bill by 40%
