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:
- ← Phần 0: Chuẩn Bị
- ← Phần 1: Kiến Trúc & VPC
- ← Phần 2: EC2 & Amazon Linux 2023
- Phần 3: RDS, S3 & ElastiCache (Bạn đang ở đây)
- Phần 4: ALB, CloudFront & SSL →
- Phần 5: CI/CD & Zero-Downtime Deploy →