R2
概要
R2 は Cloudflare のオブジェクトストレージ — ファイルを置く場所です。画像、動画、バックアップ、ユーザーのアップロード、ビルド成果物など。Amazon S3 と同じ API を話すため、ほとんどの S3 ツールや SDK はそのまま動作します。最大の違いは料金です。R2 はストレージと操作に対して課金しますが、egress 料金がかかりません。つまりデータを外部に配信するのは無料です。
強み
- egress 料金ゼロ — メディアやダウンロードの多いアプリにとって大きな節約。
- S3 互換 API なので、既存のツールやライブラリがそのまま動きます。
- Worker に直接バインドして、コードに認証情報を入れずに読み書きできます。
- Cloudflare の CDN の背後に置いて、高速でキャッシュされた配信が可能です。
- プロビジョニングなしで大きなオブジェクトや大きなバケットにスケールします。
トレードオフ
- オブジェクトストレージであり、ファイルシステムやデータベースではありません — ファイル内部のクエリはできません。
- 操作(PUT/GET/LIST)は課金対象なので、おしゃべりなアクセスパターンは積み重なります。
- 強い一貫性や機能は S3 と細部で異なります。エッジケースを確認しましょう。
- 小さく、頻繁に変更される値には、KV や D1 のほうが適しています。
使うべきとき
ユーザーのアップロード、生成されたファイル、大きな静的アセット、データのエクスポート、バックアップに R2 を使いましょう — 特に S3 での帯域幅コストが痛手になるところならどこでも。
バイブコーディングとの相性
R2 は AI 主導のビルドと相性が良いです。バインディングが通常の認証情報のやり取りを取り除いてくれるからです — エージェントは env.BUCKET に直接書き込みます。ファイルが公開(Worker やカスタムドメイン経由で配信)か非公開(署名付きアクセス)かをエージェントに伝え、配信を正しく配線させましょう。次の例はバケットをバインドし、CLI からファイルをアップロードします。
# wrangler.toml
[[r2_buckets]]
binding = "BUCKET"
bucket_name = "uploads"
npx wrangler r2 bucket create uploads
npx wrangler r2 object put uploads/logo.png --file ./logo.png