Skip to content
intermediate Phase 3 · AWS Databases

RDS & Aurora

Deploy managed relational databases with RDS and Aurora.

1h 15m
0 problems
Topic Progress 0%

RDS Fundamentals

RDS Fundamentals

Amazon Relational Database Service (RDS) is a managed relational database supporting MySQL, PostgreSQL, MariaDB, Oracle, SQL Server, and Amazon Aurora.

Supported Engines

Engine Versions Best For
MySQL 5.7, 8.0 General workloads
PostgreSQL 12-16 Complex queries, GIS
MariaDB 10.x MySQL compatibility
Oracle 19c, 21c Enterprise applications
SQL Server 2019 .NET applications
Aurora MySQL/PG compatible High performance, serverless

Create RDS Instance

# Create a MySQL RDS instance
aws rds create-db-instance \
  --db-instance-identifier mydb \
  --db-instance-class db.t3.micro \
  --engine mysql \
  --engine-version 8.0 \
  --master-username admin \
  --master-user-password SecurePass123! \
  --allocated-storage 20 \
  --max-allocated-storage 100 \
  --storage-type gp3 \
  --storage-encrypted \
  --vpc-security-group-ids sg-xxx \
  --db-subnet-group-name my-subnet-group \
  --backup-retention-period 7 \
  --preferred-backup-window 03:00-04:00 \
  --preferred-maintenance-window sun:04:00-sun:05:00 \
  --multi-az \
  --publicly-accessible false

# Check status
aws rds describe-db-instances --db-instance-identifier mydb

Connection

# Get endpoint
aws rds describe-db-instances \
  --db-instance-identifier mydb \
  --query 'DBInstances[0].Endpoint.Address'

# Connect with MySQL client
mysql -h mydb.xxxx.us-east-1.rds.amazonaws.com -u admin -p

Multi-AZ and Read Replicas

Multi-AZ and Read Replicas

Multi-AZ Deployment

Provides high availability with automatic failover to a standby replica in a different AZ.

# Enable Multi-AZ
aws rds modify-db-instance \
  --db-instance-identifier mydb \
  --multi-az \
  --apply-immediately

# Check Multi-AZ status
aws rds describe-db-instances \
  --db-instance-identifier mydb \
  --query 'DBInstances[0].[MultiAZ,StatusInfos]'

Read Replicas

Create read-only copies for scaling read traffic.

# Create a read replica
aws rds create-db-instance-read-replica \
  --db-instance-identifier mydb-replica-1 \
  --source-db-instance-identifier mydb \
  --instance-class db.t3.medium

# Create cross-region read replica
aws rds create-db-instance-read-replica \
  --db-instance-identifier mydb-eu-replica \
  --source-db-instance-identifier arn:aws:rds:us-east-1:xxx:db:mydb \
  --source-region us-east-1 \
  --region eu-west-1

# Promote read replica to standalone
aws rds promote-read-replica --db-instance-identifier mydb-replica-1

Multi-AZ vs Read Replicas

Feature Multi-AZ Read Replicas
Purpose High availability Read scaling
Automatic Failover Yes No
Data Sync Synchronous Asynchronous
Location Same region, different AZ Same or cross region
Writes Primary only Primary only
Reads Primary only Replica only

Backup and Recovery

Backup and Recovery

Automated Backups

# Configure backup retention
aws rds modify-db-instance \
  --db-instance-identifier mydb \
  --backup-retention-period 35 \
  --preferred-backup-window 03:00-04:00

# Take a manual snapshot
aws rds create-db-snapshot \
  --db-instance-identifier mydb \
  --db-snapshot-identifier manual-backup-$(date +%Y%m%d)

# Copy snapshot to another region
aws rds copy-db-snapshot \
  --source-db-snapshot-identifier arn:aws:rds:us-east-1:xxx:snapshot:mydb-snapshot \
  --target-db-snapshot-identifier mydb-snapshot-eu \
  --source-region us-east-1 \
  --region eu-west-1

# List snapshots
aws rds describe-db-snapshots \
  --db-instance-identifier mydb \
  --query 'DBSnapshots[*].[DBSnapshotIdentifier,Status,SnapshotCreateTime]' \
  --output table

Point-in-Time Recovery

# Restore to a specific point in time
aws rds restore-db-instance-to-point-in-time \
  --source-db-instance-identifier mydb \
  --target-db-instance-identifier mydb-restored \
  --restore-time "2024-01-15T14:30:00Z"

# Restore to a specific second
aws rds restore-db-instance-to-point-in-time \
  --source-db-instance-identifier mydb \
  --target-db-instance-identifier mydb-restored \
  --use-latest-restorable-time

