Giá và free tier trong bài dựa trên thông tin công bố tính đến 16/06/2026. Nên kiểm tra lại trang pricing chính thức trước khi quyết định vì Cloudflare và AWS đều điều chỉnh pricing theo thời gian.
Kết luận nhanh
- R2 thắng rõ ràng nếu workload có nhiều bandwidth ra ngoài (serve file, media, download) — egress fee bằng 0 là lợi thế quyết định
- S3 thắng nếu cần tích hợp sâu trong hệ sinh thái AWS: Lambda trigger, EventBridge, Athena, EMR, Step Functions...
- Free tier R2 tốt hơn hẳn và không hết hạn — S3 free tier chỉ 12 tháng cho account mới
- Migration từ S3 sang R2 dễ vì R2 tương thích S3 API, chỉ cần đổi endpoint
Bảng so sánh nhanh
| Cloudflare R2 | AWS S3 (us-east-1) | |
|---|---|---|
| Lưu trữ | $0.015/GB/tháng | $0.023/GB/tháng |
| Egress ra Internet | $0 — miễn phí | $0.09/GB (10TB đầu) |
| Class A (write, list) | $4.50/triệu requests | $0.005/1.000 requests |
| Class B (read, GET) | $0.36/triệu requests | $0.0004/1.000 requests |
| Free tier storage | 10GB/tháng (không hết hạn) | 5GB/tháng (12 tháng đầu) |
| Free tier requests | 1M write + 10M read/tháng | 2.000 PUT + 20.000 GET/tháng |
| S3-compatible API | Có | — (native) |
| CDN tích hợp | Cloudflare global network | Cần CloudFront thêm phí |
Egress fee — lý do R2 tồn tại
AWS S3 tính phí $0.09/GB cho mỗi GB dữ liệu truyền ra Internet. Với workload serve media, file download hay static asset, đây là khoản chi phí lớn nhất — không phải storage.
Ví dụ thực tế:
App có 100GB dữ liệu, mỗi tháng user tải về 1TB:
| R2 | S3 | |
|---|---|---|
| Storage | $1.50 | $2.30 |
| Egress (1TB) | $0 | $92.16 |
| Requests (ước tính) | ~$1 | ~$1 |
| Tổng/tháng | ~$2.50 | ~$95 |
Chênh lệch ~38 lần chỉ vì egress. Với traffic cao hơn, khoảng cách càng rộng.
Cloudflare R2 không tính egress vì R2 nằm trên network của Cloudflare — bandwidth đã được tính vào hạ tầng của họ. Đây là lý do R2 ra đời: cạnh tranh trực tiếp với mô hình egress pricing của AWS.
Free tier chi tiết
Cloudflare R2 free tier
- 10GB storage/tháng — không giới hạn thời gian, không cần credit card để dùng free tier
- 1 triệu Class A operations/tháng (PUT, POST, COPY, LIST)
- 10 triệu Class B operations/tháng (GET, HEAD)
- Egress luôn miễn phí kể cả khi vượt free tier
Đủ để chạy app nhỏ hoặc side project mà không tốn tiền.
AWS S3 free tier
- 5GB storage/tháng — chỉ áp dụng 12 tháng đầu sau khi tạo account
- 20.000 GET requests/tháng
- 2.000 PUT requests/tháng
- Không bao gồm egress — tải về vẫn tính tiền dù đang trong free tier
Sau 12 tháng, không còn free tier. Với project lâu dài, S3 sẽ có chi phí kể cả với lượng data nhỏ nếu có bandwidth ra ngoài.
Tính năng — S3 vẫn toàn diện hơn
R2 có
- Object storage cơ bản (PUT, GET, DELETE, LIST)
- Object versioning
- Lifecycle rules (tự xóa object sau N ngày)
- Presigned URLs
- CORS configuration
- Custom domain qua Cloudflare
- Event notifications qua Cloudflare Queues
- S3-compatible API (dùng được AWS SDK, chỉ đổi endpoint)
S3 có thêm so với R2
- Lambda trigger trực tiếp khi có object mới — R2 phải qua Queues, thêm bước
- S3 Select — query dữ liệu bên trong file CSV/JSON/Parquet mà không tải toàn bộ file
- S3 Inventory — báo cáo định kỳ về toàn bộ object
- Storage Class: Standard, Infrequent Access, Glacier — tiết kiệm chi phí cho cold data
- Replication cross-region và cross-account
- Tích hợp native với hàng chục AWS service: Athena, EMR, Redshift Spectrum, Glue, Step Functions, EventBridge...
- Access Points — quản lý quyền truy cập phức tạp theo VPC, prefix
- Nhiều region hơn (30+)
R2 phù hợp cho bài toán lưu trữ và serve file. S3 phù hợp khi storage là một mắt xích trong pipeline data lớn hơn.
Migrate từ S3 sang R2
R2 tương thích S3 API nên migration thường chỉ cần đổi endpoint và credential:
// Trước: AWS S3
import { S3Client } from "@aws-sdk/client-s3";
const s3 = new S3Client({
region: "us-east-1",
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
},
});
// Sau: Cloudflare R2 — chỉ thay endpoint và credentials
const r2 = new S3Client({
region: "auto",
endpoint: `https://${process.env.CF_ACCOUNT_ID}.r2.cloudflarestorage.com`,
credentials: {
accessKeyId: process.env.R2_ACCESS_KEY_ID,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
},
});
Tất cả operation như PutObjectCommand, GetObjectCommand, DeleteObjectCommand dùng y hệt — không cần sửa business logic.
Lưu ý khi migrate:
- Tên bucket phải tạo lại trên R2 (không tự đồng bộ)
- Object cần copy thủ công hoặc dùng
rclone - Nếu đang dùng S3 event trigger vào Lambda, phải refactor qua Cloudflare Queues + Workers
- Presigned URL format khác endpoint nhưng logic tạo URL giống nhau
Dùng rclone để sync dữ liệu từ S3 sang R2
# Cấu hình R2 trong rclone
rclone config create r2 s3 \
provider Cloudflare \
access_key_id YOUR_R2_KEY \
secret_access_key YOUR_R2_SECRET \
endpoint https://ACCOUNT_ID.r2.cloudflarestorage.com \
acl private
# Copy toàn bộ bucket từ S3 sang R2
rclone copy s3:your-s3-bucket r2:your-r2-bucket --progress
Nên chọn R2 hay S3
Chọn R2 khi:
- App serve file, image, video cho user — tiết kiệm egress
- Side project, startup cần giữ cost thấp
- Không cần tích hợp sâu với AWS service
- Muốn free tier không giới hạn thời gian
Chọn S3 khi:
- Hệ thống đã chạy trên AWS và cần tích hợp với Lambda, Athena, EMR, EventBridge
- Cần S3 Select để query dữ liệu trực tiếp trong file
- Cần cross-region replication với SLA cụ thể
- Team đã quen với AWS IAM và không muốn thêm vendor
Dùng cả hai khi:
- Lưu cold data hoặc backup lâu dài trên S3 Glacier (rẻ hơn)
- Serve hot data, media, asset qua R2 (egress 0 đồng)