R2でのアップロードイベントをログに記録し、ストレージするためのイベント通知
この例では、イベント通知を使用して、R2のアップロードログを別のバケットにキャプチャして保存する手順を説明します。
続行するには、以下が必要です:
- キューを使用するために必要なWorkers Paidのサブスクリプション。
まず、Wranglerのインストール/更新を参照して、Cloudflare Developer Platform CLIであるWranglerをインストールします。
2つのR2バケットを作成する必要があります:
example-upload-bucket: このバケットに新しいオブジェクトがアップロードされると、あなたのコンシューマーワーカーがログを書き込みます。example-log-sink-bucket:example-upload-bucketからのアップロードログがこのバケットに書き込まれます。
バケットを作成するには、以下のWranglerコマンドを実行します:
npx wrangler r2 bucket create example-upload-bucketnpx wrangler r2 bucket create example-log-sink-bucketイベント通知は、example-upload-bucket内のデータの変更をキャプチャします。通知を受け取るために新しいキューを作成する必要があります:
npx wrangler queues create example-event-notification-queueexample-upload-bucketのイベント通知を有効にする前に、通知を受け取るためのコンシューマーワーカーを作成する必要があります。
C3(create-cloudflare CLI)を使用して新しいワーカーを作成します。C3は、ワーカーを含む新しいアプリケーションをCloudflareにセットアップしてデプロイするのを助けるために設計されたコマンドラインツールです。
npm create cloudflare@latest -- consumer-workeryarn create cloudflare@latest consumer-workerpnpm create cloudflare@latest consumer-workerFor setup, select the following options:
- For What would you like to start with?, choose
Hello Worldの例. - For Which template would you like to use?, choose
Hello Worldワーカー. - For Which language do you want to use?, choose
TypeScript. - For Do you want to use git for version control?, choose
Yes. - For Do you want to deploy your application?, choose
No(we will be making some changes before deploying).
次に、新しく作成したディレクトリに移動します:
cd consumer-workerワーカープロジェクトのwrangler.tomlファイルに、キューコンシューマーとR2バケットバインディングを追加します。キューコンシューマーバインディングは、将来のイベント通知のコンシューマーとしてワーカーを登録し、R2バケットバインディングはワーカーがR2バケットにアクセスできるようにします。
name = "event-notification-writer"main = "src/index.ts"compatibility_date = "2024-03-29"compatibility_flags = ["nodejs_compat"]
[[queues.consumers]]queue = "example-event-notification-queue"max_batch_size = 100max_batch_timeout = 5
[[r2_buckets]]binding = "LOG_SINK"bucket_name = "example-log-sink-bucket"src/index.tsにqueueハンドラーを追加して、ログシンクバケットに通知のバッチを書き込む処理を行います(fetchハンドラーは必要ありません):
export interface Env { LOG_SINK: R2Bucket;}
export default { async queue(batch, env): Promise<void> { const batchId = new Date().toISOString().replace(/[:.]/g, "-"); const fileName = `upload-logs-${batchId}.json`;
// メッセージのバッチ全体をJSONにシリアライズ const fileContent = new TextEncoder().encode( JSON.stringify(batch.messages), );
// R2にメッセージのバッチを書き込む await env.LOG_SINK.put(fileName, fileContent, { httpMetadata: { contentType: "application/json", }, }); },} satisfies ExportedHandler<Env>;コンシューマーワーカーをデプロイするには、wrangler deployコマンドを実行します:
npx wrangler deployコンシューマーワーカーが受信するイベント通知メッセージの処理の準備が整ったので、wrangler r2 bucket notification createコマンドを使用してexample-upload-bucketのイベント通知を有効にする必要があります:
npx wrangler r2 bucket notification create example-upload-bucket --event-type object-create --queue example-event-notification-queueこれで、Cloudflareダッシュボードでexample-upload-bucketにオブジェクトをアップロードすることで、エンドツーエンドのフローをテストできます。オブジェクトをアップロードした後、数秒以内にexample-log-sink-bucketにログが表示されます。