Contents
1. アカウント作成と無料枠の概要
| 項目 | 内容 |
|---|---|
| 必要な情報 | メールアドレス+クレジットカード(課金は超過時のみ) |
| 無料ストレージ | 10 GB の保存容量が無期限で利用可 |
| リクエスト料金 | GET/PUT/DELETE などの API 呼び出しは従量課金(例:$0.005/1,000 リクエスト) |
| エグレス費用 | ダウンロードに対する追加料金 なし |
手順(3 分で完了)
- Cloudflare 公式サイトの「Sign Up」からメール認証。
- コンソール左上の Billing メニューでクレジットカードを登録。
- ※無料枠は自動的に有効化され、課金は保存容量・リクエスト数が超過したときだけです。
ポイント:クレジットカード情報は「支払い方法の確認」用であり、実際に請求が走るのは無料枠を超えた瞬間です。小規模プロジェクトや検証環境ではほぼコストゼロで開始できます。
2. R2 バケットと認証情報の取得
2‑1. バケット作成手順(ダッシュボード)
- コンソール左メニュー → R2 → 「Create bucket」
- Bucket name と Region を入力。リージョンは
autoがデフォルトで推奨されます。 - 作成完了後、バケット一覧に表示されます。
2‑2. API キー(Access Key / Secret Key)の取得
- 同じ R2 メニュー → API Tokens → 「Create Token」
- テンプレートから “Edit R2 Buckets” を選択し、対象バケットを指定。
- 作成後に表示される Access Key ID と Secret Access Key を安全な場所へ保存(環境変数やシークレットマネージャーの利用が推奨)。
注意:キーは S3 互換ツールで認証情報として使用します。漏洩すると不正アクセスにつながるため、絶対にコードベースにハードコーディングしないでください。
3. S3 互換ツールで R2 を操作する
3‑1. AWS CLI の設定例
|
1 2 3 4 5 6 7 8 |
# プロファイル「r2」を作成 aws configure set aws_access_key_id YOUR_ACCESS_KEY_ID --profile r2 aws configure set aws_secret_access_key YOUR_SECRET_ACCESS_KEY --profile r2 aws configure set region auto --profile r2 # R2 はリージョン自動 # バケット一覧表示(エンドポイント必須) aws s3 ls s3://my-bucket --endpoint-url https://<ACCOUNT_ID>.r2.cloudflarestorage.com --profile r2 |
3‑2. GUI ツールの設定ポイント
| ツール | 設定項目 |
|---|---|
| s3cmd | Host = <ACCOUNT_ID>.r2.cloudflarestorage.com、Signature v4 = True |
| Cyberduck | プロトコルは S3 (Amazon Simple Storage Service)、サーバーに同上、ポート 443、Path Style Access を有効化 |
| Rclone | type = s3、provider = Cloudflare、endpoint = https://<ACCOUNT_ID>.r2.cloudflarestorage.com |
3‑3. 基本コマンド集
| 操作 | AWS CLI | s3cmd |
|---|---|---|
| アップロード | aws s3 cp ./file.txt s3://my-bucket/ --endpoint-url https://<ACCOUNT_ID>.r2.cloudflarestorage.com |
s3cmd put file.txt s3://my-bucket/ |
| ダウンロード | aws s3 cp s3://my-bucket/file.txt ./ --endpoint-url https://<ACCOUNT_ID>.r2.cloudflarestorage.com |
s3cmd get s3://my-bucket/file.txt . |
| 削除 | aws s3 rm s3://my-bucket/file.txt --endpoint-url https://<ACCOUNT_ID>.r2.cloudflarestorage.com |
s3cmd del s3://my-bucket/file.txt |
ベストプラクティス:大量小ファイルの PUT はまとめて zip 化し、一括アップロードすることでリクエスト数を削減できます。
4. 公開アクセス、CORS、署名付き URL の設定
4‑1. バケットポリシーでオブジェクト公開
|
1 2 3 4 5 6 7 8 9 10 |
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Principal":"*", "Action":["s3:GetObject"], "Resource":["arn:aws:s3:::my-bucket/*"] }] } |
CLI 適用コマンド:
|
1 2 3 4 5 |
aws s3api put-bucket-policy \ --bucket my-bucket \ --policy file://public-policy.json \ --endpoint-url https://<ACCOUNT_ID>.r2.cloudflarestorage.com |
4‑2. CORS 設定(XML)
|
1 2 3 4 5 6 7 8 9 |
<CORSConfiguration> <CORSRule> <AllowedOrigin>https://example.com</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <AllowedHeader>*</AllowedHeader> <MaxAgeSeconds>3000</MaxAgeSeconds> </CORSRule> </CORSConfiguration> |
CLI 適用:
|
1 2 3 4 5 |
aws s3api put-bucket-cors \ --bucket my-bucket \ --cors-configuration file://cors.xml \ --endpoint-url https://<ACCOUNT_ID>.r2.cloudflarestorage.com |
4‑3. 署名付き URL の取得例
| 方法 | コマンド/コード |
|---|---|
| AWS CLI(有効期限 1 h) | aws s3 presign s3://my-bucket/file.png --expires-in 3600 --endpoint-url https://<ACCOUNT_ID>.r2.cloudflarestorage.com |
| Workers (JavaScript) | javascript export async function onRequest({ env }) { const obj = await env.MY_BUCKET.get('file.png'); const url = await obj.signURL({ expiresIn: 60 * 15 }); return new Response( |
活用シーン:一時的に外部パートナーとファイルを共有したい場合や、認証が必要な画像・PDF をフロントエンドから直接取得させたいときに便利です。
5. Workers と Pages との連携例
5‑1. Workers → R2 の基本コード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
export default { async fetch(request, env) { const url = new URL(request.url); if (url.pathname.startsWith('/assets/')) { // バインド済みの R2 バケット(wrangler.toml の設定参照) const object = await env.ASSETS.get(url.pathname.slice(8)); if (!object) return new Response('Not found', { status: 404 }); const headers = new Headers({ 'Cache-Control': 'public, max-age=86400', 'Content-Type': object.httpMetadata?.contentType || 'application/octet-stream' }); return new Response(object.body, { status: 200, headers }); } // その他はオリジンへフォールバック return fetch(request); }, }; |
wrangler.toml の R2 バインド設定
|
1 2 3 4 5 6 7 8 |
name = "asset-proxy" type = "javascript" [[r2_buckets]] binding = "ASSETS" # Workers 側で使用する変数名 bucket_name = "static-assets" preview_bucket_name = "static-assets-preview" |
5‑2. Pages と R2 のシームレス配信
- wrangler.toml に同様の
[[r2_buckets]]を追加。 - ビルド後、
npm run deploy(内部でwrangler publish)が自動的にstatic-assetsバケットへ成果物をプッシュ。 - Pages のエッジサーバーは
/assets/*へのリクエストを Workers 経由で R2 に転送し、CDN がキャッシュを担当します。
メリット:オリジンが不要になるためレイテンシが低減し、かつエグレス費用が発生しない点が大きなコストアドバンテージです。
5‑3. Nextcloud と R2 の統合(参考リンクは Future Architect 記事)
- Nextcloud 管理画面 → 外部ストレージ → 「Amazon S3」
- エンドポイントに
<ACCOUNT_ID>.r2.cloudflarestorage.com、認証方式は Signature v4。 - 取得した Access Key / Secret Key を入力し、バケット名(例:
nextcloud-data)を設定。
注意点:R2 は現在 Lifecycle ルールが未実装です。定期的な削除処理は外部スクリプトで代替してください。
6. コスト構造と最適化ポイント
| 項目 | 無料枠 | 超過時の課金(2026 年4月) |
|---|---|---|
| 保存容量 | 10 GB (無償) | $0.015 / GB‑month |
| GET リクエスト | 1,000 件まで無料(※公式に明記なし) | $0.005 / 1,000 件 |
| PUT/POST/DELETE | 無料 | $0.01 / 1,000 件 |
| データ転送(エグレス) | 無料 | - |
コスト削減の実践テクニック
- キャッシュ戦略
-
Workers または Cloudflare CDN の
Cache-Control: max-age=86400を設定し、同一オブジェクトへの GET リクエストを大幅に削減。 -
バッチアップロード
-
小ファイルが多数ある場合は zip アーカイブ化して 1 回の PUT に集約することでリクエスト数と API 呼び出しコストを抑制。
-
保存容量管理
-
ログや古いバックアップは
aws s3 rmスクリプトで自動削除(例:30 日超過ファイル)。R2 に Lifecycle 機能が追加されたら置き換える。 -
モニタリング
- Cloudflare Dashboard の「Analytics」→「R2 Usage」でリアルタイムのリクエスト数と使用容量を確認し、予算超過前にアラート設定(外部監視ツールとの連携も可)。
7. トラブルシューティングチェックリスト
| エラーコード | 主な原因 | 確認ポイント |
|---|---|---|
| 403 Forbidden (InvalidAccessKeyId) | キーが間違っている、または endpoint が未指定 | aws configure list --profile r2 でキーを確認、CLI に必ず --endpoint-url を付与 |
| CORS エラー(ブラウザコンソール) | バケットの CORS 設定が無い/許可ドメイン不一致 | AllowedOrigin がフロントエンド URL と完全一致しているか |
| InvalidRegion | R2 では region=auto 固有であるにも関わらず他リージョン指定した |
aws configure set region auto --profile r2 を再設定 |
| 429 TooManyRequests | 短時間に過剰リクエストを送信 | リトライロジックに指数バックオフ(例:100ms → 200ms → 400ms)を実装 |
| SignatureDoesNotMatch | シークレットキーのタイプミス、または署名方式不一致 | Signature v4 が有効か、キー文字列に余分な空白が無いか |
対策フロー
1. エラーメッセージを正確にコピー → Cloudflare Docs の該当ページで検索。
2. 設定ファイル(.aws/config、wrangler.toml)を再確認。
3. 必要なら Incognito モードや別マシンからリクエストを試し、環境依存か判定。
8. まとめ
- アカウント作成はメール認証+カード登録だけで完了。無料枠の 10 GB は無期限に利用可能です。
- バケットとキーは Cloudflare ダッシュボードから数クリックで取得でき、S3 互換ツールへの設定もシンプルです。
- CLI/GUI ツール(AWS CLI、s3cmd、Cyberduck、Rclone 等)にエンドポイント
https://<ACCOUNT_ID>.r2.cloudflarestorage.comを指定すれば、従来の S3 と同様に操作できます。 - 公開設定・CORSはバケットポリシーと XML 設定で完結し、署名付き URL により一時的な安全共有も実装可能です。
- Workers / Pages 連携ではエッジ側から直接 R2 を呼び出すコードが数行で書け、静的資産の CDN 配信や画像加工パイプラインを低コストで構築できます。
- 実務統合例として Nextcloud の外部ストレージ化や定期バックアップ(
aws s3 sync)が挙げられます。R2 は Lifecycle が未提供なので削除は自動スクリプトで代替してください。 - コスト管理は保存容量の無料枠とリクエスト課金に注目し、キャッシュやバッチ処理で最適化します。エグレス費用が不要な点は大量配信シナリオで大きなメリットです。
- トラブルシューティングは認証・CORS・リージョン設定ミスが主因。チェックリストを活用すれば迅速に復旧できます。
次のステップ:本ガイドの手順通りに環境を構築し、実際に 1 GB 程度のファイルをアップロード・公開してみましょう。その結果を基に料金シミュレーションとパフォーマンス測定を行い、運用方針を固めることをおすすめします。
本稿は執筆時点(2026 年4月)で確認できた情報を元に作成しています。最新の仕様や料金は必ず公式サイトをご参照ください。