Ngôn ngữ hiển thị:
Hồi mới bắt đầu học web, mình cứ lưu ảnh upload thẳng vào thư mục /uploads trên server. Mọi thứ chạy ngon cho đến khi server đầy ổ cứng, rồi lúc scale lên 2 server thì ảnh chỉ có trên server 1, server 2 không thấy gì hết. Đó là lúc mình hiểu tại sao tồn tại một dịch vụ như AWS S3.
AWS S3 (Simple Storage Service) là dịch vụ lưu trữ đối tượng (object storage) trên đám mây của Amazon Web Services. Nếu ổ cứng máy tính là tủ đựng đồ trong nhà bạn, thì S3 giống như một kho hàng khổng lồ ở ngoài thành phố — gần như vô hạn dung lượng, bạn chỉ trả tiền cho phần bạn thực sự dùng.
Khái niệm cốt lõi trong S3 gồm hai thứ: Bucket (thùng chứa, giống như một thư mục gốc) và Object (file bất kỳ — ảnh, video, PDF, JSON...). Mỗi object được xác định bởi một key (đường dẫn) trong bucket. Đơn giản vậy thôi.
Tại sao phải quan tâm đến S3 ngay bây giờ? Vì dung lượng lưu trữ ngày càng rẻ nhưng yêu cầu về tốc độ, độ tin cậy và khả năng mở rộng ngày càng cao. Một server VPS 20GB không thể theo kịp khi người dùng upload ảnh và video liên tục. S3 giải quyết bài toán này một cách triệt để: AWS đảm bảo độ bền 99.999999999% (11 số 9), nghĩa là khả năng mất file gần như bằng 0.
S3 không chỉ dùng để lưu ảnh. Ứng dụng của nó rộng hơn bạn nghĩ nhiều:
Đây là luồng cơ bản nhất để bắt đầu với S3. Mình sẽ đi từng bước theo kiểu "làm cùng nhau":
Bước 1: Tạo Bucket
Vào AWS Console → S3 → Create bucket. Điền tên bucket (phải unique toàn cầu, dạng your-company-assets-2026), chọn Region gần nhất với user của bạn (ap-southeast-1 cho Việt Nam). Tắt "Block all public access" nếu bạn cần public URL cho ảnh.
Bước 2: Upload file qua Console hoặc AWS CLI
Cách nhanh nhất để test là upload thẳng qua Console. Nhưng trong thực tế, bạn sẽ dùng AWS CLI hoặc SDK:
# Upload file bằng AWS CLI
aws s3 cp ./image.jpg s3://your-bucket-name/images/image.jpg
# Sync toàn bộ thư mục lên S3
aws s3 sync ./dist s3://your-bucket-name --delete
Bước 3: Cấu hình quyền truy cập (Bucket Policy)
Đây là phần nhiều người mới bị nhầm nhất. Mặc định S3 block hết public access. Nếu bạn muốn ảnh truy cập được qua URL, cần thêm Bucket Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
URL truy cập file sau khi public sẽ có dạng: https://your-bucket-name.s3.ap-southeast-1.amazonaws.com/images/image.jpg
Bước 4: Upload từ code Node.js/Python
Trong ứng dụng thực tế, bạn upload trực tiếp từ backend:
// Node.js với AWS SDK v3
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
const client = new S3Client({ region: "ap-southeast-1" });
await client.send(new PutObjectCommand({
Bucket: "your-bucket-name",
Key: "images/avatar-123.jpg",
Body: fileBuffer,
ContentType: "image/jpeg"
}));
Mẹo xương máu: Dùng Pre-signed URL khi cần cho phép user upload trực tiếp từ browser lên S3 mà không qua server của bạn. Điều này giảm tải server đáng kể và tăng tốc upload cho user. Generate pre-signed URL ở backend, trả về frontend, frontend upload thẳng lên S3 — server bạn không phải xử lý file nặng.
Mình đã tự mắc và thấy người khác mắc những lỗi này khá nhiều:
1. Để lộ credential trong code: Đừng bao giờ hardcode AWS_ACCESS_KEY_ID và AWS_SECRET_ACCESS_KEY trong source code. Dùng IAM Role cho EC2/Lambda, hoặc đọc từ environment variable. Nhiều bạn push code lên GitHub có chứa key và bị AWS charge tiền mining crypto trong vài giờ.
2. Chọn sai Region: Nếu user ở Việt Nam mà bạn chọn Region us-east-1, tốc độ load ảnh sẽ chậm hơn đáng kể. Kết hợp S3 với CloudFront CDN để cache ảnh tại edge location gần user nhất.
3. Không dùng Lifecycle Policy: Log và backup cũ cứ nằm trên S3 Standard tốn tiền. Thiết lập Lifecycle rule để tự động chuyển sang Glacier sau 90 ngày — tiết kiệm đến 70% chi phí lưu trữ cho dữ liệu lạnh.
Q: S3 có thực sự rẻ không? Chi phí cụ thể là bao nhiêu?A: S3 Standard tốn khoảng $0.023/GB/tháng. 100GB ảnh/video = ~$2.3/tháng tiền lưu trữ, cộng thêm phí transfer out khoảng $0.09/GB. Với website nhỏ, tổng chi phí thường dưới $10/tháng. Free Tier cho 5GB đầu tiên trong 12 tháng đầu.
Q: S3 có phải chỉ dành cho doanh nghiệp lớn không?A: Hoàn toàn không. Cá nhân, freelancer, startup đều dùng được. Thậm chí nhiều side project nhỏ dùng S3 vì chi phí pay-as-you-go linh hoạt hơn thuê hosting cố định. Bạn không cần dùng nhiều mới có giá tốt.
Q: Dữ liệu trên S3 có an toàn không? Nếu AWS sập thì sao?A: AWS lưu dữ liệu S3 Standard với ít nhất 3 bản sao trên 3 Availability Zone khác nhau trong cùng Region. Độ bền 99.999999999% là cam kết SLA chính thức. Để backup cross-region, bật S3 Cross-Region Replication. AWS hiếm khi "sập hoàn toàn" — thường chỉ bị ảnh hưởng ở 1-2 AZ.
Nếu ứng dụng của bạn bắt đầu lưu file người dùng, phục vụ ảnh qua web, hoặc cần backup tự động — đó là lúc S3 đáng để đầu tư thời gian setup. Không phải vì nó "cool" hay "enterprise", mà vì nó giải quyết đúng bài toán với chi phí hợp lý nhất. Bài tiếp theo mình sẽ đi sâu hơn vào các Storage Class của S3 — Standard, Intelligent-Tiering, Glacier — và cách chọn đúng loại để tối ưu chi phí lưu trữ theo nhu cầu thực tế.