Triển Khai Laravel Lên AWS Qua Console (Phần 3): RDS MySQL, S3 Storage & ElastiCache Redis
Ở Phần 2, chúng ta đã khởi chạy EC2 và cài đặt Nginx + PHP-FPM. Giờ hãy thêm tầng dữ liệu: MySQL quản lý, object storage, và Redis cache — tất cả qua giao diện Console.
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 minor version |
| Monitoring | Tự cài công cụ | Tích hợp CloudWatch metrics |
Managed services đắt hơn một chút nhưng tiết kiệm rất nhiều thời gian vận hành.
RDS MySQL 8.0
Bước 1: Tạo DB Subnet Group
Trước khi tạo RDS, cần định nghĩa RDS sẽ nằm ở subnet nào.
- Thanh tìm kiếm → gõ "RDS" → click RDS
- Menu bên trái → Subnet groups
- Click "Create DB subnet group"
| Thiết lập | Giá trị |
|---|---|
| Name | laravel-db-subnet |
| Description | Private subnets cho Laravel RDS |
| VPC | laravel-production-vpc |
- Phần Add subnets:
- Availability Zones: chọn
ap-northeast-1avàap-northeast-1c - Subnets: chọn hai private subnets (10.0.11.0/24 và 10.0.12.0/24)
- Availability Zones: chọn
- Click "Create"
Bước 2: Tạo RDS Instance
- RDS → Databases → Create database
- Chọn "Standard create" (không phải Easy create — chúng ta cần kiểm soát chi tiết)
Engine Options
| Thiết lập | Giá trị |
|---|---|
| Engine type | MySQL |
| Engine version | MySQL 8.0.x (mới nhất) |
Templates
Chọn "Production" (hoặc "Free tier" nếu đang thử nghiệm)
Settings
| Thiết lập | Giá trị |
|---|---|
| DB instance identifier | laravel-mysql |
| Master username | admin |
| Credentials management | Self managed |
| Master password | Mật khẩu mạnh (lưu vào password manager!) |
| Confirm password | Nhập lại |
Quan trọng: Lưu mật khẩu ngay. Bạn sẽ cần nó cho
.envcủa Laravel.
Instance Configuration
| Thiết lập | Giá trị |
|---|---|
| DB instance class | Burstable classes → db.t3.micro (Free tier) |
db.t3.micro(1 vCPU, 1GB RAM) đủ cho apps nhỏ-vừa. Nâng cấp lêndb.t3.smallhoặcdb.t3.mediumkhi traffic tăng.
Storage
| Thiết lập | Giá trị |
|---|---|
| Storage type | gp3 |
| Allocated storage | 20 GB |
| Storage autoscaling | ✅ Enable |
| Maximum storage threshold | 100 GB |
Availability & Durability
| Thiết lập | Giá trị |
|---|---|
| Multi-AZ deployment | Create a Multi-AZ DB instance |
Multi-AZ tạo replica dự phòng ở AZ khác. Nếu primary fail, tự động failover trong ~60 giây. Tăng chi phí gấp đôi nhưng đáng cho production.
Connectivity
| Thiết lập | Giá trị |
|---|---|
| Virtual private cloud (VPC) | laravel-production-vpc |
| DB subnet group | laravel-db-subnet |
| Public access | No |
| VPC security group | Choose existing → laravel-rds-sg |
| Availability Zone | No preference |
Public access = No bắt buộc. Database không bao giờ được tiếp xúc internet.
Database Authentication
Chọn "Password authentication"
Additional Configuration
Expand phần này:
| Thiết lập | Giá trị |
|---|---|
| Initial database name | laravel |
| Backup retention period | 7 days |
| Backup window | No preference |
| Enable encryption | ✅ Yes (AES-256, miễn phí) |
| Enable Enhanced Monitoring | ✅ Yes, Granularity: 60 seconds |
| Enable auto minor version upgrade | ✅ Yes |
| Deletion protection | ✅ Enable |
- Click "Create database"
- Đợi 5-10 phút cho status chuyển sang Available
Bước 3: Lấy Endpoint
- RDS → Databases → click
laravel-mysql - Tab Connectivity & security
- Ghi lại Endpoint (dạng
laravel-mysql.xxxx.ap-northeast-1.rds.amazonaws.com) - Port:
3306
Bước 4: Cấu Hình Laravel .env
SSH vào EC2 và cập nhật .env:
ssh laravel-prod
vim /var/www/laravel/shared/.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
Bước 5: Test Kết Nối Từ EC2
# Cài MySQL client
sudo dnf install -y mariadb105
# Test kết nối
mysql -h laravel-mysql.xxxx.ap-northeast-1.rds.amazonaws.com \
-u admin -p \
-e "SELECT VERSION();"
Nếu timeout → kiểm tra:
- Security group
laravel-rds-sgcó rule port 3306 từlaravel-ec2-sg - RDS và EC2 ở cùng VPC
- RDS ở private subnet
S3 Bucket
Bước 1: Tạo Bucket
- Thanh tìm kiếm → "S3" → click S3
- Click "Create bucket"
| Thiết lập | Giá trị |
|---|---|
| Bucket type | General purpose |
| Bucket name | your-app-laravel-storage (phải unique toàn cầu) |
| AWS Region | ap-northeast-1 |
Tên bucket phải unique trên toàn bộ AWS (không chỉ tài khoản bạn). Dùng prefix như tên công ty:
mycompany-laravel-storage.
Object Ownership
Chọn "ACLs disabled (recommended)"
Block Public Access Settings
Giữ tất cả 4 checkbox được tick (Block ALL public access):
- ✅ Block public access to buckets and objects granted through new access control lists (ACLs)
- ✅ Block public access to buckets and objects granted through any access control lists (ACLs)
- ✅ Block public access to buckets and objects granted through new public bucket or access point policies
- ✅ Block public access to buckets and objects granted through any public bucket or access point policies
Quan trọng: Laravel sẽ dùng signed URLs cho file private. Không cần public access.
Bucket Versioning
Chọn "Enable" → cho phép khôi phục file bị xóa nhầm.
Default Encryption
| Thiết lập | Giá trị |
|---|---|
| Encryption type | Server-side encryption with Amazon S3 managed keys (SSE-S3) |
| Bucket Key | Enable |
- Click "Create bucket"
Bước 2: Thêm Lifecycle Rule (Tùy chọn)
Tự động xóa file cũ để tiết kiệm chi phí:
- Click vào bucket vừa tạo
- Tab Management → Create lifecycle rule
| Thiết lập | Giá trị |
|---|---|
| Rule name | cleanup-old-versions |
| Apply to all objects | ✅ |
| Lifecycle rule actions | ✅ Permanently delete noncurrent versions of objects |
| Days after objects become noncurrent | 90 |
- Create rule
Bước 3: Cấu Hình Laravel Cho S3
SSH vào EC2:
cd /var/www/laravel/current
composer require league/flysystem-aws-s3-v3
Cập nhật .env:
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 laravel-ec2-role tự động cung cấp credentials.
IAM role đã cấu hình ở Phần 1 cho phép EC2 truy cập S3 mà không cần access key. Đây là best practice — không hardcode credentials.
Sử Dụng Trong Laravel
// Upload file
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 hiệu năng Laravel đáng kể cho sessions, cache, và queues.
Bước 1: Tạo Subnet Group
- Thanh tìm kiếm → "ElastiCache" → click ElastiCache
- Menu bên trái → Subnet groups
- Click "Create subnet group"
| Thiết lập | Giá trị |
|---|---|
| Name | laravel-redis-subnet |
| Description | Private subnets cho Laravel Redis |
| VPC ID | laravel-production-vpc |
- Phần Subnets: chọn hai private subnets
- Create
Bước 2: Tạo Redis Cluster
- ElastiCache → menu bên trái → Redis caches
- Click "Create Redis cache"
Cluster Settings
| Thiết lập | Giá trị |
|---|---|
| Deployment option | Design your own cache |
| Creation method | Easy create hoặc Cluster cache |
| Cluster mode | Disabled (đủ cho apps nhỏ-vừa) |
| Name | laravel-redis |
| Engine version | Mới nhất |
| Port | 6379 |
| Node type | cache.t3.micro (Free tier eligible) |
| Number of replicas | 0 (tiết kiệm; tăng lên 1-2 cho HA) |
Subnet and Security
| Thiết lập | Giá trị |
|---|---|
| Subnet group | laravel-redis-subnet |
| Security groups | laravel-redis-sg |
- Các thiết lập khác giữ mặc định
- Click "Create"
- Đợi 3-5 phút cho status Available
Bước 3: Lấy Endpoint
- Click vào
laravel-redis - Ghi lại Primary Endpoint (dạng
laravel-redis.xxxx.cache.amazonaws.com)
Bước 4: Cấu Hình Laravel
Cập nhật .env trên EC2:
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/Database | Redis |
|---|---|---|
| Đọc session | ~5ms | ~0.2ms |
| Đọc cache | ~5ms | ~0.2ms |
| Dispatch queue | ~10ms | ~1ms |
Backup Database Ra S3
Tạo script backup tự động trên EC2:
sudo mkdir -p /opt/scripts
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
# Thêm cron chạy lúc 3h sáng hàng ngày
(crontab -l 2>/dev/null; echo "0 3 * * * DB_PASSWORD='YOUR_PASSWORD' /opt/scripts/backup-db.sh >> /var/log/db-backup.log 2>&1") | crontab -
Xác Nhận Qua Console
Kiểm Tra RDS
- RDS → Databases → laravel-mysql
- Status: Available ✅
- Tab Monitoring: xem CPU, connections, storage
Kiểm Tra S3
- S3 → click bucket
- Thử upload file test và xóa
Kiểm Tra ElastiCache
- ElastiCache → Redis caches → laravel-redis
- Status: Available ✅
Checklist Sau Phần 3
- RDS MySQL
laravel-mysqlđang Available - Kết nối MySQL từ EC2 thành công
- S3 bucket đã tạo với versioning + encryption
- Laravel
.envđã cấu hình S3 (dùng IAM role, không access key) - ElastiCache Redis
laravel-redisđang Available - Laravel
.envđã cấu hình Redis cho cache + session + queue - Script backup database đã thiết lập
Tầng dữ liệu hoàn chỉnh. Tiếp theo: cân bằng tải và CDN.
Đ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 →