高木のブログ

Cloudflare R2 を試す

2022/05/13

話題の Cloudflare R2 を試してみた
サービスの詳細等は割愛する

https://developers.cloudflare.com/r2/get-started/

Wrangler のインストールとログイン

Wrangler というコマンドラインツールを使って、R2 の操作や Worker の作成を行う

$ yarn global add wrangler
$ wrangler --version
2.0.3
$ wrangler login

ブラウザが開かれるので、ポチってしたらよい

バケット作成

GUI でもできるが、CLI からバケットの作成をする
sample-bucket という名前のバケットを作成

$ wrangler r2 bucket create sample-bucket
$ wrangler r2 bucket list
[
  {
    "name": "sample-bucket",
    "creation_date": "2022-05-12T13:01:17.947Z"
  },
  {
    "name": "sample-bucket-preview",
    "creation_date": "2022-05-12T13:08:51.542Z"
  }
]

開発環境で動かすためには、本番環境とは別のバケットを用意する必要があるので、別で sample-bucket-preview も作った

Worker の作成

バケットのオブジェクトの操作は基本的に Worker で行う

Worker プロジェクトを作成

$ wrangler init sample-r2

いろいろ聞かれるが全部 y を選択
自然と TypeScript になった

バケットの設定を追記

wrangler.toml
 name = "sample-r2"
 main = "src/index.ts"
 compatibility_date = "2022-05-12"
 
+ [[r2_buckets]]
+ binding = "MY_BUCKET"
+ bucket_name = "sample-bucket"
+ preview_bucket_name = "sample-bucket-preview"

バインディングという機能で、Worker からは MY_BUCKET という名前で R2 にアクセスすることができる

Worker の実装

src/index.ts
interface Env {
  MY_BUCKET: R2Bucket;
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const url = new URL(request.url);
    const key = url.pathname.slice(1);

    switch(request.method) {
      case "PUT":
        await env.MY_BUCKET.put(key, request.body);
        return new Response(`Put ${key} successfully!`);
      case "GET":
        const object = await env.MY_BUCKET.get(key);

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

        return new Response(object.body);
      case "DELETE":
        await env.MY_BUCKET.delete(key);
        return new Response("Deleted!", { status: 200 });
      default:
        return new Response("Route Not Found.", { status: 404 });
    }
  },
};

開発サーバーの起動

$ yarn start

Worker のデプロイ

$ wrangler publish

動作確認

本当は画像をやってみたかったけど、多分ファイルタイプとかいろいろやらないといけないから、テキストファイルで妥協した

アップロード

$ curl -X PUT sample-r2.ytkg.workers.dev/sample.txt --data 'Hello, World!'
Put sample.txt successfully!

取得

$ curl -X GET sample-r2.ytkg.workers.dev/sample.txt
Hello, World!

削除

$ curl -X DELETE sample-r2.ytkg.workers.dev/sample.txt
Deleted!

削除後は取得できなくなる

$ curl -X GET sample-r2.ytkg.workers.dev/sample.txt
Object Not Found.

認証/認可

このままだと誰でもファイルのアップロードや削除ができてしまうので、自分でアクセス制限の仕組みを作る必要がある

Basic認証やカスタムヘッダーでやるっぽい

今回は面倒だったので、やらずに Worker を削除した

リポジトリ

今回作った物を GitHub にあげた

https://github.com/ytkg/sample-r2

参考


ytkg

Written by ytkg, Twitter, GitHub