Cloudflare R2の使いどころ:画像とファイルの置き場
まず、このサイトの画像はR2に置いていない
このサイトは Astro で作っていて、ホスティングは Cloudflare Pages です。記事中の画像はリポジトリに一緒に入れて、ビルド時に astro:assets で最適化する形に寄せています。その最適化の組み立ては、Astroの画像最適化を標準の astro:assets に寄せるにまとめました。つまり、現時点では R2 は使っていません。
それでも使いどころを整理しておくのは、「リポジトリに置きたくないファイル」がブログ運営では必ず出てくるからです。配布用の大きな PDF、動画や音声、バックアップのアーカイブ。こうしたものの置き場として、同じ Cloudflare の中にある R2 は第一候補になります。この記事は、その線引きを決めるためのメモです。
R2は何者か
R2 は Cloudflare のオブジェクトストレージです。階層のあるファイルサーバではなく、「バケット」という入れ物に、キー(名前)を付けたオブジェクトを入れておくタイプのストレージで、Amazon S3 と互換性のある API を備えています。S3 向けの SDK やツールがそのまま使えるので、既存の資産や知識を持ち込みやすいのが特徴です。
もう一つの大きな特徴が、エグレス(データを外へ読み出す転送)料金がかからないことです。通常のクラウドストレージは「置く料金」に加えて「インターネットへ流す量」でも課金されますが、R2 はこの部分が無料になっています。この設計が、後述する「配布物置き」との相性の良さにつながります。
なお、バケットはデフォルトでは非公開です。置いただけでは誰もアクセスできず、公開するには後述の方法で明示的に口を開ける必要があります。
置き場の役割分担
自分のサイト向けに決めている線引きは、こうです。
| 置くもの | 置き場 | 理由 |
|---|---|---|
| 記事内の写真・スクリーンショット | リポジトリ+astro:assets | ビルド時にリサイズや形式変換が効く。記事と一緒にバージョン管理できる |
| OGP画像やファビコンなどサイトの部品 | リポジトリ | サイトのコードと一体のもので、単独で差し替える場面がほぼない |
| 配布用の大きなPDF・資料 | R2(候補) | リポジトリが膨らむ。画像のような最適化も不要で、差し替えはファイル側で吸収できる |
| 動画・音声ファイル | R2(候補) | サイズが大きく、再生のたびに転送が発生する。エグレス無料が効く |
| バックアップやアーカイブ | R2(非公開) | 公開する必要がない。置き場をサイト本体と分けておきたい |
原則は「迷ったらリポジトリ」。画像を R2 に逃がすと、ビルド時の最適化も、記事との一体管理も手放すことになります。R2 の出番は、リポジトリに置くこと自体が負担になるファイルに限る、というのが今の判断です。
料金の考え方:効くのは「配信しても増えない」こと
R2 の課金は、保管量(GB-月)と操作回数が中心です。操作は書き込み・一覧系の Class A と、読み取り系の Class B に分かれていて、エグレスは無料です。執筆時点で公式の料金ページを確認した無料枠は次のとおりです(料金は変わりうるので、導入前に公式ページで再確認してください)。
| 項目 | 無料枠(月あたり) |
|---|---|
| 保管(Standardストレージ) | 10 GB-月 |
| Class A操作(書き込み等) | 100万回 |
| Class B操作(読み取り等) | 1,000万回 |
| エグレス(外向き転送) | 無料 |
個人ブログの規模なら、配布物を多少置いても無料枠に収まることが多いはずです。それ以上に大きいのは、「記事が読まれて転送量が増えたら請求が跳ねる」という心配をしなくて済む点です。アクセス数が読めない個人サイトにとって、配信量で料金が増えない設計は、金額そのもの以上に気が楽です。
公開方法は3択
バケットはデフォルト非公開なので、「どう見せるか」を選ぶ必要があります。大きく分けて3つです。
| 方法 | 向いている用途 | 注意点 |
|---|---|---|
| カスタムドメインを接続して公開 | 配布物など本番の公開ファイル | Cloudflare のキャッシュや WAF、アクセス制御が使える。本番用途はこれ |
r2.dev サブドメインで公開 | 動作確認・一時的な共有 | 公式にも「本番用途ではない」と明記されている。キャッシュや WAF の細かい制御はできない |
| 非公開のまま署名付きURLで渡す | 期限付きの配布、限定公開 | URL に有効期限(1秒〜7日)を付けられる。ただし発行処理がサーバー側に要り、カスタムドメイン経由では使えない |
非公開+署名付きURL は、「配布資料のダウンロードリンク」のような場面の選択肢です。URL を知っている人だけが、期限内にだけ落とせる形にできます。発行には R2 の API 認証情報を使うサーバー側の処理(Workers など)が要るので、静的サイト単体では完結しません。こうした認証情報の置き方については、Pages/Workersの環境変数と秘密情報の扱いで整理しています。
署名付きURL は、カスタムドメインを付けた公開バケットでは使えません。S3 API のドメイン経由でのみ発行できるので、「独自ドメインで公開したい」と「期限付きで渡したい」は両立しない、と覚えておく方が安全です。
出番があるケース、ないケース
最後に、個人ブログ目線での「本当に要るか」の切り分けです。R2 に逃がす価値があるのは、だいたい次の条件に当てはまるファイルです。
- 1ファイルが数MBを超え、リポジトリの肥大化が気になる
- 画像のようにリサイズや形式変換をしなくていい
- 記事の文章と一緒にバージョン管理する必要がない
- 読み取り(ダウンロードや再生)の回数が読めない
逆に、通常の記事画像まで R2 に出す必要はまずありません。astro:assets の最適化が効かなくなるし、画像 URL の管理という新しい手間が増えるだけです。「オブジェクトストレージがあるから使う」のではなく、「リポジトリに置くと困るものが出てきたら逃がす」。このサイトでも、大きな配布物を公開する予定が立った時点で、初めてバケットを作るつもりです。
参考
- R2 Overview — Cloudflare Docs: https://developers.cloudflare.com/r2/
- R2 Pricing — Cloudflare Docs: https://developers.cloudflare.com/r2/pricing/
- Public buckets — Cloudflare Docs: https://developers.cloudflare.com/r2/buckets/public-buckets/
- Presigned URLs — Cloudflare Docs: https://developers.cloudflare.com/r2/api/s3/presigned-urls/