ユーザー生成コンテンツ(UGC)は、いまのアプリケーションに欠かせません。プロフィール写真、文書、動画のアップロードに加え、AI モデルが生成する画像、要約、構造化データも含まれます。そのため、アプリケーションには、このコンテンツを保存し、アクセスするための信頼性が高く、スケーラブルで、コスト効率のよい仕組みが必要です。
Cloudflare R2 は、egress 料金なしの S3 互換オブジェクトストレージです。大規模なコンテンツのアップロードと配信に向いています。Cloudflare Workers と Cloudflare のグローバルネットワークを組み合わせると、UGC の取り込みと管理を、高速で安全、かつコスト効率よく進められます。
このリファレンスアーキテクチャでは、よくある UGC ワークフローを 2 つ取り上げます。どちらもパフォーマンス、セキュリティ、コスト効率を重視しています。
- 署名付き URL 経由で R2 へ安全にアップロードする: プロフィール画像や文書などを、バックエンドに過度な負荷をかけずに、効率よく安全にアップロードできます。
- AI 生成コンテンツを R2 に保存する: Workers AI または外部の AI サービスが生成したコンテンツを保存し、推論結果をあとから使えるようにします。
ユーザー生成コンテンツは、多くの場合、ファイルアップロードから始まります。プロフィール写真、履歴書、リッチメディア、文書などです。アプリケーションは、これらのアップロードを安全に検証して保存しつつ、レイテンシ、高コスト、バックエンドの不要な複雑さを避ける必要があります。
このアーキテクチャでは、主ストレージに R2 を使い、アップロードアクセスの制御に Worker を使います。ファイルは、ユーザーのブラウザまたはデバイスから署名付き URL で R2 へ直接アップロードします。署名付き URL は、Worker がユーザーの権限とアップロード意図を検証したあとで生成します。
この方法では、大きなファイルをアプリケーションのバックエンドや Worker 経由で流しません。レイテンシと運用コストを下げつつ、アクセスとセキュリティを厳密に制御できます。
さらに R2 は Cloudflare のグローバルネットワークとネイティブに統合されているため、R2 に保存したファイルは世界中から低レイテンシでアクセスできます。アプリケーションが拡大しても egress 料金はかかりません。
仕組み
- ユーザーがフロントエンドからアップロードを開始する: アプリはファイルの詳細(サイズ、名前など)を集め、アップロード開始のためにバックエンド API(Cloudflare Worker)を呼び出します。
- Worker がユーザーを認証し、リクエストを検証する: Worker は、ユーザーがログイン済みであること、アップロード権限があること、ファイルが許容範囲内であること(例: 最大 10MB、許可する MIME タイプ)を確認します。
- Worker が R2 への署名付き PUT URL を返す: 署名付き URL により、フロントエンドは限られた時間、特定のキーまたは名前空間へ、R2 に直接アップロードできます。Worker が大きなファイルを直接扱う必要はありません。
- フロントエンドがファイルを R2 へ直接アップロードする: ファイルはクライアントから R2 へ直接ストリームされます。
- (任意)アップロード後のワークフローを起動する: R2 は イベント通知 に対応しており、新しいアップロードなど、R2 バケット内のデータが変わったときにキューへメッセージを送れます。アップロード後処理の例:
- ファイルのスキャン、モデレーション、変換。
- メタデータ(例:
user_id、file_path、timestamp)を、Cloudflare のサーバーレス SQL データベースである D1 へ書き込む。 - ユーザーへ通知する、またはダッシュボード / UI を更新する。
クライアントから R2 へ直接データをアップロードする方法の詳細は、presigned URLs のドキュメントを参照してください。
いまのアプリケーションの多くは、AI 生成コンテンツを使います。商品説明、プロフィール画像、音声クリップなどです。ユーザー操作やスケジュール済みイベントに応じてこのコンテンツを作る場合は、すぐ、確実に、大規模に保存する必要があります。
このアーキテクチャでは、Workers AI でエッジ上の推論を行い、生成結果を Cloudflare R2 へ直接保存します。すべて 1 つの Worker 内で完結します。
仕組み
- ユーザーがコンテンツ生成を開始する: フロントエンドは Cloudflare Worker へリクエストを送り、AI モデルでコンテンツを作成します(例: 「この商品のサムネイル画像を作成する」)。
- Worker が Workers AI を呼び出す: Worker はユーザー入力を、Workers AI 上のモデルへ渡します。
- 生成結果が Worker へ返る: レスポンスはプレーンテキスト、Base64 画像、バイナリバッファ、その他の構造化データなど、モデルの種類によって異なります。
- Worker が出力を R2 へ直接アップロードする: 署名付き URL もクライアントからのアップロードも不要です。Worker は認証済みの安全な
PUTリクエストで、指定バケットへ出力を保存します。 - Worker が成功とメタデータをフロントエンドへ返す: クライアントは、保存したファイルへの参照(パス、オブジェクトキー、必要なら署名付きダウンロード URL など)を受け取ります。
Cloudflare Workers から R2 バケットへアクセスする方法の詳細は、Workers から R2 を使う を参照してください。
ユーザー生成コンテンツを Cloudflare R2 に保存する と、アプリケーションは次を得られます。
- 高いスケーラビリティのストレージバックエンド
- Cloudflare のエッジコンピューティングによる高速アクセス
- egress 料金なしの予測しやすいコスト
- 効率を最大化する、AI と UGC を組み合わせたワークフロー
このアーキテクチャでは、コンテンツの保存、処理、配信を 高速、安全、かつコスト効率よく 行えます。