Open5

Cloudflare R2 メモ

課金体系

https://developers.cloudflare.com/r2/platform/pricing/

無料枠

  • ingress / egress 転送量 無料
  • 10 GB / month
    • 無料容量 10 G
  • Class A Operations 1,000,000 requests / month
    • ListBuckets, PutBucket, ListObjects, PutObject, CopyObject, CompleteMultipartUpload, CreateMultipartUpload, UploadPart, and UploadPartCopy
  • Class B Operations 10,000,000 requests / month
    • HeadBucket, HeadObject, and GetObject
  • Free operations
    • DeleteObject, DeleteBucket and DeleteMultipartUpload.

有料

1 ドル 130 円計算

ストレージ

  • $0.015 / GB-month
    • 1 GB 月 1.95 円
    • これは 30 日間 1 GB のファイルを置きっぱなしにしたときの費用
    • 1 日の場合は課金量は 1 日文のみ

ストレージは、GB月(Gigabyte-Month)を課金指標として課金されます。GB月は、その月に保存された総バイト数を記録することによって計算されます。

オペレーション

  • Class A Operations
    • $4.50 / million requests
    • 100 万リクエスト毎に 585 円
  • Class B Operations
    • $0.36 / million requests
    • 100 万リクエスト毎に 46.8 円

制限

https://developers.cloudflare.com/r2/platform/limits/
  • 1 アカウントでバケットは 1000 個まで
  • バケット毎のデータ数
    • 制限なし
  • 1 アップロード最大サイズ 5 GB
    • S3 と同じ
  • 1 オブジェクトサイズ 5 TB
    • S3 と同じ

最大アップロードサイズは、1つのリクエストでファイルをアップロードする場合、マルチパートアップロードの一部をアップロードする場合、またはマルチパートアップロードの一部にコピーする場合に適用されます。Worker がある場合、その受信リクエスト サイズは Workers limits によって制限されます。最大アップロードサイズの制限は、サブリクエストには適用されません。

利用方法

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

Cloudflare Worker 経由

  • $ wrangler r2 bucket create <YOUR_BUCKET_NAME>
  • wrangler.toml に r2_buckets 項目を追加しバケットを指定する
[[r2_buckets]]
binding = 'MY_BUCKET' # <~ valid JavaScript variable name
bucket_name = '<YOUR_BUCKET_NAME>'
prewview_bucket_name = '<YOUR_PREVIEW_BUCEKT_NAME>'

worker でどう呼ぶのか

  • すごいシンプルな実装
  • 認証/認可は全部自前で実装する
import { Env } from "./bindings.js"

export default {
  async fetch(request: Request, env: Env, context: ExecutionContext): Promise<Response> {
    return handleRequest(request, env);
  }
};

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

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

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

      return new Response(object.body);
    case 'DELETE':
      await MY_BUCKET.delete(key);
      return new Response('Deleted!', { status: 200 });

    default:
      return new Response('Route Not Found.', { status: 404 });
  }
}

認証認可

  • 自前で好きに実装出来る
  • JWT を渡して使えるようにしたりも出来る
  • AUTH_KEY をオブジェクト毎に作ったりもできる
const ALLOW_LIST = ['cat-pic.jpg'];
// Check requests for a pre-shared secret
const hasValidHeader = request => {
  return request.headers.get('X-Custom-Auth-Key') === AUTH_KEY_SECRET;
};

function authorizeRequest(request, key) {
  switch (request.method) {
    case 'PUT':
    case 'DELETE':
      return hasValidHeader(request);
    case 'GET':
      return ALLOW_LIST.includes(key);
    default:
      return false;
  }
}

async function handleRequest(request) {
  const url = new URL(request.url);
  const key = url.pathname.slice(1);

  if (!authorizeRequest(request, key)) {
    return new Response('Forbidden', { status: 403 });
  }
  // ...

S3 との互換性

https://developers.cloudflare.com/r2/platform/s3-compatibility/api/

R2は、ユーザーとそのアプリケーションが簡単に移行できるように、S3 APIを実装しています。AWS S3と比較した場合、CloudflareはいくつかのAPI操作の機能を削除し、他の機能を追加しています。S3 APIオペレーションについて、現在の実装状況を以下に示します。機能の実装は現在進行中です。最新情報はこのページでご確認ください。

S3 互換 API のエンドポイント <account-id>.r2.cloudflarestorage.com も提供される。バケットの作成は Cloudflare にログイン後 R2 から出来る。

作成者以外のコメントは許可されていません