Cloudflare R2 - Object Storage Không Phí Egress cho Developer

Posted on: 4/26/2026 4:14:26 AM

Cloudflare R2 Object Storage AWS S3 Edge Computing Workers

1. Cloudflare R2 là gì và tại sao developer nên quan tâm?

Cloudflare R2 là dịch vụ object storage được thiết kế với triết lý đơn giản nhưng mạnh mẽ: zero egress fees — bạn không phải trả tiền khi tải dữ liệu ra. Nghe có vẻ bình thường, nhưng đây chính là điểm khác biệt lớn nhất so với AWS S3, Azure Blob Storage hay Google Cloud Storage, nơi phí egress có thể chiếm 50-80% tổng hóa đơn storage của bạn.

Hãy tưởng tượng bạn đang vận hành một CDN phục vụ 10TB dữ liệu mỗi tháng. Với AWS S3, riêng phí egress đã là $920/tháng. Với R2? $0. Đó không phải tiết kiệm nhỏ — đó là thay đổi cơ bản cách bạn thiết kế kiến trúc hệ thống.

$0Phí Egress — mãi mãi miễn phí
10 GBFree tier storage/tháng
S3-CompatibleTương thích 100% S3 API
330+Edge locations toàn cầu

Tại sao tên là R2?

Cloudflare đặt tên R2 như một cách chơi chữ — "R2" đến sau "S3" (R đứng trước S, 2 đứng trước 3). Đây là tuyên bố rõ ràng: R2 được thiết kế để thay thế S3 trong những workload mà phí egress đang là pain point lớn nhất.

2. Kiến trúc kỹ thuật của R2

R2 không đơn giản là "S3 clone rẻ hơn". Kiến trúc của nó tận dụng mạng lưới edge network khổng lồ của Cloudflare — hơn 330 data centers trên toàn cầu — để mang lại trải nghiệm hoàn toàn khác biệt.

