STERFIELD

Cloudflare Workersの実践的サンプルの紹介

Cloudflare Workersの実践的サンプルの紹介

はじめに

Cloudflare Workersの実践的なサンプルコードを事例を交えて紹介します。

すでにCloudflareを利用していてCloudflare Workersのことは知っているが、使い所が分からず手が出せてない方の参考となれば幸いです。

以下で紹介するコードはWebフレームワークの Hono を使って実装しています。Cloudflare Workersにいち早く対応し、シンプルかつ型システムを活用した堅牢なコードが書けるのでおすすめです。

サンプル1: オブジェクトストレージにデプロイしたHTMLにBASIC認証をかける

問題: AWSやGoogle Cloudのようなクラウド事業者が提供しているオブジェクトストレージでWebサイトを構築しているが、そのサイトにBASIC認証をかけたい。

解決方法:WebサイトのネームサーバーをCloudflareに移行した上で、下記のWorkersを作成します。Workersのルート設定を行い、Workers→オブジェクトストレージの流れでリクエストが処理されるように設定します。

import { Hono } from "hono";
import { basicAuth } from "hono/basic-auth";

const app = new Hono<{ Bindings: CloudflareBindings }>();

app.all("*", basicAuth({ username: "username", password: "password" }), (c) => {
  return fetch(c.req.url);
});

export default app;

サンプル2: ルールにそってURLを書き換えてリダイレクトする

問題:複数のサブドメインにわかれているシステムを運用しているが、外部のシステムと連携するにあたって、連携先のドメインが1つしか登録できない。

解決方法:下記のWorkersを作成してカスタムドメイン設定を行い、そのドメインを外部連携先として利用します。このサンプルコードでは、URLを加工してリダイレクトしていますが、マッピング表をコード上に持つようにしたり、外部に保存したマッピングを参照してリダイレクトすることも可能です。

import { Hono } from 'hono';

const app = new Hono();
const domain = "example.com";

app.get('/:subdomain/', (c) => {
	const { subdomain } = c.req.param();
	const url = `https://${subdomain}.${domain}/`;
	return c.redirect(url);
});

export default app;

使用例:

https://redirect.example.com/aaa/ => https://aaa.example.com/
https://redirect.example.com/bbb/ => https://bbb.example.com/

サンプル3: APIとして使える簡易的なKVS

問題:一時的なデータの保存場所としてMemcachedやRedisのようなKVSが必要になったが、サーバーを立ち上げたりクラウド上のサービスを使うとなると費用がかかるので、お金がかからない方法で検証までは行いたい。

解決方法:Cloudflare Workersに付随するサービスであるCloudflare Workers KV(以下KV)を使ってデータの保存と読み取りを行うWorkersを作成します。事前にKVの名前空間の作成を行います。その後、下記のコードのWorkersを作成してデプロイします。

import { Hono } from "hono";

export interface Bindings {
  kvs: KVNamespace;
}

const app = new Hono<{ Bindings: Bindings }>();

app.post("/set/:key", async (c) => {
  const key = c.req.param("key");
  const obj = await c.req.json();

  await c.env.kvs.put(key, JSON.stringify(obj));

  return c.json({});
});

app.get("/get/:key", async (c) => {
  const key = c.req.param("key");
  return c.json(JSON.parse((await c.env.kvs.get(key)) || "{}"));
});

export default app;

使用例:

$ curl -X POST -H "Content-Type: application/json" -d '{"Name":"aaaa", "Age":"100"}' https://kvs-sample.****.workers.dev/set/123
{}

$ curl https://kvs-sample.****.workers.dev/get/123
{"Name":"aaaa","Age":"100"}

まとめ

今回紹介したサンプルはすべて無料プランのCloudflareアカウントでも利用可能です。是非気軽に試してみてください。

参考リンク

Author Profile

著者近影

ARIKAWA

バックエンドエンジニアです。 自転車が好きです。

SHARE

合わせて読みたい