· cloudflare / aws / s3

Cloudflare R2 vs AWS S3 — lưu trữ cho developer năm 2026

R2 thắng mỗi khi egress là khoản chi lớn nhất. S3 thắng khi bạn cần tích hợp sâu với AWS, lưu trữ Glacier, hoặc compliance đã được kiểm chứng nhiều năm.

Bởi

2.195 từ · 11 phút đọc

Chọn Cloudflare R2 nếu bạn đang trả hóa đơn egress của S3. Phí egress bằng không thay đổi toàn bộ phép tính — 100 GB lưu trữ với 1 TB tải xuống mỗi tháng tốn khoảng $1.86 trên R2 so với $83.70 trên S3, chênh nhau 45 lần. Chọn AWS S3 nếu bạn cần Lambda event triggers, truy vấn Athena, lưu trữ Glacier Deep Archive ở mức $0.001/GB, hoặc công cụ compliance đã qua nhiều năm kiểm duyệt ngân hàng. Hai dịch vụ này gần nhau hơn bạn nghĩ, nhưng chính sách egress và độ sâu của hệ sinh thái AWS là điểm phân định quyết định.

Bài này dành cho ai

Indie dev và team nhỏ đang chọn object store chính trong năm 2026. Nếu workload của bạn đã gắn chặt với các dịch vụ AWS trigger từ S3 — Lambda, SageMaker, Athena, Glue — bài này không thay đổi được gì cho bạn: dùng S3 là đúng rồi.

Dữ liệu chúng tôi dùng

Chúng tôi xem xét Cloudflare R2 (GA từ 2022, S3-compatible API, edge network toàn cầu, Bucket Lock GA từ tháng 3 năm 2025) và AWS S3 us-east-1 (Standard storage class). Số liệu hiệu năng lấy từ benchmark của chính Cloudflare (blog.cloudflare.com/r2-is-faster-than-s3) và nghiên cứu throughput small-object độc lập của Tigris Data. Giá lấy trực tiếp từ trang pricing của Cloudflare R2trang pricing của AWS S3, cả hai truy cập tháng 6 năm 2026. Code dùng AWS SDK v3 — cùng SDK chạy được trên cả hai dịch vụ.

Giá cả: R2 thắng mặc định

Con số nổi bật nhất là egress. S3 tính $0.09/GB sau 100 GB miễn phí mỗi tháng. R2 không tính gì. Mọi thứ còn lại chỉ là chi tiết phụ.

Lưu trữ và operations

R2 StandardR2 Infrequent AccessS3 Standard
Lưu trữ$0.015/GB-tháng$0.010/GB-tháng$0.023/GB-tháng
PUT / LIST requests$4.50/triệu$9.00/triệu$5.00/triệu
GET requests$0.36/triệu$0.90/triệu$0.40/triệu
Phí truy xuất$0.01/GB
EgressMiễn phíMiễn phí$0.09/GB (sau 100 GB)

Free tier của R2 bao gồm 10 GB lưu trữ, 1 triệu Class A operations và 10 triệu Class B operations mỗi tháng. Hầu hết dự án cá nhân không phải trả đồng nào.

Chi phí thực tế

Các kịch bản dưới đây giả định 1 TB egress mỗi tháng — mức phổ biến của app nặng về media hoặc SaaS có user-uploaded assets.

Kịch bảnR2S3Tiết kiệm
100 GB lưu trữ + 1 TB egress/tháng~$1.86~$83.70Rẻ hơn 45 lần
1 TB lưu trữ + 1 TB egress/tháng~$15.72~$107.11Rẻ hơn 6.8 lần
10 TB lưu trữ + 1 TB egress/tháng~$153.96~$319.08Rẻ hơn 2 lần

Xu hướng rất rõ: R2 luôn thắng khi egress vượt khoảng 111 GB/tháng, bất kể quy mô lưu trữ. Dưới ngưỡng đó, giá per-request rẻ hơn một chút của S3 có thể thu hẹp khoảng cách, nhưng chênh lệch không đáng kể.

Trường hợp duy nhất S3 thắng về giá: lưu trữ lạnh không cần tải xuống. S3 Glacier Deep Archive ở $0.00099/GB rẻ hơn R2 Standard 94% ở mức $0.015/GB. Nếu bạn đang lưu compliance logs hoặc cold backup không bao giờ download, Glacier Deep Archive là lựa chọn đúng và R2 không có gì cạnh tranh được ở phân khúc này. Để xem breakdown chi phí đầy đủ trên toàn stack Cloudflare vs AWS — bao gồm Workers, D1, và Queues — xem Cloudflare vs AWS: chi phí thực tế ở quy mô lớn.

Tương thích S3 API: thay thế trực tiếp cho hầu hết trường hợp

R2 cung cấp HTTP API tương thích S3, nghĩa là AWS SDK v3 chạy được với R2 chỉ cần thay một dòng config.

import { S3Client } from "@aws-sdk/client-s3";

