Cloudflare WorkerdをBazelでビルドして動かしてみる

2022.10.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Introduction

先日、CloudflareはCloudflare Workersと同じコードに基づく
JavaScript/Webassemblyランタイム、「workerd」(worker deeとよむそうな)
のベータ版をリリースしました。

本稿ではworkerdをビルドしてサンプルを動かしてみます。

workerd?

JavaScript/Webassemblyのランタイムです。
workerdを使うことで、
Cloudflare Workersで実行するアプリケーションをセルフホストできます。
すでにwranglerには、wrangler dev時にworkerdで動くモードも組み込まれてます。
(いままではMiniflareで動いてた)
同じランタイムで動くほうが正確にシュミレートできるのは明白なので、
そのうち完全にworkerdに置き換わると思われます。

Environment

今回使用する環境です。

  • OS :  MacOS 12.4

Setup

workerdを動かすのは簡単です。
npm/yarnでインストールするだけでも動くのですが、
ここではBazelを使ってビルドしてみましょう。
※BazelはGoogle製のビルドツール

BazelをHomebrewでインストールします。
bazelコマンドが実行できればOKです。

% brew install bazel

% bazel --version
bazel 5.3.0-homebrew

workerdのリポジトリをcloneしてBazelでビルドします。

% git clone https://github.com/cloudflare/workerd.git
% cd workerd

#けっこう時間がかかる
% bazel build -c opt //src/workerd/server:workerd

ビルドが成功するとbazel-bin/src/workerd/server以下にworkerdモジュールができます。
また、samplesディレクトリ以下にはそのまま動作確認できるプログラムがあるので、
動かしてみましょう。
samples/helloworldにあるconfig.capnpがworkersの設定を記述するファイルです。

#config.capnp

using Workerd = import "/workerd/workerd.capnp";

const helloWorldExample :Workerd.Config = (
  services = [ (name = "main", worker = .helloWorld) ],
  sockets = [ ( name = "http", address = "*:8080", http = (), service = "main" ) ]
);

const helloWorld :Workerd.Worker = (
  serviceWorkerScript = embed "worker.js",
  compatibilityDate = "2022-09-16",
);

WorkerScriptはworker.js、サーバは8080番ポートで起動する旨が設定されてます。
worker.jsではfetchイベントを設定してHelloWorldを返してます。

addEventListener('fetch', event => {
  event.respondWith(handle(event.request));
});

async function handle(request) {
  return new Response("Hello World\n");
}

workerd serveコマンドでサーバを起動。
コンソールには何もでませんが、起動してます。

% bazel-bin/src/workerd/server/workerd serve samples/helloworld/config.capnp

localhost:8080にアクセスするとレスポンスが返ってきます。

% curl http://localhost:8080
Hello World

Summary

まだβ版でかなり荒削りな部分が多いですが、
ローカルでより正確なworkersの動作を確認できるのは便利です。
また、プログラマブルなプロキシとしても想定されているようなので、
いろいろ使えるのではないでしょうか。

References