AWS S3 là gì? Tại Sao Mọi Website Lớn Đều Dùng S3 Để Lưu Ảnh và Video
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 là gì? Giải thích theo cách dễ hiểu nhất
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.
Những trường hợp thực tế bạn sẽ dùng S3
S3 không chỉ dùng để lưu ảnh. Ứng dụng của nó rộng hơn bạn nghĩ nhiều:
- Lưu trữ media cho web/app: Ảnh sản phẩm, avatar người dùng, video hướng dẫn — đẩy hết lên S3, dùng URL trực tiếp trong thẻ img hoặc video. Server của bạn không tốn một byte nào. Shopee, Tiki, các sàn TMDT lớn đều làm vậy.
- Host website tĩnh: S3 có tính năng Static Website Hosting. Bạn có thể deploy toàn bộ app React/Vue đã build lên S3, kết hợp CloudFront CDN, chi phí gần như bằng 0 so với thuê server. Phù hợp cho landing page, blog, portfolio.
- Backup và archive dữ liệu: Backup database hàng ngày, log hệ thống, file cấu hình — đẩy lên S3 với storage class Glacier để chi phí cực rẻ. Nhiều công ty dùng S3 như kho backup dài hạn thay vì mua NAS đắt tiền.
Cách dùng S3: Từng bước từ tạo Bucket đến upload file
Đâ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.
Ổ gà thường gặp khi mới dùng S3
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.
FAQ — Những câu hỏi thực tế về S3
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.
Góc nhìn thực tế: Khi nào nên chuyển sang S3?
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ế.
