← Cloudflare Workers / workers / tutorials
Безопасный доступ к ресурсам и их загрузка с помощью Cloudflare R2
В этом руководстве показано, как создать проект Cloudflare Workers на TypeScript, который может безопасно получать доступ к файлам и загружать файлы в Cloudflare R2 бакет. Cloudflare R2 позволяет разработчикам хранить большие объемы неструктурированных данных без высокой платы за исходящий трафик, характерной для типичных облачных хранилищ.
Предварительные требования
Чтобы продолжить:
- Зарегистрируйтесь для получения Аккаунт Cloudflare ↗ если вы ещё этого не сделали.
- Установка
npm↗. - Установка
Node.js↗. Используйте менеджер версий Node, например Volta ↗ или nvm ↗ чтобы избежать проблем с правами доступа и переключать версии Node.js. Wrangler требует версии Node16.17.0или более поздней версии.
Создайте приложение Worker
Сначала используйте create-cloudflare CLI ↗ чтобы создать новый Worker. Для этого откройте окно терминала и выполните следующую команду:
npm create cloudflare@latest -- upload-r2-assetsДля настройки выберите следующие параметры:
- Для С чего вы хотите начать?, выберите
Hello World example. - Для Какой шаблон вы хотите использовать?, выберите
Worker only. - Для Какой язык вы хотите использовать?, выберите
TypeScript. - Для Хотите использовать git для контроля версий?, выберите
Yes. - Для Хотите развернуть приложение?, выберите
No(мы внесём некоторые изменения перед развёртыванием).
Перейдите в только что созданный каталог:
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.