graph TD
    A["Client Request"] --> B["Cloudflare Edge Network
330+ PoPs"] B --> C["R2 Storage Layer"] B --> D["Workers Runtime"] D -->|"Binding"| C C --> E["Standard Storage
$0.015/GB"] C --> F["Infrequent Access
$0.01/GB"] D --> G["Event Notifications"] G --> H["Queues Consumer"] style A fill:#e94560,stroke:#fff,color:#fff style B fill:#0f3460,stroke:#fff,color:#fff style C fill:#4CAF50,stroke:#fff,color:#fff style D fill:#ff9800,stroke:#fff,color:#fff

Hình 1: Kiến trúc Cloudflare R2 — tích hợp sâu với Edge Network và Workers Runtime

2.1. S3 API Compatibility

R2 tương thích S3 API, nghĩa là hầu hết công cụ và SDK hiện tại của bạn hoạt động ngay mà không cần sửa code. AWS CLI, Boto3, MinIO Client, rclone — tất cả đều hoạt động với R2 chỉ bằng cách đổi endpoint.

# Cấu hình AWS CLI cho R2
aws configure set default.s3.endpoint_url https://<ACCOUNT_ID>.r2.cloudflarestorage.com

# Upload file — cú pháp y hệt S3
aws s3 cp ./backup.tar.gz s3://my-bucket/backups/

# List objects
aws s3 ls s3://my-bucket/

2.2. Hai tầng Storage

R2 cung cấp hai storage class phù hợp với các mẫu truy cập khác nhau:

Đặc điểmStandardInfrequent Access
Storage cost$0.015/GB/tháng$0.01/GB/tháng
Class A (write)$4.50/triệu requests$9.00/triệu requests
Class B (read)$0.36/triệu requests$0.90/triệu requests
Data retrievalMiễn phí$0.01/GB
EgressMiễn phíMiễn phí
Min storage durationKhông có30 ngày
Use caseHot data, CDN originLogs, backups, archives

Lifecycle Policy tự động

Bạn có thể cấu hình lifecycle rules để tự động chuyển objects từ Standard sang Infrequent Access sau một khoảng thời gian nhất định. Ví dụ: logs cũ hơn 30 ngày tự động chuyển sang IA để tiết kiệm 33% chi phí storage.

3. So sánh chi phí: R2 vs S3 vs Azure Blob vs GCS

Đây là phần khiến nhiều đội ngũ bất ngờ nhất. Hãy xem chi phí thực tế cho một workload phổ biến: 1TB storage + 5TB egress/tháng.

Nhà cung cấpStorageEgress (5TB)Operations (est.)Tổng/tháng
Cloudflare R2$15$0~$5~$20
AWS S3$23$460~$5~$488
Azure Blob$18$435~$5~$458
Google Cloud Storage$20$600~$5~$625
graph LR
    subgraph "Chi phí hàng tháng - 1TB + 5TB egress"
    A["R2: ~$20"] --- B["S3: ~$488"]
    B --- C["Azure: ~$458"]
    C --- D["GCS: ~$625"]
    end
    style A fill:#4CAF50,stroke:#fff,color:#fff
    style B fill:#ff9800,stroke:#fff,color:#fff
    style C fill:#ff9800,stroke:#fff,color:#fff
    style D fill:#e94560,stroke:#fff,color:#fff

Hình 2: So sánh chi phí — R2 rẻ hơn 20-30 lần so với Big 3 nhờ zero egress

Khi nào R2 KHÔNG phải là lựa chọn tốt nhất?

R2 hiện chưa hỗ trợ object versioning, object lock, hay WORM compliance. Nếu bạn cần immutable backups cho regulatory compliance (HIPAA, SEC 17a-4), S3 vẫn là lựa chọn bắt buộc. R2 cũng chưa có tương đương S3 Glacier cho cold archival dưới $0.004/GB.

4. R2 + Workers: Sức mạnh của Edge Computing

Điểm khác biệt lớn nhất của R2 so với các dịch vụ object storage khác: tích hợp native với Cloudflare Workers. Bạn có thể xử lý, biến đổi, và phục vụ objects trực tiếp tại edge — không cần server riêng, không cần Lambda@Edge.

4.1. Cấu hình Wrangler

# wrangler.toml
name = "r2-image-service"
main = "src/index.ts"
compatibility_date = "2026-04-01"

[[r2_buckets]]
binding = "MEDIA_BUCKET"
bucket_name = "media-production"
preview_bucket_name = "media-preview"

4.2. Worker xử lý upload và serve

interface Env {
  MEDIA_BUCKET: R2Bucket;
}

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

    switch (request.method) {
      case "PUT": {
        const object = await env.MEDIA_BUCKET.put(key, request.body, {
          httpMetadata: {
            contentType: request.headers.get("content-type") || "application/octet-stream",
          },
          customMetadata: {
            uploadedBy: request.headers.get("x-user-id") || "anonymous",
            uploadedAt: new Date().toISOString(),
          },
        });
        return new Response(JSON.stringify({
          key: object.key,
          size: object.size,
          etag: object.etag,
        }), { status: 201 });
      }

      case "GET": {
        const object = await env.MEDIA_BUCKET.get(key);
        if (!object) return new Response("Not Found", { status: 404 });

        const headers = new Headers();
        object.writeHttpMetadata(headers);
        headers.set("etag", object.httpEtag);
        headers.set("cache-control", "public, max-age=31536000, immutable");

        return new Response(object.body, { headers });
      }

      case "DELETE": {
        await env.MEDIA_BUCKET.delete(key);
        return new Response(null, { status: 204 });
      }

      default:
        return new Response("Method Not Allowed", { status: 405 });
    }
  },
};

Cache mọi thứ tại Edge

Khi serve objects qua Workers, bạn có thể tận dụng Cache API của Cloudflare để cache objects tại 330+ edge locations. Kết hợp với R2 zero egress, đây là giải pháp CDN có chi phí thấp nhất hiện nay.

5. Event Notifications — Xây dựng Data Pipeline tự động

R2 Event Notifications cho phép bạn trigger Workers tự động khi có thay đổi trong bucket — tương tự S3 Event Notifications nhưng tích hợp native với Cloudflare Queues.

sequenceDiagram
    participant U as User
    participant W as Upload Worker
    participant R2 as R2 Bucket
    participant Q as Cloudflare Queue
    participant P as Processing Worker
    U->>W: Upload image
    W->>R2: PUT object
    R2->>Q: Event notification
    Q->>P: Consume message
    P->>R2: GET original
    Note over P: Resize, optimize, generate thumbnails
    P->>R2: PUT processed versions