const S3 = new S3Client({
  region: "auto",
  endpoint: `https://<ACCOUNT_ID>.r2.cloudflarestorage.com`,
  credentials: {
    accessKeyId: "<ACCESS_KEY_ID>",
    secretAccessKey: "<SECRET_ACCESS_KEY>",
  },
});

Đó là toàn bộ thay đổi cần thiết cho presigned URLs, multipart uploads, và các thao tác GET/PUT thông thường. Presigned URLs hoạt động y hệt:

import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
import { GetObjectCommand, PutObjectCommand } from "@aws-sdk/client-s3";

const getUrl = await getSignedUrl(
  S3,
  new GetObjectCommand({ Bucket: "my-bucket", Key: "image.png" }),
  { expiresIn: 3600 }
);

const putUrl = await getSignedUrl(
  S3,
  new PutObjectCommand({
    Bucket: "my-bucket",
    Key: "image.png",
    ContentType: "image/png",
  }),
  { expiresIn: 3600 }
);

Tài liệu tương thích R2 S3 API liệt kê đầy đủ các S3 operation được hỗ trợ. Hầu hết thao tác phổ biến đều có: GetObject, PutObject, DeleteObject, CreateMultipartUpload, ListObjectsV2, HeadObject, CopyObject. Những gì thiếu: S3 Select, object tagging, S3 event notifications (không có Lambda triggers), và server-side encryption với customer-managed KMS keys.

Workers binding: lợi thế thực sự của R2

Nếu bạn đang dùng Cloudflare Workers hoặc Pages, native binding của R2 bỏ qua hoàn toàn tầng HTTP. Bạn có truy cập object dưới millisecond từ bên trong hàm, tính phí theo cùng mức per-request mà không có egress, và không cần round-trip đến endpoint ngoài.

// wrangler.toml:
// [[r2_buckets]]
// binding = "MY_BUCKET"
// bucket_name = "my-bucket"

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const key = new URL(request.url).pathname.slice(1);
    const object = await env.MY_BUCKET.get(key);

    if (!object) {
      return new Response("Not found", { status: 404 });
    }

    return new Response(object.body, {
      headers: { "Content-Type": object.httpMetadata?.contentType ?? "application/octet-stream" },
    });
  },
};

Pattern này — Worker làm access layer, R2 làm store — loại bỏ nhu cầu dùng CDN riêng. Không cần cấu hình CloudFront, không cần quản lý signed distribution. Worker vừa là CDN node vừa là auth layer. Liveblocks đã chuyển sang kiến trúc này và công bố case study mô tả chi tiết. Nếu bạn đang cân nhắc giữa Workers và Lambda rộng hơn, Cloudflare Workers vs AWS Lambda phân tích chi tiết các đánh đổi serverless.

Hiệu năng

Benchmark của Cloudflare cho thấy R2 vượt S3 về read latency ở mọi khu vực:

Khu vựcR2 TTLBS3 TTLBLợi thế
Bắc Mỹ1.262 ms2.055 msNhanh hơn 38%
Châu Âu1.303 ms1.729 msNhanh hơn 20%
Châu Á - Thái Bình Dương4.057 ms6.850 msNhanh hơn 40%
Cross-region3.224 ms6.387 msNhanh hơn ~2 lần

Nguồn: blog.cloudflare.com/r2-is-faster-than-s3. Đây là số liệu của chính Cloudflare — xem như đúng về xu hướng, không phải kiểm chứng độc lập.

Về phía write thì có điểm cần lưu ý. Benchmark small-object độc lập của Tigris Data đo PUT throughput của R2 với object 1 KB đạt 138.8 ops/sec, trong khi lựa chọn tốt nhất trong benchmark (Tigris) đạt tới 1.490.2 ops/sec. R2 được tối ưu cho read từ global edge, không phải cho write throughput cao. Nếu bạn đang nhập lượng lớn object nhỏ với tốc độ cao — log pipelines, event streams, upload tần suất cao — hãy test write performance của R2 với kích thước object thực tế của bạn trước khi quyết định.

Một cải tiến đáng chú ý trong năm 2026: R2 Local Uploads (beta, tháng 2 năm 2026) giảm cross-region upload TTLB tới 75% bằng cách route upload đến data center Cloudflare gần nhất trước. Nếu write latency của R2 từng là mối lo trong năm 2025, hãy benchmark lại.

Những tính năng R2 còn thiếu

Những gì S3 có mà R2 chưa có

Event notifications. S3 có thể trigger Lambda functions, SQS queues, và SNS topics khi object được tạo hoặc xóa. R2 không có tương đương. Nếu kiến trúc của bạn phụ thuộc vào S3 event triggers — tạo thumbnail, quét virus, cập nhật index — đây là rào cản cứng không thể vượt qua.

Chuyển tầng lưu trữ tự động. S3 có thể tự động chuyển object sang Infrequent Access, rồi Glacier, rồi Deep Archive theo quy tắc tuổi. R2 có hai tier Standard và Infrequent Access, nhưng không có Glacier và không có chính sách tự động tiering.

Athena, SageMaker, Glue. Các dịch vụ analytics và ML của AWS nói chuyện với S3 natively. Để query dữ liệu R2 từ Athena, bạn phải export sang S3 trước.

