RDS Backups & High Availability
RDS provides automated backups, manual snapshots, and Multi-AZ deployments out of the box. Read replicas extend this further with read scalability and cross-region DR. Aurora adds additional HA capabilities with its storage architecture.
Automated Backups & Snapshots
# Automated backups:
# - Enabled by default (retention: 1-35 days, default 7)
# - Full daily snapshot + transaction logs → enables point-in-time recovery (PITR)
# - Backup window: 30-min window when backup runs (choose low-traffic time)
# - Stored in S3 (not visible in console, only accessible via PITR)
# - Deleted when instance is deleted (unless you take a final snapshot)
# Modify backup settings
aws rds modify-db-instance \
--db-instance-identifier myapp-prod-db \
--backup-retention-period 14 \
--preferred-backup-window "02:00-02:30" \
--apply-immediately
# Manual snapshots — persist indefinitely, survive instance deletion
aws rds create-db-snapshot \
--db-instance-identifier myapp-prod-db \
--db-snapshot-identifier myapp-prod-db-before-migration-2024-01
# Wait for snapshot to complete
aws rds wait db-snapshot-available \
--db-snapshot-identifier myapp-prod-db-before-migration-2024-01
# List snapshots
aws rds describe-db-snapshots \
--db-instance-identifier myapp-prod-db \
--query "DBSnapshots[*].{ID:DBSnapshotIdentifier,Status:Status,Created:SnapshotCreateTime,Size:AllocatedStorage}"
# Point-in-time recovery — restore to any second within retention window
aws rds restore-db-instance-to-point-in-time \
--source-db-instance-identifier myapp-prod-db \
--target-db-instance-identifier myapp-prod-db-restored \
--restore-time 2024-01-15T03:30:00Z \
--db-instance-class db.m6g.large
# Restore from snapshot to a new instance
aws rds restore-db-instance-from-db-snapshot \
--db-instance-identifier myapp-prod-db-clone \
--db-snapshot-identifier myapp-prod-db-before-migration-2024-01 \
--db-instance-class db.m6g.largeMulti-AZ & Read Replicas
# Multi-AZ (standard RDS):
# - Synchronous replication to standby in different AZ
# - Standby is NOT readable (unlike Aurora)
# - Automatic failover on primary failure (60-120 sec; DNS CNAME flips)
# - Enable for production — costs 2x (you pay for the standby)
# - Maintenance and backups happen on standby first (less impact on primary)
# Enable Multi-AZ on existing instance
aws rds modify-db-instance \
--db-instance-identifier myapp-prod-db \
--multi-az \
--apply-immediately
# Trigger a failover (for testing, maintenance)
aws rds reboot-db-instance \
--db-instance-identifier myapp-prod-db \
--force-failover
# Read Replicas — asynchronous replication; replicas are readable
# Use to: offload read-heavy workloads, analytics queries, reporting
# Up to 15 replicas for Aurora, 5 for standard RDS
# Create a read replica
aws rds create-db-instance-read-replica \
--db-instance-identifier myapp-prod-db-replica-1 \
--source-db-instance-identifier myapp-prod-db \
--db-instance-class db.r6g.xlarge \
--availability-zone us-east-1b
# Create cross-region read replica (for DR)
aws rds create-db-instance-read-replica \
--db-instance-identifier myapp-prod-db-dr-replica \
--source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:myapp-prod-db \
--db-instance-class db.m6g.large \
--region us-west-2
# Promote read replica to standalone (for failover / migration)
aws rds promote-read-replica \
--db-instance-identifier myapp-prod-db-replica-1
# After promotion: replica becomes an independent primary
# Update your app to point to new instance endpointAurora Serverless v2
# Aurora Serverless v2 — capacity scales continuously in 0.5 ACU increments
# ACU (Aurora Capacity Unit) ≈ 2 GB RAM + proportional CPU
# Min: 0.5 ACU ($0.06/ACU-hr), Max: 128 ACU
# Scales within seconds — suitable for variable/unpredictable workloads
# NOTE: v2 does NOT scale to 0 (use v1 for true zero-cost idle workloads)
# Create Aurora Serverless v2 cluster
aws rds create-db-cluster \
--db-cluster-identifier myapp-aurora-cluster \
--engine aurora-postgresql \
--engine-version 15.4 \
--master-username dbadmin \
--master-user-password "$(openssl rand -base64 20)" \
--serverless-v2-scaling-configuration "MinCapacity=0.5,MaxCapacity=16" \
--db-subnet-group-name myapp-db-subnet-group \
--vpc-security-group-ids sg-0db123
# Add a Serverless v2 writer instance to the cluster
aws rds create-db-instance \
--db-instance-identifier myapp-aurora-writer \
--db-cluster-identifier myapp-aurora-cluster \
--db-instance-class db.serverless \
--engine aurora-postgresql
# Aurora storage: shared cluster volume, replicated 6 ways across 3 AZs
# Data survives even if all Aurora instances are deleted (unlike standard RDS)
# Aurora I/O-Optimized: no I/O charges — better for I/O-intensive workloads > 25% utilization
# Aurora Global Database — active-write primary, low-latency replicas in up to 5 regions
# Sub-second replication lag; RPO ≈ 1s, RTO ≈ 1min (managed failover)
aws rds create-global-cluster \
--global-cluster-identifier myapp-global \
--source-db-cluster-identifier arn:aws:rds:us-east-1:123:cluster:myapp-aurora-clusterKeep your own version of these notes — editable, searchable, and organised by your stack.
Start free