コンテンツにスキップ

R2でのアップロードイベントをログに記録し、ストレージするためのイベント通知

Last reviewed: 6 months ago

この例では、イベント通知を使用して、R2のアップロードログを別のバケットにキャプチャして保存する手順を説明します。

前提条件

続行するには、以下が必要です:

  • キューを使用するために必要なWorkers Paidのサブスクリプション。

1. Wranglerをインストール

まず、Wranglerのインストール/更新を参照して、Cloudflare Developer Platform CLIであるWranglerをインストールします。

2. R2バケットを作成

2つのR2バケットを作成する必要があります:

  • example-upload-bucket: このバケットに新しいオブジェクトがアップロードされると、あなたのコンシューマーワーカーがログを書き込みます。
  • example-log-sink-bucket: example-upload-bucketからのアップロードログがこのバケットに書き込まれます。

バケットを作成するには、以下のWranglerコマンドを実行します:

Terminal window
npx wrangler r2 bucket create example-upload-bucket
npx wrangler r2 bucket create example-log-sink-bucket

3. キューを作成

イベント通知は、example-upload-bucket内のデータの変更をキャプチャします。通知を受け取るために新しいキューを作成する必要があります:

Terminal window
npx wrangler queues create example-event-notification-queue

4. ワーカーを作成

example-upload-bucketのイベント通知を有効にする前に、通知を受け取るためのコンシューマーワーカーを作成する必要があります。

C3(create-cloudflare CLI)を使用して新しいワーカーを作成します。C3は、ワーカーを含む新しいアプリケーションをCloudflareにセットアップしてデプロイするのを助けるために設計されたコマンドラインツールです。

Terminal window
npm create cloudflare@latest -- consumer-worker

For 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).

次に、新しく作成したディレクトリに移動します:

Terminal window
cd consumer-worker

5. ワーカーを設定

ワーカープロジェクトの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 = 100
max_batch_timeout = 5
[[r2_buckets]]
binding = "LOG_SINK"
bucket_name = "example-log-sink-bucket"

6. R2にイベント通知メッセージを書き込む

src/index.tsqueueハンドラーを追加して、ログシンクバケットに通知のバッチを書き込む処理を行います(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>;

7. ワーカーをデプロイ

コンシューマーワーカーをデプロイするには、wrangler deployコマンドを実行します:

Terminal window
npx wrangler deploy

8. イベント通知を有効にする

コンシューマーワーカーが受信するイベント通知メッセージの処理の準備が整ったので、wrangler r2 bucket notification createコマンドを使用してexample-upload-bucketのイベント通知を有効にする必要があります:

Terminal window
npx wrangler r2 bucket notification create example-upload-bucket --event-type object-create --queue example-event-notification-queue

9. テスト

これで、Cloudflareダッシュボードでexample-upload-bucketにオブジェクトをアップロードすることで、エンドツーエンドのフローをテストできます。オブジェクトをアップロードした後、数秒以内にexample-log-sink-bucketにログが表示されます。