Kurangi Biaya GCS Egress: Migrasi ke Cloudflare R2

Foto oleh Unsplash

Foto oleh Unsplash
Biaya egress Google Cloud Storage adalah pembunuh anggaran yang senyap. Setiap gigabyte data yang dibaca aplikasi Anda dari GCS dan dikirimkan ke pengguna dikenakan biaya — $0,11/GB untuk 10 TB pertama per bulan. Pada skala besar, ini menjadi salah satu line item terbesar dalam tagihan cloud Anda. Cloudflare R2 menyelesaikan masalah ini sepenuhnya: zero egress fee, API yang kompatibel dengan S3, dan distribusi global melalui jaringan Cloudflare. Panduan ini membahas perbandingan biaya nyata, tooling migrasi, dan perubahan kode aplikasi yang diperlukan untuk beralih.
Harga penyimpanan cloud terlihat sederhana di permukaan — GCS Standard storage adalah $0,020/GB/bulan. Namun biaya egress terasa menyakitkan: $0,11/GB untuk 10 TB pertama yang keluar ke internet, $0,08/GB untuk 40 TB berikutnya. Platform media yang menyimpan 5 TB dan menyajikan 1 TB video per bulan membayar $20 untuk storage dan $110 untuk egress — multiplier 5,5x. Cloudflare R2 mengenakan $0,015/GB untuk storage dan benar-benar $0 untuk egress, menjadikan ekonominya sangat menarik untuk beban kerja yang banyak membaca.
Angka-angkanya berbicara jelas saat dibandingkan langsung. Pada 100 GB egress per bulan, GCS menghabiskan $31/bulan versus R2 di $15/bulan — penghematan 52%. Pada 1 TB egress, GCS menghabiskan $131/bulan versus R2 di $15/bulan — penghematan 89%. Semakin tinggi volume egress, semakin dramatis penghematannya. Titik impas di mana perbedaan harga storage R2 (lebih mahal $0,005/GB) diimbangi oleh penghematan egress adalah sekitar 3 GB egress per 1 GB yang disimpan.
# Cost comparison — 1 TB data stored, 100 GB downloaded per month
# Google Cloud Storage (Standard)
Storage: 1,000 GB × $0.020/GB = $20.00/month
Egress: 100 GB × $0.110/GB = $11.00/month ← the sting
Total: $31.00/month
# Cloudflare R2
Storage: 1,000 GB × $0.015/GB = $15.00/month
Egress: 100 GB × $0.000/GB = $0.00/month ← zero egress
Total: $15.00/month
# Annual savings: ($31 - $15) × 12 = $192/year (at 100 GB egress)
# At 1 TB egress/month: GCS costs $110/month in egress alone vs $0 on R2rclone adalah tool standar industri untuk migrasi penyimpanan cloud. Tool ini memahami lusinan backend storage termasuk GCS dan Cloudflare R2 (melalui API yang kompatibel dengan S3), dapat menyinkronkan secara paralel dengan beberapa thread transfer, dan mendukung mode dry-run untuk pengujian yang aman. Migrasi adalah proses dua langkah: pertama sinkronkan semua data dari GCS ke R2, kemudian perbarui konfigurasi aplikasi Anda untuk menunjuk ke R2, lalu jalankan sinkronisasi akhir untuk menangkap objek apa pun yang ditulis selama jendela cutover.
Konfigurasikan rclone dengan remote GCS (menggunakan JSON service account Anda) dan remote R2 (menggunakan API token R2 dari dashboard Cloudflare). Selalu jalankan dengan --dry-run terlebih dahulu untuk memverifikasi jumlah objek dan total ukuran sesuai ekspektasi Anda. Flag --transfers 32 meparalelkan upload di 32 thread bersamaan — sesuaikan berdasarkan bandwidth jaringan Anda. Migrasi besar (>100 GB) sebaiknya dijalankan dari VM di region yang sama dengan bucket GCS Anda untuk meminimalkan biaya transfer selama migrasi.
#!/usr/bin/env bash
# migrate-gcs-to-r2.sh — Migrate a GCS bucket to Cloudflare R2
# Prerequisites: gsutil, rclone configured with r2 remote
GCS_BUCKET="gs://my-gcs-bucket"
R2_REMOTE="r2"
R2_BUCKET="my-r2-bucket"
# Step 1: Create R2 bucket via Wrangler
wrangler r2 bucket create "$R2_BUCKET"
# Step 2: Configure rclone R2 remote (~/.config/rclone/rclone.conf)
# [r2]
# type = s3
# provider = Cloudflare
# access_key_id = <R2_ACCESS_KEY>
# secret_access_key = <R2_SECRET_KEY>
# endpoint = https://<account_id>.r2.cloudflarestorage.com
# Step 3: Sync GCS → R2 (dry run first)
rclone sync "$GCS_BUCKET" "$R2_REMOTE:$R2_BUCKET" --transfers 32 --checkers 16 --dry-run --progress --log-file migration.log
# Remove --dry-run to perform actual migration
echo "Migration complete. Verify with:"
echo "rclone ls $R2_REMOTE:$R2_BUCKET | wc -l"Selama migrasi, aktifkan GCS Object Change Notifications atau Pub/Sub untuk menangkap objek baru apa pun yang ditulis selama jendela migrasi. Tuliskan ke GCS dan R2 secara bersamaan (pola dual-write) untuk memastikan zero data loss selama cutover. Hapus GCS hanya setelah memverifikasi R2 memiliki semua objek melalui rclone check --size-only.
Karena R2 kompatibel dengan S3, memigrasikan kode aplikasi sering hanya mengubah URL endpoint dan kredensial. Jika Anda menggunakan AWS SDK (@aws-sdk/client-s3), Anda hanya perlu memperbarui konstruktor S3Client — semua pemanggilan GetObject, PutObject, DeleteObject, dan ListObjects tetap identik. Jika Anda menggunakan client library GCS secara langsung, Anda perlu beralih ke AWS SDK atau menggunakan library yang kompatibel dengan S3 seperti MinIO client.
AWS SDK untuk JavaScript, Python, Go, dan bahasa lainnya semuanya mendukung endpoint kustom — cukup arahkan ke endpoint R2 Anda (https://{account_id}.r2.cloudflarestorage.com) dengan kredensial API token R2. Region harus diset ke 'auto' karena R2 secara otomatis merutekan ke datacenter Cloudflare terdekat. Untuk aset publik, aktifkan fitur public bucket R2 untuk menyajikan file langsung dari domain kustom melalui CDN Cloudflare dengan zero egress cost.
// app-migration.ts — Update S3-compatible SDK endpoint to R2
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"
// Before (GCS with S3 interoperability)
const gcsClient = new S3Client({
region: "auto",
endpoint: "https://storage.googleapis.com",
credentials: { accessKeyId: GCS_KEY, secretAccessKey: GCS_SECRET },
})
// After (Cloudflare R2 — drop-in replacement)
const r2Client = new S3Client({
region: "auto",
endpoint: `https://${ACCOUNT_ID}.r2.cloudflarestorage.com`,
credentials: { accessKeyId: R2_ACCESS_KEY, secretAccessKey: R2_SECRET_KEY },
})
// Usage is identical — just swap the client
const object = await r2Client.send(
new GetObjectCommand({ Bucket: "my-r2-bucket", Key: "my-file.jpg" })
)Cloudflare R2 kompatibel dengan S3, bukan GCS. Fitur yang spesifik untuk GCS — seperti Object Lifecycle Management, Uniform Bucket-Level Access, dan IAM Conditions — perlu direplikasi menggunakan ekuivalen R2 atau Cloudflare Workers. Audit konfigurasi GCS Anda sebelum migrasi untuk memastikan semua fitur yang Anda andalkan memiliki ekuivalen R2.
Memahami konsep kunci di balik object storage membantu Anda memaksimalkan manfaat dari migrasi: egress fees, Cloudflare R2, rclone, S3-compatible API, and R2 Public Bucket.
Setelah migrasi ke R2, jelajahi fitur-fitur ini untuk lebih mengurangi biaya dan meningkatkan performa: R2 Event Notifications memicu Cloudflare Workers saat objek berubah — berguna untuk pipeline pemrosesan gambar. R2 Object Lifecycle secara otomatis mengakhiri masa berlaku atau mentransisi objek untuk mengurangi biaya storage. Cache API Cloudflare dapat menyimpan objek R2 di edge untuk konten yang paling sering diakses, bahkan mengurangi jumlah operasi R2. Dikombinasikan dengan Workers untuk pengubahan ukuran gambar on-the-fly, R2 dapat menggantikan CDN + object storage + stack pemrosesan gambar dengan biaya yang jauh lebih rendah.
Sumber & Bacaan Lanjutan