Multi-Region DR
AWS architecture template · SAA-C03: Route 53 failover → CloudFront → ALB → Auto Scaling EC2 → Aurora Global
Multi-Region DR is a free AWS architecture template built with Aurora, Auto Scaling, CloudFront, EC2, Load Balancer and Route 53. Open it in TheArchitect to edit the diagram, estimate monthly cost, and export the CloudFormation or Terraform that deploys it.
AWS services in this template
- Aurora
- Auto Scaling
- CloudFront
- EC2
- Load Balancer
- Route 53
Deployment notes
Reference
- Multi-region architecture requires a separate stack deployment in each region.
- Aurora Global Database and Route 53 failover routing need cross-region configuration.
Generated CloudFormation — 35 resources
| Logical ID | Resource type |
|---|---|
| Route53route53 | AWS::Route53::HostedZone |
| CloudFrontcloudfront | AWS::CloudFront::Distribution |
| PrimaryVPC10100016vpc | AWS::EC2::VPC |
| PrimaryVPC10100016vpcedgewebsgSecurityGroup | AWS::EC2::SecurityGroup |
| PrimaryVPC10100016vpcappruntimesgSecurityGroup | AWS::EC2::SecurityGroup |
| PrimaryVPC10100016vpcappruntimesgSecurityGroupIngressRule | AWS::EC2::SecurityGroupIngress |
| PrimaryVPC10100016vpcworkersgSecurityGroup | AWS::EC2::SecurityGroup |
| PrimaryVPC10100016vpcdatastoresgSecurityGroup | AWS::EC2::SecurityGroup |
| PrimaryVPC10100016vpcdatastoresgSecurityGroupIngressRule | AWS::EC2::SecurityGroupIngress |
| PrimaryVPC10100016vpccontrolplanesgSecurityGroup | AWS::EC2::SecurityGroup |
| PrimaryVPC10100016vpcPublicSubnet1 | AWS::EC2::Subnet |
| PrimaryVPC10100016vpcPublicSubnet2 | AWS::EC2::Subnet |
| PrimaryVPC10100016vpcPrivateSubnet1 | AWS::EC2::Subnet |
| PrimaryVPC10100016vpcPrivateSubnet2 | AWS::EC2::Subnet |
| PrimaryVPC10100016vpcPrivateSubnet3 | AWS::EC2::Subnet |
| PrimaryVPC10100016vpcPrivateSubnet4 | AWS::EC2::Subnet |
| PrimaryVPC10100016vpcInternetGateway | AWS::EC2::InternetGateway |
| PrimaryVPC10100016vpcGatewayAttachment | AWS::EC2::VPCGatewayAttachment |
| PrimaryVPC10100016vpcPublicRouteTable | AWS::EC2::RouteTable |
| PrimaryVPC10100016vpcPublicRoute | AWS::EC2::Route |
| PrimaryVPC10100016vpcPublicSubnet1RTA | AWS::EC2::SubnetRouteTableAssociation |
| PrimaryVPC10100016vpcPublicSubnet2RTA | AWS::EC2::SubnetRouteTableAssociation |
| PrimaryVPC10100016vpcNatEIP | AWS::EC2::EIP |
| PrimaryVPC10100016vpcNatGateway | AWS::EC2::NatGateway |
| PrimaryVPC10100016vpcPrivateRouteTable | AWS::EC2::RouteTable |
| PrimaryVPC10100016vpcPrivateRoute | AWS::EC2::Route |
| PrimaryVPC10100016vpcPrivateSubnet1RTA | AWS::EC2::SubnetRouteTableAssociation |
| PrimaryVPC10100016vpcPrivateSubnet2RTA | AWS::EC2::SubnetRouteTableAssociation |
| PrimaryVPC10100016vpcPrivateSubnet3RTA | AWS::EC2::SubnetRouteTableAssociation |
| PrimaryVPC10100016vpcPrivateSubnet4RTA | AWS::EC2::SubnetRouteTableAssociation |
| PrimaryVPC10100016vpcDbSubnetGroup | AWS::RDS::DBSubnetGroup |
| PrimaryALBelb | AWS::ElasticLoadBalancingV2::LoadBalancer |
| WebASGautoscaling | AWS::AutoScaling::AutoScalingGroup |
| WebInstanceec2 | AWS::EC2::Instance |
| AuroraGlobalaurora | AWS::RDS::DBCluster |
View the full CloudFormation template
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Generated by TheArchitect — https://www.thecloudarchitect.dev",
"Metadata": {
"TheArchitect": {
"Edges": [
{
"From": "CloudFrontcloudfront",
"To": "PrimaryALBelb"
},
{
"From": "PrimaryALBelb",
"To": "WebASGautoscaling"
}
]
}
},
"Resources": {
"Route53route53": {
"Type": "AWS::Route53::HostedZone",
"Properties": {
"Name": "dr.example.com.",
"HostedZoneConfig": {
"Comment": "Failover routing between primary and secondary regions."
}
}
},
"CloudFrontcloudfront": {
"Type": "AWS::CloudFront::Distribution",
"Properties": {
"DistributionConfig": {
"Enabled": true,
"Comment": "CDN caching layer for DR traffic routing.",
"PriceClass": "PriceClass_100",
"HttpVersion": "http2",
"DefaultCacheBehavior": {
"TargetOriginId": "LoadBalancerOrigin",
"ViewerProtocolPolicy": "redirect-to-https",
"ForwardedValues": {
"QueryString": false,
"Cookies": {
"Forward": "none"
}
}
},
"ViewerCertificate": {
"CloudFrontDefaultCertificate": true
},
"Origins": [
{
"DomainName": {
"Fn::GetAtt": [
"PrimaryALBelb",
"DNSName"
]
},
"Id": "LoadBalancerOrigin",
"CustomOriginConfig": {
"HTTPPort": 80,
"HTTPSPort": 443,
"OriginProtocolPolicy": "http-only",
"OriginSSLProtocols": [
"TLSv1.2"
]
}
}
]
}
}
},
"PrimaryVPC10100016vpc": {
"Type": "AWS::EC2::VPC",
"Properties": {
"CidrBlock": "10.10.0.0/16",
"EnableDnsHostnames": true,
"EnableDnsSupport": true,
"Tags": [
{
"Key": "Name",
"Value": "saa-dr-primary-vpc"
}
]
}
},
"PrimaryVPC10100016vpcedgewebsgSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupName": "edge-web-sg",
"GroupDescription": "Allow HTTPS from the internet to public load balancers",
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"Tags": [
{
"Key": "Name",
"Value": "edge-web-sg"
}
],
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": 443,
"ToPort": 443,
"CidrIp": "0.0.0.0/0"
}
],
"SecurityGroupEgress": [
{
"IpProtocol": "-1",
"CidrIp": "0.0.0.0/0"
}
]
}
},
"PrimaryVPC10100016vpcappruntimesgSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupName": "app-runtime-sg",
"GroupDescription": "Allow application traffic from the edge tier",
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"Tags": [
{
"Key": "Name",
"Value": "app-runtime-sg"
}
],
"SecurityGroupEgress": [
{
"IpProtocol": "-1",
"CidrIp": "0.0.0.0/0"
}
]
}
},
"PrimaryVPC10100016vpcappruntimesgSecurityGroupIngressRule": {
"Type": "AWS::EC2::SecurityGroupIngress",
"Properties": {
"GroupId": {
"Ref": "PrimaryVPC10100016vpcappruntimesgSecurityGroup"
},
"IpProtocol": "tcp",
"FromPort": 80,
"ToPort": 80,
"SourceSecurityGroupId": {
"Ref": "PrimaryVPC10100016vpcedgewebsgSecurityGroup"
}
}
},
"PrimaryVPC10100016vpcworkersgSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupName": "worker-sg",
"GroupDescription": "Private worker runtime egress only",
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"Tags": [
{
"Key": "Name",
"Value": "worker-sg"
}
],
"SecurityGroupEgress": [
{
"IpProtocol": "-1",
"CidrIp": "0.0.0.0/0"
}
]
}
},
"PrimaryVPC10100016vpcdatastoresgSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupName": "data-store-sg",
"GroupDescription": "Allow PostgreSQL from application runtimes",
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"Tags": [
{
"Key": "Name",
"Value": "data-store-sg"
}
],
"SecurityGroupEgress": [
{
"IpProtocol": "-1",
"CidrIp": "0.0.0.0/0"
}
]
}
},
"PrimaryVPC10100016vpcdatastoresgSecurityGroupIngressRule": {
"Type": "AWS::EC2::SecurityGroupIngress",
"Properties": {
"GroupId": {
"Ref": "PrimaryVPC10100016vpcdatastoresgSecurityGroup"
},
"IpProtocol": "tcp",
"FromPort": 5432,
"ToPort": 5432,
"SourceSecurityGroupId": {
"Ref": "PrimaryVPC10100016vpcappruntimesgSecurityGroup"
}
}
},
"PrimaryVPC10100016vpccontrolplanesgSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupName": "control-plane-sg",
"GroupDescription": "Private EKS control plane attachment group",
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"Tags": [
{
"Key": "Name",
"Value": "control-plane-sg"
}
],
"SecurityGroupEgress": [
{
"IpProtocol": "-1",
"CidrIp": "0.0.0.0/0"
}
]
}
},
"PrimaryVPC10100016vpcPublicSubnet1": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"CidrBlock": "10.10.1.0/24",
"AvailabilityZone": "us-east-1a",
"MapPublicIpOnLaunch": true,
"Tags": [
{
"Key": "Name",
"Value": "public-edge-a"
}
]
}
},
"PrimaryVPC10100016vpcPublicSubnet2": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"CidrBlock": "10.10.2.0/24",
"AvailabilityZone": "us-east-1b",
"MapPublicIpOnLaunch": true,
"Tags": [
{
"Key": "Name",
"Value": "public-edge-b"
}
]
}
},
"PrimaryVPC10100016vpcPrivateSubnet1": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"CidrBlock": "10.10.11.0/24",
"AvailabilityZone": "us-east-1a",
"MapPublicIpOnLaunch": false,
"Tags": [
{
"Key": "Name",
"Value": "private-app-a"
}
]
}
},
"PrimaryVPC10100016vpcPrivateSubnet2": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"CidrBlock": "10.10.12.0/24",
"AvailabilityZone": "us-east-1b",
"MapPublicIpOnLaunch": false,
"Tags": [
{
"Key": "Name",
"Value": "private-app-b"
}
]
}
},
"PrimaryVPC10100016vpcPrivateSubnet3": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"CidrBlock": "10.10.21.0/24",
"AvailabilityZone": "us-east-1a",
"MapPublicIpOnLaunch": false,
"Tags": [
{
"Key": "Name",
"Value": "private-data-a"
}
]
}
},
"PrimaryVPC10100016vpcPrivateSubnet4": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"CidrBlock": "10.10.22.0/24",
"AvailabilityZone": "us-east-1b",
"MapPublicIpOnLaunch": false,
"Tags": [
{
"Key": "Name",
"Value": "private-data-b"
}
]
}
},
"PrimaryVPC10100016vpcInternetGateway": {
"Type": "AWS::EC2::InternetGateway",
"Properties": {
"Tags": [
{
"Key": "Name",
"Value": "saa-dr-primary-vpc-igw"
}
]
}
},
"PrimaryVPC10100016vpcGatewayAttachment": {
"Type": "AWS::EC2::VPCGatewayAttachment",
"Properties": {
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"InternetGatewayId": {
"Ref": "PrimaryVPC10100016vpcInternetGateway"
}
}
},
"PrimaryVPC10100016vpcPublicRouteTable": {
"Type": "AWS::EC2::RouteTable",
"Properties": {
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"Tags": [
{
"Key": "Name",
"Value": "saa-dr-primary-vpc-public-rt"
}
]
}
},
"PrimaryVPC10100016vpcPublicRoute": {
"Type": "AWS::EC2::Route",
"DependsOn": [
"PrimaryVPC10100016vpcGatewayAttachment"
],
"Properties": {
"RouteTableId": {
"Ref": "PrimaryVPC10100016vpcPublicRouteTable"
},
"DestinationCidrBlock": "0.0.0.0/0",
"GatewayId": {
"Ref": "PrimaryVPC10100016vpcInternetGateway"
}
}
},
"PrimaryVPC10100016vpcPublicSubnet1RTA": {
"Type": "AWS::EC2::SubnetRouteTableAssociation",
"Properties": {
"SubnetId": {
"Ref": "PrimaryVPC10100016vpcPublicSubnet1"
},
"RouteTableId": {
"Ref": "PrimaryVPC10100016vpcPublicRouteTable"
}
}
},
"PrimaryVPC10100016vpcPublicSubnet2RTA": {
"Type": "AWS::EC2::SubnetRouteTableAssociation",
"Properties": {
"SubnetId": {
"Ref": "PrimaryVPC10100016vpcPublicSubnet2"
},
"RouteTableId": {
"Ref": "PrimaryVPC10100016vpcPublicRouteTable"
}
}
},
"PrimaryVPC10100016vpcNatEIP": {
"Type": "AWS::EC2::EIP",
"DependsOn": [
"PrimaryVPC10100016vpcGatewayAttachment"
],
"Properties": {
"Domain": "vpc"
}
},
"PrimaryVPC10100016vpcNatGateway": {
"Type": "AWS::EC2::NatGateway",
"Properties": {
"AllocationId": {
"Fn::GetAtt": [
"PrimaryVPC10100016vpcNatEIP",
"AllocationId"
]
},
"SubnetId": {
"Ref": "PrimaryVPC10100016vpcPublicSubnet1"
},
"Tags": [
{
"Key": "Name",
"Value": "saa-dr-primary-vpc-nat"
}
]
}
},
"PrimaryVPC10100016vpcPrivateRouteTable": {
"Type": "AWS::EC2::RouteTable",
"Properties": {
"VpcId": {
"Ref": "PrimaryVPC10100016vpc"
},
"Tags": [
{
"Key": "Name",
"Value": "saa-dr-primary-vpc-private-rt"
}
]
}
},
"PrimaryVPC10100016vpcPrivateRoute": {
"Type": "AWS::EC2::Route",
"Properties": {
"RouteTableId": {
"Ref": "PrimaryVPC10100016vpcPrivateRouteTable"
},
"DestinationCidrBlock": "0.0.0.0/0",
"NatGatewayId": {
"Ref": "PrimaryVPC10100016vpcNatGateway"
}
}
},
"PrimaryVPC10100016vpcPrivateSubnet1RTA": {
"Type": "AWS::EC2::SubnetRouteTableAssociation",
"Properties": {
"SubnetId": {
"Ref": "PrimaryVPC10100016vpcPrivateSubnet1"
},
"RouteTableId": {
"Ref": "PrimaryVPC10100016vpcPrivateRouteTable"
}
}
},
"PrimaryVPC10100016vpcPrivateSubnet2RTA": {
"Type": "AWS::EC2::SubnetRouteTableAssociation",
"Properties": {
"SubnetId": {
"Ref": "PrimaryVPC10100016vpcPrivateSubnet2"
},
"RouteTableId": {
"Ref": "PrimaryVPC10100016vpcPrivateRouteTable"
}
}
},
"PrimaryVPC10100016vpcPrivateSubnet3RTA": {
"Type": "AWS::EC2::SubnetRouteTableAssociation",
"Properties": {
"SubnetId": {
"Ref": "PrimaryVPC10100016vpcPrivateSubnet3"
},
"RouteTableId": {
"Ref": "PrimaryVPC10100016vpcPrivateRouteTable"
}
}
},
"PrimaryVPC10100016vpcPrivateSubnet4RTA": {
"Type": "AWS::EC2::SubnetRouteTableAssociation",
"Properties": {
"SubnetId": {
"Ref": "PrimaryVPC10100016vpcPrivateSubnet4"
},
"RouteTableId": {
"Ref": "PrimaryVPC10100016vpcPrivateRouteTable"
}
}
},
"PrimaryVPC10100016vpcDbSubnetGroup": {
"Type": "AWS::RDS::DBSubnetGroup",
"Properties": {
"DBSubnetGroupDescription": "Private subnets for saa-dr-primary-vpc",
"SubnetIds": [
{
"Ref": "PrimaryVPC10100016vpcPrivateSubnet1"
},
{
"Ref": "PrimaryVPC10100016vpcPrivateSubnet2"
},
{
"Ref": "PrimaryVPC10100016vpcPrivateSubnet3"
},
{
"Ref": "PrimaryVPC10100016vpcPrivateSubnet4"
}
],
"Tags": [
{
"Key": "Name",
"Value": "saa-dr-primary-vpc-db-subnet-group"
}
]
}
},
"PrimaryALBelb": {
"Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
"Properties": {
"Name": "saa-dr-web-alb",
"Type": "application",
"Scheme": "internet-facing",
"IpAddressType": "ipv4",
"Subnets": [
{
"Ref": "PrimaryVPC10100016vpcPublicSubnet1"
},
{
"Ref": "PrimaryVPC10100016vpcPublicSubnet2"
}
],
"SecurityGroups": [
{
"Ref": "PrimaryVPC10100016vpcedgewebsgSecurityGroup"
}
]
}
},
"WebASGautoscaling": {
"Type": "AWS::AutoScaling::AutoScalingGroup",
"Properties": {
"AutoScalingGroupName": "saa-dr-web-asg",
"MinSize": "2",
"MaxSize": "10",
"DesiredCapacity": "2",
"HealthCheckType": "ELB",
"HealthCheckGracePeriod": 300,
"VPCZoneIdentifier": [
{
"Ref": "PrimaryVPC10100016vpcPrivateSubnet1"
},
{
"Ref": "PrimaryVPC10100016vpcPrivateSubnet2"
}
]
}
},
"WebInstanceec2": {
"Type": "AWS::EC2::Instance",
"Properties": {
"InstanceType": "t3.small",
"Tags": [
{
"Key": "Name",
"Value": "saa-dr-web-instance"
}
],
"SubnetId": {
"Ref": "PrimaryVPC10100016vpcPrivateSubnet1"
},
"SecurityGroupIds": [
{
"Ref": "PrimaryVPC10100016vpcappruntimesgSecurityGroup"
}
],
"MetadataOptions": {
"HttpTokens": "required"
}
}
},
"AuroraGlobalaurora": {
"Type": "AWS::RDS::DBCluster",
"Properties": {
"DBClusterIdentifier": "saa-dr-global-db",
"Engine": "aurora-postgresql",
"EngineVersion": "16.2",
"VpcSecurityGroupIds": [
{
"Ref": "PrimaryVPC10100016vpcdatastoresgSecurityGroup"
}
],
"MasterUsername": "globaladmin",
"ManageMasterUserPassword": true,
"StorageEncrypted": true,
"BackupRetentionPeriod": 7,
"DBSubnetGroupName": {
"Ref": "PrimaryVPC10100016vpcDbSubnetGroup"
}
}
}
}
}Generated by TheArchitect from the diagram above. Review values such as names, CIDR ranges and instance sizes before deploying to your account.