Hình 3: Event-driven pipeline — tự động xử lý ảnh khi upload lên R2

5.1. Cấu hình Event Notifications

# wrangler.toml
[[r2_buckets]]
binding = "MEDIA_BUCKET"
bucket_name = "media-production"

[[queues.consumers]]
queue = "r2-events"
max_batch_size = 10
max_batch_timeout = 30
interface Env {
  MEDIA_BUCKET: R2Bucket;
}

export default {
  async queue(batch: MessageBatch<R2EventNotification>, env: Env) {
    for (const message of batch.messages) {
      const event = message.body;

      if (event.action === "PutObject" && event.object.key.startsWith("uploads/")) {
        const original = await env.MEDIA_BUCKET.get(event.object.key);
        if (!original) continue;

        const thumbnailKey = event.object.key.replace("uploads/", "thumbnails/");
        console.log(`Processed: ${event.object.key} -> ${thumbnailKey}`);
      }

      message.ack();
    }
  },
};

6. Migration từ S3 sang R2

Cloudflare cung cấp hai công cụ migration miễn phí:

6.1. Super Slurper — Bulk Migration

Super Slurper copy toàn bộ objects từ S3 (hoặc GCS) sang R2. Phù hợp cho migration một lần hoặc scheduled sync.

graph LR
    A["AWS S3 Bucket"] -->|"Super Slurper"| B["Cloudflare R2"]
    C["Google Cloud Storage"] -->|"Super Slurper"| B
    D["S3-Compatible"] -->|"Super Slurper"| B
    style B fill:#4CAF50,stroke:#fff,color:#fff
    style A fill:#ff9800,stroke:#fff,color:#fff

Hình 4: Super Slurper hỗ trợ migration từ nhiều nguồn khác nhau

6.2. Sippy — Incremental Migration

Sippy là giải pháp thông minh hơn: nó hoạt động như một proxy layer. Khi client request một object:

  1. R2 kiểm tra object có trong bucket không
  2. Nếu có → serve từ R2
  3. Nếu không → fetch từ S3 source, lưu vào R2, rồi serve

Kết quả: bạn migrate dần dần không downtime, objects được copy on-demand khi có traffic thực tế. Sau một thời gian, phần lớn hot data đã nằm trên R2.

Chi phí migration = $0

Cả Super Slurper và Sippy đều miễn phí — bạn chỉ trả phí operations (PUT) khi objects được ghi vào R2. Không có phí transfer riêng cho migration tools.

7. Các Use Case thực tế cho R2

7.1. CDN Origin cho Static Assets

Dùng R2 làm origin server cho website assets (images, CSS, JS). Kết hợp với Cloudflare CDN cache, bạn có giải pháp zero-cost egress hoàn chỉnh.

7.2. Backup và Log Storage

Database backups, application logs, audit trails — dùng Infrequent Access tier chỉ $0.01/GB. Rẻ hơn 56% so với S3 Standard.

7.3. AI/ML Dataset Storage

Training datasets thường rất lớn và cần được tải xuống nhiều lần. Zero egress biến R2 thành lựa chọn lý tưởng cho AI teams với budget hạn chế.

7.4. Multi-region Content Delivery

R2 + Workers cho phép serve content với custom logic tại edge: A/B testing, personalization, geo-routing — tất cả không cần origin server truyền thống.

7.5. Presigned URLs cho Secure Uploads

async function generatePresignedUrl(env: Env, key: string): Promise<string> {
  const s3Client = new S3Client({
    region: "auto",
    endpoint: `https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com`,
    credentials: {
      accessKeyId: env.R2_ACCESS_KEY,
      secretAccessKey: env.R2_SECRET_KEY,
    },
  });

  const command = new PutObjectCommand({
    Bucket: env.BUCKET_NAME,
    Key: key,
    ContentType: "image/jpeg",
  });

  return await getSignedUrl(s3Client, command, { expiresIn: 3600 });
}

8. Public Buckets và Custom Domains

R2 hỗ trợ public bucket access — biến bucket thành một static file server có thể truy cập trực tiếp qua URL. Kết hợp với custom domain, bạn có một CDN origin hoàn chỉnh.

