Triển Khai Laravel Lên AWS (Phần 3): RDS MySQL, S3 Storage & ElastiCache Redis

· 5 min read

Phần 2, chúng ta đã thiết lập EC2 server với Nginx và PHP-FPM. Giờ hãy thêm tầng dữ liệu: MySQL quản lý, object storage, và Redis cache.

Tại Sao Dùng Managed Services?

Tự host trên EC2 AWS Managed
Backup Tự cấu hình cron + mysqldump Tự động snapshot hàng ngày
Failover Tự xây replication Multi-AZ tự động failover
Cập nhật Tự patch thủ công One-click cập nhật phiên bản minor
Monitoring Tự cài công cụ Tích hợp CloudWatch metrics

RDS MySQL 8.0

Tạo DB Subnet Group

aws rds create-db-subnet-group \
  --db-subnet-group-name laravel-db-subnet \
  --db-subnet-group-description "Private subnets cho Laravel RDS" \
  --subnet-ids subnet-private-a subnet-private-c

Khởi Chạy RDS Instance

aws rds create-db-instance \
  --db-instance-identifier laravel-mysql \
  --db-instance-class db.t3.micro \
  --engine mysql \
  --engine-version "8.0" \
  --master-username admin \
  --master-user-password "YOUR_STRONG_PASSWORD" \
  --allocated-storage 20 \
  --storage-type gp3 \
  --db-subnet-group-name laravel-db-subnet \
  --vpc-security-group-ids sg-rds \
  --backup-retention-period 7 \
  --no-publicly-accessible \
  --storage-encrypted \
  --multi-az
Tùy chọn Giá trị Tại sao
--no-publicly-accessible RDS nằm trong private subnet, không truy cập internet
--storage-encrypted Mã hóa dữ liệu lưu trữ (miễn phí, không ảnh hưởng hiệu năng)
--multi-az Replica dự phòng ở AZ-c để tự động failover
--backup-retention-period 7 7 ngày Backup tự động giữ 7 ngày

Đợi 5-10 phút, sau đó note lại Endpoint (dạng laravel-mysql.xxxx.ap-northeast-1.rds.amazonaws.com).

Cấu Hình Laravel .env

DB_CONNECTION=mysql
DB_HOST=laravel-mysql.xxxx.ap-northeast-1.rds.amazonaws.com
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=admin
DB_PASSWORD=YOUR_STRONG_PASSWORD

Test Kết Nối Từ EC2

sudo dnf install -y mariadb105
mysql -h laravel-mysql.xxxx.ap-northeast-1.rds.amazonaws.com \
  -u admin -p \
  -e "SELECT VERSION();"

S3 Bucket

Tạo Bucket

aws s3api create-bucket \
  --bucket your-app-laravel-storage \
  --region ap-northeast-1 \
  --create-bucket-configuration LocationConstraint=ap-northeast-1

# Chặn toàn bộ public access
aws s3api put-public-access-block \
  --bucket your-app-laravel-storage \
  --public-access-block-configuration \
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

# Bật versioning
aws s3api put-bucket-versioning \
  --bucket your-app-laravel-storage \
  --versioning-configuration Status=Enabled

# Bật mã hóa
aws s3api put-bucket-encryption \
  --bucket your-app-laravel-storage \
  --server-side-encryption-configuration '{
    "Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]
  }'

Cấu Hình Laravel Cho S3

composer require league/flysystem-aws-s3-v3
FILESYSTEM_DISK=s3
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=your-app-laravel-storage
# Không cần AWS_ACCESS_KEY_ID hoặc AWS_SECRET_ACCESS_KEY!
# IAM role từ Phần 1 tự động cung cấp credentials.

Sử Dụng Trong Laravel

// Upload
Storage::disk('s3')->put('avatars/user-1.jpg', $file);

// Lấy URL tạm thời (cho file private)
$url = Storage::disk('s3')->temporaryUrl('avatars/user-1.jpg', now()->addMinutes(5));

ElastiCache Redis

Redis cải thiện đáng kể hiệu năng Laravel cho sessions, cache, và queues.

Tạo Cache Subnet Group và Security Group

aws elasticache create-cache-subnet-group \
  --cache-subnet-group-name laravel-redis-subnet \
  --cache-subnet-group-description "Private subnets cho Laravel Redis" \
  --subnet-ids subnet-private-a subnet-private-c

aws ec2 create-security-group \
  --group-name laravel-redis-sg \
  --description "Redis - Chi cho phep tu EC2" \
  --vpc-id vpc-xxxx

aws ec2 authorize-security-group-ingress \
  --group-id sg-redis \
  --protocol tcp --port 6379 \
  --source-group sg-ec2

Tạo ElastiCache Cluster

aws elasticache create-cache-cluster \
  --cache-cluster-id laravel-redis \
  --cache-node-type cache.t3.micro \
  --engine redis \
  --num-cache-nodes 1 \
  --cache-subnet-group-name laravel-redis-subnet \
  --security-group-ids sg-redis

Cấu Hình Laravel

CACHE_STORE=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
REDIS_HOST=laravel-redis.xxxx.cache.amazonaws.com
REDIS_PASSWORD=null
REDIS_PORT=6379

So Sánh Hiệu Năng

Tính năng File/DB Redis
Đọc session ~5ms ~0.2ms
Đọc cache ~5ms ~0.2ms
Dispatch queue ~10ms ~1ms

Backup Database Ra S3

sudo vim /opt/scripts/backup-db.sh
#!/bin/bash
set -euo pipefail

TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="/tmp/laravel_backup_${TIMESTAMP}.sql.gz"

mysqldump \
  -h laravel-mysql.xxxx.ap-northeast-1.rds.amazonaws.com \
  -u admin -p"${DB_PASSWORD}" \
  --single-transaction --routines --triggers \
  laravel | gzip > "${BACKUP_FILE}"

aws s3 cp "${BACKUP_FILE}" "s3://your-app-laravel-storage/backups/db/"
rm -f "${BACKUP_FILE}"
sudo chmod +x /opt/scripts/backup-db.sh
echo "0 3 * * * /opt/scripts/backup-db.sh >> /var/log/db-backup.log 2>&1" | crontab -

Tiếp Theo

Phần 4, chúng ta sẽ thiết lập Application Load Balancer với SSL termination qua ACM, cấu hình CloudFront làm CDN cho assets tĩnh, và thiết lập Route 53 quản lý domain.


Điều hướng Series:

Bình luận