R2 には S3 API があり、デスクトップクライアントがない
Cloudflare R2 は S3 API を話すオブジェクトストレージです。エンドポイントを 1 か所書き換えれば、今使っている SDK はそのまま動きます。移行の決め手になるのは料金ページで、2026 年 9 月に確認した内容では Standard ストレージが 1 GB-月あたり $0.015、そして egress については言い切っています。"There are no charges for egress bandwidth for any storage class."(どのストレージクラスでも egress 帯域の課金はない)
取り出しが無料だと、bucket に置くものが変わります。リリースバイナリ、動画のマスター、学習データセット、毎晩のデータベースダンプ。そしてある日、そのうちの 1 ファイルを普通のアプリで開きたくなり、ツールが足りなくなります。
Cloudflare 自身が R2 向けに掲載している連携ドキュメントは、2026 年 9 月時点で rclone、Terraform プロバイダ 2 種、そして 14 本の S3 SDK ページ(aws CLI、boto3、aws-sdk-js-v3、aws4fetch、s3mini など)です。GUI クライアントは 1 つも載っていません。 一次的な選択肢はダッシュボード、wrangler(アップロードは 1 ファイル 315 MB までとドキュメントに明記)、--endpoint-url を付けた AWS CLI の 3 つだけ。AnyStorage はその欠けている層、つまり R2 の bucket をフォルダツリーとして扱うデスクトップの作業場です。
R2 に接続する 4 つの項目
R2 の接続は「エンドポイントが決まっている S3 接続」です。ホスト名の形は S3 API のドキュメントに、管轄(jurisdiction)ごとの変種は API トークンのページに載っています。
sh
# 通常のアカウントエンドポイント
https://<ACCOUNT_ID>.r2.cloudflarestorage.com
# jurisdiction 付きで作った bucket は対応するエンドポイントが必要
https://<ACCOUNT_ID>.eu.r2.cloudflarestorage.com
https://<ACCOUNT_ID>.fedramp.r2.cloudflarestorage.com
https://<ACCOUNT_ID>.us.r2.cloudflarestorage.comEU や FedRAMP の jurisdiction で作った bucket に通常のアカウントエンドポイントで接続すると、その bucket は「存在しない」ように見えます。「鍵が間違っているらしい」という問い合わせで、実は鍵の問題ではなかった例のほとんどがこれです。
トークン。 ダッシュボードでの場所は R2 object storage → Account Details → Manage API Tokens。ドキュメントに載っている権限は Admin Read & Write / Admin Read only / Object Read & Write / Object Read only の 4 段階です。デスクトップクライアントに渡すなら Object Read & Write、定義は "read, write, and list objects in specific buckets"。同じページに、オブジェクト単位のトークンは "to a set of buckets" に絞れると書かれています。Secret Access Key は作成時に一度だけ表示されます。
リージョン。 ドキュメントは "the region for an R2 bucket is auto"、そして "an empty value and us-east-1 will alias to the auto region" と明記しています。それ以外の値は当て推量です。
アドレッシング方式。 R2 は両方受け付けます。もともとはパス形式で、リリースノートには 2022 年 5 月 16 日に "support for S3 virtual-hosted style paths, such as <BUCKET>.<ACCOUNT_ID>.r2.cloudflarestorage.com" が加わったと記録されています。つまり path-style をオフにしても、オンにしても R2 は動きます。自前で建てた MinIO とは正反対で、あちらはドメインを設定するまで path-style しか通りません。
AnyStorage 側は 1 つのダイアログで終わります。接続を追加し、Cloudflare R2 を選び、エンドポイントとキーペアを貼る。認証情報は暗号化してローカルに保存され、アカウント登録はありません。
R2 が S3 と完全に同じではないところ
Cloudflare は S3 API の互換性一覧を公開しています。2026 年 9 月時点で確認した、クライアント側に影響する箇所は次のとおりです。
- ACL は存在しません。
x-amz-aclとx-amz-grant-*一族はすべて未実装です。アクセス制御はトークン側で行います。 - オブジェクトのタグ付けは未実装、ライフサイクルは "currently in progress"(実装中)と書かれています。
- ストレージクラスは
STANDARDとSTANDARD_IAのみ。 - サーバーサイド暗号化は SSE-C が対象で、AWS KMS の鍵ヘッダーは非対応。チェックサムは複合形式の CRC-32、CRC-32C、SHA-1、SHA-256 に対応し、
FULL_OBJECTは非対応です。
日常的に効いてくるのはサイズの上限です。転送が通るか通らないかを決めるのはこの表です。
| 項目 | 値 |
|---|---|
| オブジェクトの最大サイズ | 5 TiB(正確には 4.995 TiB) |
| 単一 PUT の最大サイズ | 5 GiB(正確には 4.995 GiB) |
| マルチパートの最小パートサイズ | 5 MiB(最後のパートを除く) |
| パートサイズ | 最後以外のパートはすべて同じサイズ |
| 1 アップロードの最大パート数 | 10,000 |
| オブジェクトキーの長さ | 1,024 バイト |
| 1 アカウントあたりの bucket 数 | 1,000,000 |
上の 2 行をあわせて読んでください。おおよそ 5 GiB を超えるものはマルチパートで送るしかないので、ファイル全体を PUT するだけのツールは大きな動画で失敗し、その理由をほとんど教えてくれません。
署名付き URL と 3 つの制約
R2 は署名付き URL に対応していて、ドキュメントの記述は具体的です。AWS Signature Version 4、有効期限は "1 second to 7 days (604,800 seconds)"、対応メソッドは GET・HEAD・PUT・DELETE の 4 つ。つまずきやすい制約は 2 つあります。HTML フォームからのマルチパート投稿にあたる POST は "is not currently supported"。そして署名付き URL は "cannot be used with custom domains" で、S3 API のドメインに対してしか使えません。
AnyStorage は Pro で署名付きのアップロード / ダウンロード URL を発行します。トークンを渡したくない相手に 1 オブジェクトだけ渡す最短手です。S3 側の同じ仕組みは署名付き URL のページにあります。
公開バケットと r2.dev
R2 は bucket を Cloudflare 管理の r2.dev サブドメインで公開できますが、ドキュメントは用途を隠しません。r2.dev 経由の公開アクセスは "is rate-limited and should only be used for development purposes"、このエンドポイントは "is intended for non-production traffic" です。WAF のカスタムルール、キャッシュ、アクセス制御、Bot Management を使うなら、bucket をカスタムドメインの背後に置く必要があると書かれています。
つまり r2.dev は配信計画ではありません。単発の受け渡しは署名付き URL、本番の配信はカスタムドメインです。
CORS が原因のとき
デスクトップクライアントはブラウザのプリフライトを送りません。だから切り分けに使えます。AnyStorage では一覧もダウンロードもできるのに Web アプリからは失敗する、という状態なら、認証情報は正しく、疑うべきは CORS 設定です。
2026 年 9 月に確認した R2 の CORS ドキュメントは AllowedOrigins、AllowedMethods、AllowedHeaders、ExposeHeaders、MaxAgeSeconds を定義しています。オリジンは "must match exactly"、つまりスキームもホストもポートも一致が必要で、http://localhost:3000 と https://localhost:3000 は別物です。カスタムヘッダーは明示が前提で、x-user-id のようなヘッダーを含むリクエストは "should specify these headers as AllowedHeaders"、トラブルシュートの手順も "make sure the rule's AllowedHeaders includes the blocked request's headers" です。このページに * が「任意のヘッダー」を意味するという記述はないので、1 つずつ書き出してください。もう 1 つの罠が MaxAgeSeconds で、ブラウザはプリフライトの結果をキャッシュするため、直した設定がキャッシュ切れまで壊れたままに見えます。個別のメッセージは R2 の CORS エラー解説で扱います。
R2 を扱うツールの比較
| ツール | GUI | ドライブとしてマウント | Cloudflare の R2 ドキュメント掲載 | Linux | 価格 |
|---|---|---|---|---|---|
| AnyStorage | あり(デスクトップアプリ) | あり(ローカル WebDAV、ドライバ不要) | なし | あり(AppImage と .deb) | 無料プランと有料 Pro |
| rclone | なし(コマンドライン) | あり(FUSE または WinFsp が必要) | あり | あり | 無料・オープンソース |
| Cyberduck | あり(デスクトップアプリ) | なし | なし | なし | 無料・オープンソース |
| AWS CLI | なし(コマンドライン) | なし | あり(aws CLI のページ) | あり | 無料 |
| Cloudflare ダッシュボード | あり(ブラウザ) | なし | 一次提供 | ブラウザのみ | 無料 |
表の裏にあるトレードオフです。
- rclone はこの中で最も強力で、最も手間がかかります。Cloudflare が R2 向けに掲載している唯一のサードパーティツールで、
rclone mountは本物のドライブのように振る舞いますが、FUSE か WinFsp の導入と、書き込みを許すための--vfs-cache-modeの判断が必要です。 - Cyberduck は R2 の接続プロファイルを持つ良質な無料ブラウザです。マウントはできず、Linux 版もありません。
- AWS CLI は「あらかじめ説明できるコピー」に向き、「3 階層下にある、名前を半分しか覚えていないファイル探し」には向きません。ダッシュボードは bucket やトークン、カスタムドメインを作る場所としては正解で、ファイルを動かす場所としては遅いです。
- AnyStorage はブラウザ系とマウント系の中間にいます。そして Cloudflare のドキュメントには載っていません。その行は意図して正直に書いています。
R2 をドライブとしてマウントする
パスしか受け取らないソフトもあります。AnyStorage は通常の S3 API で R2 と通信し、接続中のストレージをまとめて自分のマシンの http://127.0.0.1:3211 で動く WebDAV サーバーとして再提供します。macFUSE も WinFsp もカーネルモジュールも管理者権限も要りません。マウントには OS 標準の WebDAV クライアント、つまり Finder の「サーバへ接続」、エクスプローラーの「ネットワークドライブの割り当て」、Nautilus や Dolphin の dav:// を使います。手順の全文はこちら。無料プランでは読み取り専用、Pro で読み書きになります。
動作環境とインストール
0.2.25 は 2026 年 9 月 23 日公開で、対応環境は macOS 11 以降、Windows 10 以降、Ubuntu 20.04 以降です。Mac なら brew install --cask kilerd/tap/anystorage。無料プランはストレージ接続 2 つまで。R2 が複数あるストレージの 1 つなら、S3 クライアント(GUI)の概要、または Linux と macOS のページから始めてください。
よくある質問
R2 は署名付き URL に対応していますか?
対応しています。Cloudflare は SigV4 の署名付き URL を GET・HEAD・PUT・DELETE 向けに文書化していて、有効期限は 1 秒から 7 日(604,800 秒)です。POST のフォームアップロードは非対応で、カスタムドメインでは使えず、S3 API のエンドポイントに対してのみ有効です。AnyStorage では Pro で発行できます。
R2 の CORS 設定が効かないのはなぜですか?
原因はたいてい 3 つのどれかです。オリジンがスキームやポートを含めて完全一致していない、カスタムリクエストヘッダーが AllowedHeaders に入っていない、ブラウザが MaxAgeSeconds の分だけ古いプリフライトをキャッシュしている。ドキュメントに * が任意のヘッダーを含むという記述はないので、明示的に列挙してください。詳細は R2 の CORS エラー解説へ。
R2 のエンドポイントとリージョンは何を指定しますか?
エンドポイントは https://<ACCOUNT_ID>.r2.cloudflarestorage.com、jurisdiction 付きで作った bucket なら eu / fedramp / us の変種です。リージョンは auto、ドキュメントによれば空値と us-east-1 も auto に読み替えられます。
R2 で path-style は必要ですか?
不要です。R2 は 2022 年 5 月から virtual-hosted 形式に対応し、パス形式も受け付けるので、どちらの設定でも動きます。path-style が必須なのは自前で建てた MinIO のほうです。
FUSE なしで R2 をドライブにできますか?
できます。AnyStorage が http://127.0.0.1:3211 でローカルの WebDAV サーバーを動かし、マウントは OS 標準の WebDAV クライアントが行うので、macFUSE も WinFsp も関わりません。無料プランでは読み取り専用、Pro で読み書きです。