Cloudflare R2
Cloudflare R2 は、エグレス料金が無料の S3 互換オブジェクトストレージである。Cloudflare のグローバルネットワーク上で動作し、配信コストを劇的に圧縮しながら既存の S3 エコシステムをそのまま利用できる。
R2
一行サマリ
Cloudflare R2 は、エグレス料金が無料の S3 互換オブジェクトストレージである。Cloudflare のグローバルネットワーク上で動作し、配信コストを劇的に圧縮しながら既存の S3 エコシステムをそのまま利用できる。
解決する課題(Why)
クラウドオブジェクトストレージの本質的なコスト構造は「保管」よりも「外向き転送(egress)」にある。S3 / GCS / Azure Blob はいずれも、インターネットへのデータ転送に対して GB あたり数セント〜十数セントの egress 料金を課金する。動画配信・画像配信・データレイクからの分析クエリ・ML モデル配布など、読み出し量が多いワークロードでは、ストレージ単価より egress が支配的なコスト要因になる。
R2 はこの egress 料金を完全に廃止する。ストレージとオペレーションのみで課金され、インターネットへの転送は無料である。これは「同一クラウド内でしかコスト最適化できない」というベンダーロックインを解く設計上の意思表明であり、Bandwidth Alliance の延長線上にある。
加えて、R2 は S3 API 互換であるため、aws-sdk・boto3・rclone などの既存資産をエンドポイント差し替えだけで流用できる。「移行コストを払わずに egress 料金から逃げる」ことが R2 の中核的な提供価値である。
主要機能(What)
- S3 互換 API(
https://<ACCOUNT_ID>.r2.cloudflarestorage.com) - ストレージクラス2種:Standard / Infrequent Access
- Workers バインディング経由のゼロレイテンシアクセス(同一エッジで動作する Workers から直接読み書き)
- パブリックバケット(カスタムドメイン接続で CDN 配信、
r2.devはテスト用) - Location Hints(バケット作成時に主要アクセス地域を指示)
- バケットスコープトークン(細粒度の認可)
- Lifecycle ルール、CORS、サーバサイド暗号化
- マルチパートアップロード(最大 4.995 TiB)
- イベント通知、Super Slurper / Sippy による S3 等からのデータ移行
- R2 Data Catalog(Iceberg ベースのテーブルカタログ、public beta)
アーキテクト視点:いつ選ぶか
適しているシーン
- 配信主体のワークロード:動画・画像・大容量アセット配信、ゲームのパッチ配信、ML モデルの公開ホスティング。読み出しが書き込みを大きく上回るほど R2 の優位が拡大する。
- Cloudflare Workers / Pages との組み合わせ:エッジ実行と同一プレーン上にあり、Workers バインディング経由なら認証・ネットワーキング設定が不要。
- マルチクラウド分析基盤:データレイク本体を R2 に置き、Snowflake・Databricks・BigQuery など複数の分析エンジンから読み出す構成で、egress が常に無料となるためベンダーロックインを回避できる。
- バックアップ・アーカイブ:Infrequent Access クラスで $0.01/GB-month、復元時も egress 無料。
- AWS からの脱出:S3 互換 API のため、エンドポイントとシグネチャ設定の差し替えで移行可能。Sippy で段階的にコピーできる。
適していないシーン
- AWS 内部完結のワークロード:データの読み出し先がすべて同一リージョンの EC2 / Lambda 等で、egress が発生しない構成。S3 のままで十分。
- 超低レイテンシの強整合トランザクション:S3 Express One Zone のような単一 AZ 専用低レイテンシは提供されない。
- 高頻度書き込み・書き込み主体ワークロード:Class A オペレーション(書き込み系)が支配的だと、R2 の単価面の優位が薄れる。1秒間に同一キーへの書き込みは 1 回まで、というスロットリングもある。
- AWS 固有機能依存:Object Lambda、Inventory、S3 Select、Replication(Cross-Region Replication)など S3 独自機能を前提にした設計。R2 は API 互換だが機能差分がある。
S3 / GCS / Azure Blob との比較(必須セクション・表形式)
| 観点 | R2 | S3 | GCS | Azure Blob |
|---|---|---|---|---|
| エグレス | 無料 | $0.05〜0.09/GB(上限あり) | $0.08〜0.12/GB | $0.05〜0.087/GB |
| 互換 API | S3 互換 | 標準 | S3 互換あり(XML API) | 独自 REST(S3 互換は別ゲートウェイ) |
| ストレージ単価(Standard) | $0.015/GB-month | $0.023/GB-month | $0.020/GB-month | $0.018/GB-month |
| 低頻度クラス | Infrequent Access $0.01/GB-month | S3 IA / Glacier 系 | Nearline / Coldline / Archive | Cool / Cold / Archive |
| 書き込み(Class A)単価 | $4.50/M req | $5.00/M req | $5.00/M req | 同等水準 |
| 読み込み(Class B)単価 | $0.36/M req | $0.40/M req | $0.40/M req | 同等水準 |
| 整合性 | 強整合(read-after-write) | 強整合 | 強整合 | 強整合 |
| レプリケーション | 自動マルチサイト保管、Location Hints で地域指定 | リージョン選択+CRR/SRR 構成 | マルチリージョン / デュアルリージョン | GRS / RA-GRS |
| 性能特性 | エッジネットワーク前提、CDN 接続が前提設計 | リージョン内 EC2 と組むと最高性能 | リージョン内 GCE/BigQuery と最適 | リージョン内 Azure サービスと最適 |
| Free Tier | 10 GB-month + 1M Class A + 10M Class B(毎月) | 5 GB(12ヶ月限定) | 5 GB(米国限定リージョン) | 5 GB(12ヶ月限定) |
| ロックイン度 | 低(egress 無料で他クラウドへも自由) | 高(egress が事実上の足かせ) | 中 | 中 |
料金モデルの要点
R2 の課金は3軸のみ。
- ストレージ:Standard $0.015/GB-month、Infrequent Access $0.01/GB-month。GB-month は 1 日あたりピーク量を 30 日平均する。
- Class A オペレーション(状態を変える系):$4.50 / 100万リクエスト(Standard)。
PutObject、CopyObject、ListObjects、CreateMultipartUpload、UploadPart、PutBucketCorsなど。 - Class B オペレーション(読み出し系):$0.36 / 100万リクエスト(Standard)。
GetObject、HeadObject、HeadBucketなど。 - Free オペレーション:
DeleteObject、DeleteBucket、AbortMultipartUploadは無料。 - データ取得料:Standard はゼロ。Infrequent Access のみ $0.01/GB の retrieval fee が発生し、最低保管期間は 30 日。
- Egress:常時ゼロ。S3 API・Workers API・
r2.dev・カスタムドメイン経由いずれも無料。
Forever Free 枠(毎月リセット、Standard のみ):
- ストレージ 10 GB-month
- Class A 100 万リクエスト
- Class B 1,000 万リクエスト
- Egress 無制限
請求は切り上げ(1,000,001 オペレーション → 200 万請求、1.1 GB-month → 2 GB-month)。401 で蹴られた未認証リクエストは課金されない。
CLI / IaC 操作例
Wrangler でバケット操作
# バケット作成(Location Hint 付き)
npx wrangler r2 bucket create my-assets --location apac
# オブジェクトのアップロード
npx wrangler r2 object put my-assets/path/image.png --file ./image.png
# 取得
npx wrangler r2 object get my-assets/path/image.png --file ./out.png
# Lifecycle 設定(JSON ファイル指定)
npx wrangler r2 bucket lifecycle set my-assets --file lifecycle.json
Workers バインディング(wrangler.toml)
[[r2_buckets]]
binding = "ASSETS"
bucket_name = "my-assets"
export default {
async fetch(req: Request, env: { ASSETS: R2Bucket }): Promise<Response> {
const obj = await env.ASSETS.get("path/image.png");
if (!obj) return new Response("Not Found", { status: 404 });
return new Response(obj.body, { headers: { "content-type": "image/png" } });
},
};
S3 SDK(aws-sdk v3)からのアクセス
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
const s3 = new S3Client({
region: "auto",
endpoint: `https://${ACCOUNT_ID}.r2.cloudflarestorage.com`,
credentials: {
accessKeyId: process.env.R2_ACCESS_KEY_ID!,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
},
});
await s3.send(new PutObjectCommand({
Bucket: "my-assets",
Key: "path/image.png",
Body: fileBuffer,
ContentType: "image/png",
}));
Terraform
resource "cloudflare_r2_bucket" "assets" {
account_id = var.cf_account_id
name = "my-assets"
location = "APAC"
}
制限・注意点
- オブジェクトサイズ上限:1 オブジェクトあたり 4.995 TiB。
- 単一 PUT のアップロード上限:4.995 GiB。それ以上はマルチパート(最大 10,000 パート)。
- 同一キーへの並行書き込みは 1 秒あたり 1 回まで。超えると HTTP 429。
- アカウントあたりバケット数上限:1,000,000。
- バケット管理操作(作成・削除・設定)は 50 req/s。
- オブジェクトキー長 1,024 バイト、メタデータ 8,192 バイト。
- リージョンは
auto固定(互換のためus-east-1と空文字も受理)。 r2.devはテスト用で本番利用不可。スループット・レート両方が変動的にスロットルされる。本番は必ずカスタムドメインを接続する。- S3 API 互換だが未実装機能あり:Object Lock、S3 Select、Inventory、Replication 等は提供されない。マイグレーション前に依存 API を要確認。
- Infrequent Access は最低 30 日課金、retrieval fee あり。短期間で消えるオブジェクトを誤って IA に置くと割高になる。
ユースケース具体例
- 動画・画像配信:R2 + Cloudflare CDN で egress 無料配信。
assets.example.comをカスタムドメインで紐付け、Cache Rules でキャッシュ TTL を制御する。 - データレイク:Parquet / Iceberg を R2 に保管し、R2 Data Catalog 経由で Snowflake・DuckDB・Spark から読み出す。複数分析エンジンを跨いでも egress 課金が発生しない。
- バックアップ・アーカイブ:データベースの日次スナップショット、ログ、長期保管対象を IA クラスに格納。restore 時の転送も無料。
- ML モデル・データセット配布:Hugging Face 的なモデル配布や大規模データセット公開で、ダウンロード課金が発生しない。
- ポッドキャスト・大容量メディア配信:従来 S3 + CloudFront で発生していた数百ドル〜数千ドル規模の egress を実質ゼロに。
- 静的サイト・SPA のアセットホスティング:Cloudflare Pages / Workers と組み合わせ、世界中に低レイテンシ配信。
- AWS 脱出の中継点:Sippy で読み出し時に段階移行、移行完了後は S3 を停止。
参考リンク
- Cloudflare R2 Overview
- R2 Pricing
- R2 Limits
- S3 API compatibility
- R2 Pricing Calculator
- Workers R2 Binding API
参照日: 2026-05-03