Object Lock. S3 Object Lock đã được dùng cho compliance (WORM) nhiều năm. R2 ra mắt Bucket Lock GA vào tháng 3 năm 2025. Tính năng hoạt động ổn, nhưng lịch sử compliance audit chưa có. Nếu team pháp lý của bạn là người đặt yêu cầu, hãy hỏi họ xem “GA từ tháng 3 năm 2025” có đáp ứng timeline của họ không.

Replication đa vùng. S3 hỗ trợ cross-region replication với quy tắc tùy chỉnh. R2 không có tính năng managed replication — global edge của Cloudflare phục vụ R2 reads từ mọi khu vực, nhưng dữ liệu thực tế chỉ nằm ở một vị trí.

Những gì R2 có mà S3 không có

Egress miễn phí. Đã nói một lần rồi. Vẫn đáng nhắc lại. Với các app nặng về nội dung, egress thường là khoản lớn nhất trên hóa đơn cloud.

Workers binding. Truy cập object native, zero-latency từ bên trong Worker function. Lambda không có tương đương mà không cần gọi S3 qua HTTP.

Cấu trúc giá đơn giản hơn. R2 có hai tier (Standard, Infrequent Access) và ba chiều tính phí (storage, Class A ops, Class B ops). S3 có storage tiers, request pricing, egress pricing, phí xóa sớm, phí truy xuất, và một trang pricing đủ dài để cần thanh cuộn riêng.

Migrate từ S3 sang R2

Cloudflare cung cấp Super Slurper, công cụ migration managed copy object từ S3 bucket sang R2 bucket mà không cần data đi qua application của bạn. Tính đến tháng 2 năm 2026, Super Slurper chạy nhanh hơn 5 lần so với lúc mới ra mắt.

Với tầng application, thay đổi duy nhất là config AWS SDK như đã trình bày ở trên. Hầu hết app chỉ cần đổi một biến môi trường là xong.

Những điểm cần kiểm tra trước khi migrate:

  • Bất kỳ Lambda trigger nào trên S3 events cần tìm giải pháp thay thế — R2 không có tương đương
  • Server-side encryption với customer KMS keys không được hỗ trợ trên R2
  • Bucket policies và ACLs khác nhau; R2 dùng model đơn giản hơn

Để có playbook migration đầy đủ — bao gồm Lambda, API Gateway, và database cùng với R2 — xem Cách migrate từ AWS sang Cloudflare năm 2026.

Kết luận

Chọn R2 nếu:

  • Egress là khoản chi đáng kể trong hóa đơn S3 của bạn
  • Bạn đang build trên Cloudflare Workers hoặc Pages
  • Bạn muốn phục vụ assets toàn cầu mà không trả tiền cho CloudFront
  • Dự án dưới 10 TB và nhạy cảm về chi phí

Chọn S3 nếu:

  • Bạn cần Lambda event triggers, Athena, SageMaker, hoặc tích hợp Glue
  • Yêu cầu compliance cần Object Lock với lịch sử audit nhiều năm
  • Bạn lưu cold backup (Glacier Deep Archive rẻ hơn R2 Standard 94%)
  • Workload của bạn liên quan đến write throughput cao với object nhỏ
  • Bạn cần replication đa vùng

Với project mới trong năm 2026 có user-uploaded content hay media serving đáng kể, khuyến nghị mặc định là: bắt đầu với R2. Khả năng tương thích S3 SDK có nghĩa là chuyển về sau chỉ là thay config, không phải viết lại.

Nếu bạn chạy R2 trên Cloudflare Workers, gói Cloudflare Pro hoặc Business bổ sung SLA, bảo vệ DDoS nâng cao, và hỗ trợ ưu tiên — đáng cân nhắc khi app của bạn đã có người dùng trả tiền phụ thuộc vào uptime.

Lưu ý

Benchmark hiệu năng lấy từ bài test của chính Cloudflare. Kiểm chứng độc lập tồn tại cho write throughput small-object (Tigris Data, link bên dưới) nhưng không có cho các con số TTLB. S3 có biến động giá theo khu vực; số liệu trong bài dùng us-east-1 Standard. AWS S3 Express One Zone nhận mức cắt giảm giá tới 85% đầu năm 2025 và có thể cạnh tranh cho workload latency-sensitive single-AZ — bài này không đề cập đến tier đó. Bài có chứa affiliate links đến Cloudflare; xem phần công khai ở đầu bài. AWS không có quan hệ affiliate với toolchew.

Tài liệu tham khảo

  1. Cloudflare R2 Pricing
  2. AWS S3 Pricing
  3. R2 S3 API Compatibility
  4. R2 Workers API Reference
  5. R2 Presigned URLs
  6. Cloudflare Blog — R2 is faster than S3
  7. Super Slurper — R2 Data Migration
  8. Super Slurper nhanh hơn 5 lần (changelog tháng 2 năm 2026)
  9. S3 Express One Zone giảm giá
  10. Liveblocks case study — Cloudflare R2
  11. Tigris Data — small object benchmark
  12. R2 changelog