Web開発 2026年5月10日

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 との比較(必須セクション・表形式)

観点R2S3GCSAzure Blob
エグレス無料$0.05〜0.09/GB(上限あり)$0.08〜0.12/GB$0.05〜0.087/GB
互換 APIS3 互換標準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-monthS3 IA / Glacier 系Nearline / Coldline / ArchiveCool / 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 Tier10 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)。PutObjectCopyObjectListObjectsCreateMultipartUploadUploadPartPutBucketCors など。
  • Class B オペレーション(読み出し系):$0.36 / 100万リクエスト(Standard)。GetObjectHeadObjectHeadBucket など。
  • Free オペレーションDeleteObjectDeleteBucketAbortMultipartUpload は無料。
  • データ取得料: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 を停止。

参考リンク


参照日: 2026-05-03