Backup Window Strategy

00:00  03:00  04:00  06:00  12:00  18:00  23:59
  |──────|██████|──────|                              
       Backup Window                                  
       (03:00-04:00 UTC)                             

High traffic hours: 09:00-18:00                       
Maintenance window: sun:04:00-sun:05:00

Amazon Aurora

Amazon Aurora

Aurora provides MySQL and PostgreSQL compatibility with 5x MySQL and 3x PostgreSQL performance.

Aurora Features

  • Storage: Auto-scales 10 GB to 128 TB
  • Replicas: Up to 15 read replicas
  • Backups: Continuous to S3, no performance impact
  • High Availability: 6 copies of data across 3 AZs

Create Aurora Cluster

# Create Aurora MySQL cluster
aws rds create-db-cluster \
  --db-cluster-identifier myaurora-cluster \
  --engine aurora-mysql \
  --engine-version 8.0.mysql_aurora.3.04.0 \
  --master-username admin \
  --master-user-password SecurePass123! \
  --backup-retention-period 7 \
  --preferred-backup-window 03:00-04:00

# Create primary instance
aws rds create-db-instance \
  --db-instance-identifier myaurora-primary \
  --db-instance-class db.r6g.large \
  --engine aurora-mysql \
  --db-cluster-identifier myaurora-cluster

# Create read replica
aws rds create-db-instance \
  --db-instance-identifier myaurora-replica-1 \
  --db-instance-class db.r6g.large \
  --engine aurora-mysql \
  --db-cluster-identifier myaurora-cluster

Aurora Serverless v2

# Create Serverless cluster
aws rds create-db-cluster \
  --db-cluster-identifier myserverless-cluster \
  --engine aurora-postgresql \
  --engine-version 14.7 \
  --master-username admin \
  --master-user-password SecurePass123! \
  --serverless-v2-scaling-configuration '{
    "MinCapacity": 0.5,
    "MaxCapacity": 16,
    "SecondsUntilAutoPause": 300
  }'

# Create serverless instance
aws rds create-db-instance \
  --db-instance-identifier myserverless-instance \
  --db-instance-class db.serverless \
  --engine aurora-postgresql \
  --db-cluster-identifier myserverless-cluster

Aurora Global Database

# Create global database
aws rds create-global-cluster \
  --global-cluster-identifier my-global-db \
  --engine aurora-postgresql \
  --engine-version 14.7

# Add secondary region
aws rds create-db-cluster \
  --db-cluster-identifier myaurora-eu \
  --engine aurora-postgresql \
  --global-cluster-identifier my-global-db \
  --region eu-west-1

RDS Security and Best Practices

RDS Security and Best Practices

Encryption

# Enable encryption at rest
aws rds create-db-instance \
  --db-instance-identifier mydb \
  --storage-encrypted \
  --kms-key-id alias/aws/rds

# Encryption in transit
# Use SSL/TLS connections:
mysql -h mydb.xxxx.us-east-1.rds.amazonaws.com -u admin -p --ssl-ca=rds-combined-ca-bundle.pem

IAM Authentication

# Enable IAM authentication
aws rds modify-db-instance \
  --db-instance-identifier mydb \
  --enable-iam-database-authentication

# Create IAM policy for RDS access
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": "rds-db:connect",
    "Resource": "arn:aws:rds-db:us-east-1:123456789012:dbuser:xxx/db-user"
  }]
}

# Generate auth token
aws rds generate-db-auth-token \
  --hostname mydb.xxxx.us-east-1.rds.amazonaws.com \
  --port 3306 \
  --username db-user \
  --region us-east-1

Parameter Groups

# Create a parameter group
aws rds create-db-parameter-group \
  --db-parameter-group-family mysql8.0 \
  --db-parameter-group-name my-custom-params \
  --description "Custom MySQL parameters"

# Modify parameters
aws rds modify-db-parameter-group \
  --db-parameter-group-name my-custom-params \
  --parameters 'ParameterName=max_connections,ParameterValue=500,ApplyMethod=pending-reboot' \
  --parameters 'ParameterName=innodb_buffer_pool_size,ParameterValue=2684354560,ApplyMethod=pending-reboot'

# Apply to instance
aws rds modify-db-instance \
  --db-instance-identifier mydb \
  --db-parameter-group-name my-custom-params \
  --apply-immediately

Cost Optimization

  • Use db.t3.micro for dev/test (burstable)
  • Reserved Instances for production (up to 60% savings)
  • Right-size based on CloudWatch metrics
  • Use Storage Auto Scaling instead of over-provisioning