ArchitectureAWS

Multi-Region Active-Active Architecture on AWS

NT

Naveen Teja

3/2/2026

Multi-Region Active-Active Architecture on AWS

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.

multi-region-active-active.tf
# 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"
  }
}