# Cấu hình public access qua Wrangler
npx wrangler r2 bucket update my-bucket --public

# Truy cập objects qua public URL
# https://pub-{hash}.r2.dev/{object-key}

# Hoặc map custom domain qua Cloudflare Dashboard
# https://assets.yourdomain.com/{object-key}

Bảo mật Public Buckets

Public bucket có nghĩa là ai cũng có thể đọc toàn bộ objects. Chỉ dùng cho static assets thực sự public. Với dữ liệu nhạy cảm, sử dụng presigned URLs hoặc Workers authentication để kiểm soát truy cập.

9. CORS, Multipart Upload và các tính năng nâng cao

9.1. CORS Configuration

[
  {
    "AllowedOrigins": ["https://yourdomain.com"],
    "AllowedMethods": ["GET", "PUT", "POST", "DELETE"],
    "AllowedHeaders": ["*"],
    "MaxAgeSeconds": 3600
  }
]

9.2. Multipart Upload cho files lớn

R2 hỗ trợ multipart upload cho files lớn — chia file thành nhiều parts và upload song song. Tương thích S3 multipart API, hỗ trợ files lên đến 5TB.

9.3. R2 Data Catalog (Beta)

Tính năng mới cho phép query metadata của objects mà không cần list toàn bộ bucket. Hữu ích cho analytics và data management trên buckets lớn.

10. Best Practices khi sử dụng R2

10 nguyên tắc vàng

1. Dùng Workers binding thay vì S3 API khi có thể — nhanh hơn và không tốn operations cost.
2. Cache tại edge — kết hợp Cache API để giảm reads từ R2.
3. Lifecycle rules — tự động chuyển data cũ sang Infrequent Access.
4. Event Notifications — event-driven thay vì polling.
5. Presigned URLs — upload trực tiếp từ client, giảm tải server.
6. Multipart upload — cho files > 100MB.
7. Bucket-scoped tokens — least privilege cho mỗi service.
8. Location hints — chỉ định region gần users nhất khi tạo bucket.
9. Sippy migration — migrate từ S3 không downtime.
10. Monitor với R2 analytics — theo dõi usage patterns.

11. Khi nào nên chọn R2?

ScenarioKhuyến nghịLý do
CDN origin, static assetsR2Zero egress = tiết kiệm lớn nhất
AI/ML datasetsR2Datasets lớn, download nhiều lần
Log/backup storageR2 (IA tier)$0.01/GB, rẻ nhất thị trường
Compliance/immutable backupsS3R2 chưa có Object Lock/WORM
Deep archive (<$0.004/GB)S3 GlacierR2 chưa có tầng tương đương
Tight AWS ecosystemS3Lambda, Athena, Redshift integration
Edge processing + storageR2 + WorkersNative integration, không cần Lambda@Edge
Startup/side projectR2Free tier 10GB + zero egress

12. Kết luận

Cloudflare R2 không phải là "S3 killer" trong mọi trường hợp — nhưng nó là lựa chọn tốt nhất cho phần lớn workloads phổ biến. Zero egress không chỉ tiết kiệm chi phí mà còn giải phóng bạn khỏi "vendor lock-in qua hóa đơn" — hiện tượng khi chi phí egress quá cao khiến việc migrate data ra khỏi cloud trở nên không khả thi về tài chính.

Kết hợp với Workers, Event Notifications, và Queues, R2 trở thành nền tảng object storage + edge compute hoàn chỉnh. Đặc biệt với free tier 10GB và zero egress, đây là lựa chọn không thể bỏ qua cho startups, side projects, và bất kỳ ai đang tìm cách tối ưu chi phí cloud.

Những điểm then chốt cần nhớ:

  • Zero egress — tiết kiệm 20-30x so với Big 3 cho read-heavy workloads
  • S3 API compatible — migrate dễ dàng, không cần đổi SDK/tools
  • Workers + R2 — edge compute + storage native, không cần extra services
  • Event Notifications — event-driven pipelines hoàn toàn serverless
  • Sippy migration — chuyển từ S3 không downtime, zero cost

Nguồn tham khảo:
Cloudflare R2 Documentation | R2 Pricing | R2 Event Notifications & Infrequent Access Announcement | R2 Event Notifications Docs | Workers R2 API Reference