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

· 9 min read

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.

  1. Thanh tìm kiếm → gõ "RDS" → click RDS
  2. Menu bên trái → Subnet groups
  3. 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
  1. Phần Add subnets:
    • Availability Zones: chọn ap-northeast-1aap-northeast-1c
    • Subnets: chọn hai private subnets (10.0.11.0/24 và 10.0.12.0/24)
  2. Click "Create"

Bước 2: Tạo RDS Instance

  1. RDS → Databases → Create database
  2. 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 .env của Laravel.

Instance Configuration

Thiết lập Giá trị
DB instance class Burstable classesdb.t3.micro (Free tier)

db.t3.micro (1 vCPU, 1GB RAM) đủ cho apps nhỏ-vừa. Nâng cấp lên db.t3.small hoặc db.t3.medium khi 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 existinglaravel-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
  1. Click "Create database"
  2. Đợi 5-10 phút cho status chuyển sang Available

Bước 3: Lấy Endpoint

  1. RDS → Databases → click laravel-mysql
  2. Tab Connectivity & security
  3. Ghi lại Endpoint (dạng laravel-mysql.xxxx.ap-northeast-1.rds.amazonaws.com)
  4. 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-sg có rule port 3306 từ laravel-ec2-sg
  • RDS và EC2 ở cùng VPC
  • RDS ở private subnet

S3 Bucket

Bước 1: Tạo Bucket

  1. Thanh tìm kiếm → "S3" → click S3
  2. 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
  1. 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í:

  1. Click vào bucket vừa tạo
  2. Tab ManagementCreate 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
  1. 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

  1. Thanh tìm kiếm → "ElastiCache" → click ElastiCache
  2. Menu bên trái → Subnet groups
  3. 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
  1. Phần Subnets: chọn hai private subnets
  2. Create

Bước 2: Tạo Redis Cluster

  1. ElastiCache → menu bên trái → Redis caches
  2. 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
  1. Các thiết lập khác giữ mặc định
  2. Click "Create"
  3. Đợi 3-5 phút cho status Available

Bước 3: Lấy Endpoint

  1. Click vào laravel-redis
  2. 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

  1. RDS → Databases → laravel-mysql
  2. Status: Available
  3. Tab Monitoring: xem CPU, connections, storage

Kiểm Tra S3

  1. S3 → click bucket
  2. Thử upload file test và xóa

Kiểm Tra ElastiCache

  1. ElastiCache → Redis caches → laravel-redis
  2. 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:

Bình luận