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

Безопасный доступ к ресурсам и их загрузка с помощью Cloudflare R2

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

Предварительные требования

Чтобы продолжить:

  1. Зарегистрируйтесь для получения Аккаунт Cloudflare если вы ещё этого не сделали.
  2. Установка npm.
  3. Установка Node.js. Используйте менеджер версий Node, например Volta или nvm чтобы избежать проблем с правами доступа и переключать версии Node.js. Wrangler требует версии Node 16.17.0 или более поздней версии.

Создайте приложение Worker

Сначала используйте create-cloudflare CLI чтобы создать новый Worker. Для этого откройте окно терминала и выполните следующую команду:

npm create cloudflare@latest -- upload-r2-assets

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

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

cd upload-r2-assets

Создайте бакет R2

Прежде чем добавить доступ к R2 bucket в приложение Worker, необходимо создать R2 bucket:

npx wrangler r2 bucket create <YOUR_BUCKET_NAME>

Замените <YOUR_BUCKET_NAME> именем, которое вы хотите присвоить бакету. Выведите список бакетов R2 вашего аккаунта, чтобы убедиться, что новый бакет добавлен:

npx wrangler r2 bucket list

Настройка доступа к бакету R2

После того как новый бакет R2 будет готов, используйте его в своём Worker-приложении.

Используйте свой R2 bucket в проекте Worker, изменив конфигурационный файл Wrangler чтобы подключить бакет R2 привязка. Добавьте следующую привязку R2 bucket в файл Wrangler:

{
	"r2_buckets": [
		{
			"binding": "MY_BUCKET",
			"bucket_name": "<YOUR_BUCKET_NAME>"
		}
	]
}
[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "<YOUR_BUCKET_NAME>"

Укажите имя привязки для бакета R2. Замените <YOUR_BUCKET_NAME> именем бакета R2, который вы создали ранее.

Теперь приложение Worker может обращаться к вашему бакету R2 с помощью MY_BUCKET переменную. Теперь вы можете выполнять операции CRUD (создание, чтение, обновление, удаление) с содержимым бакета.

Получение из бакета R2

После настройки привязки к бакету R2 вы реализуете функциональность, позволяющую Worker взаимодействовать с бакетом R2, например получать файлы из бакета и загружать файлы в него.

Чтобы получить файлы из бакета R2, используйте BINDING.get функция. В примере ниже привязка бакета R2 называется MY_BUCKET. Используя .get(key), вы можете получить ресурс по пути URL, используемому в качестве ключа. В этом примере путь URL, это /image.png, а ключ ресурса равен image.png.

interface Env {
	MY_BUCKET: R2Bucket;
}
export default {
	async fetch(request, env): Promise<Response> {
		// For example, the request URL my-worker.account.workers.dev/image.png
		const url = new URL(request.url);
		const key = url.pathname.slice(1);
		// Retrieve the key "image.png"
		const object = await env.MY_BUCKET.get(key);

		if (object === null) {
			return new Response("Object Not Found", { status: 404 });
		}

		const headers = new Headers();
		object.writeHttpMetadata(headers);
		headers.set("etag", object.httpEtag);

		return new Response(object.body, {
			headers,
		});
	},
} satisfies ExportedHandler<Env>;

Приведённый выше код получает и возвращает данные из бакета R2, когда GET запрос к приложению Worker выполняется по определённому пути URL.

Безопасно загружайте в бакет R2

Затем добавьте возможность загрузки в R2 bucket с аутентификацией. Чтобы безопасно аутентифицировать запросы на загрузку, используйте Возможности Wrangler для работы с секретами. Wrangler был установлен при выполнении команды create cloudflare@latest команда.

Создайте произвольное секретное значение, например случайную строку или пароль. С помощью Wrangler CLI добавьте этот секрет в проект как AUTH_SECRET:

npx wrangler secret put AUTH_SECRET

Теперь добавьте новый путь выполнения кода, который обрабатывает PUT HTTP-запрос. Новый код проверит, что ранее загруженный секрет корректно используется для аутентификации, а затем выполнит загрузку в R2 с помощью MY_BUCKET.put(key, data):

interface Env {
	MY_BUCKET: R2Bucket;
	AUTH_SECRET: string;
}
export default {
	async fetch(request, env): Promise<Response> {
		if (request.method === "PUT") {
			// Note that you could require authentication for all requests
			// by moving this code to the top of the fetch function.
			const auth = request.headers.get("Authorization");
			const expectedAuth = `Bearer ${env.AUTH_SECRET}`;

			if (!auth || auth !== expectedAuth) {
				return new Response("Unauthorized", { status: 401 });
			}

			const url = new URL(request.url);
			const key = url.pathname.slice(1);
			await env.MY_BUCKET.put(key, request.body);
			return new Response(`Object ${key} uploaded successfully!`);
		}

		// include the previous code here...
	},
} satisfies ExportedHandler<Env>;

Такой подход гарантирует, что доступ получат только клиенты, предоставившие действительный bearer-токен через Authorization заголовок, равный AUTH_SECRET значение, получит разрешение на загрузку в бакет R2. Если вы использовали другое имя привязки, отличное от AUTH_SECRET, замените его в коде выше.

Разверните приложение Worker

После завершения работы над проектом Cloudflare Worker разверните его в Cloudflare. Убедитесь, что вы находитесь в каталоге Worker-приложения, созданном для этого руководства, затем выполните:

npx wrangler deploy

Ваше приложение теперь доступно по адресу <YOUR_WORKER>.<YOUR_SUBDOMAIN>.workers.dev.

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

Следующие шаги

Чтобы узнать больше о работе с R2 и Workers, см. Руководства и Документация R2.

Если у вас есть вопросы, нужна помощь или вы хотите поделиться своим проектом, присоединяйтесь к сообществу разработчиков Cloudflare на Discord чтобы пообщаться с другими разработчиками и командой Cloudflare.