INTEGRITY Документация

Регистрируйте и сохраняйте события загрузки в R2 с помощью уведомлений о событиях

В этом примере пошагово показано, как использовать уведомления о событиях чтобы фиксировать и сохранять журналы загрузок R2 в отдельном бакете.

Push-уведомления о событиях R2

1. Установить Wrangler

Для начала обратитесь к Установка/Обновление Wrangler чтобы установить Wrangler, CLI платформы Cloudflare Developer Platform.

2. Создать бакеты R2

Вам нужно будет создать два бакета R2:

Чтобы создать бакеты, выполните следующие команды Wrangler:

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

3. Создать очередь

Уведомления о событиях фиксируют изменения данных в example-upload-bucket. Вам потребуется создать новую очередь для получения уведомлений:

npx wrangler queues create example-event-notification-queue

4. Создать Worker

Прежде чем включить уведомления о событиях для example-upload-bucket, вам нужно создать Worker-получатель чтобы получать уведомления.

Создайте новый Worker с помощью C3 (create-cloudflare CLI). C3 это инструмент командной строки, который помогает настраивать и развёртывать новые приложения, включая Workers, в Cloudflare.

npm create cloudflare@latest -- consumer-worker

Для настройки выберите следующие параметры:

Затем перейдите в только что созданный каталог:

cd consumer-worker

5. Настроить Worker

В проекте вашего Worker [конфигурационный файл Wrangler](/workers/wrangler/configuration/), добавьте потребитель очереди и Привязка бакета R2. Привязки consumer очередей зарегистрируют ваш Worker в качестве получателя будущих уведомлений о событиях, а привязки бакета R2 предоставят Worker доступ к вашему бакету R2.

{
	"$schema": "./node_modules/wrangler/config-schema.json",
	"name": "event-notification-writer",
	"main": "src/index.ts",
	// Set this to today's date
	"compatibility_date": "2026-08-28",
	"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"
		}
	]
}
"$schema" = "./node_modules/wrangler/config-schema.json"
name = "event-notification-writer"
main = "src/index.ts"
# Set this to today's date
compatibility_date = "2026-08-28"
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

Добавьте queue обработчик к src/index.ts чтобы обрабатывать запись пакетов уведомлений в наш бакет для сбора журналов (вам не нужен обработчик 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`;

		// Serialize the entire batch of messages to JSON
		const fileContent = new TextEncoder().encode(
			JSON.stringify(batch.messages),
		);

		// Write the batch of messages to R2
		await env.LOG_SINK.put(fileName, fileContent, {
			httpMetadata: {
				contentType: "application/json",
			},
		});
	},
} satisfies ExportedHandler<Env>;

7. Развернуть Worker

Чтобы развернуть Worker-получатель, выполните wrangler deploy команда:

npx wrangler deploy

8. Включить уведомления о событиях

Теперь, когда Worker-получатель готов обрабатывать входящие сообщения с уведомлениями о событиях, включите уведомления о событиях с помощью 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

9. Тестирование

Теперь можно протестировать полный сквозной процесс, загрузив объект в example-upload-bucket в панели управления Cloudflare. После загрузки объекта логи появятся в example-log-sink-bucket через несколько секунд.