🔥

🧨Cloudflare Workers アプリをRubyで書くフレームワークを作った

に公開

どんなフレームワーク?

Cloudflare WorkersのアプリをRubyで書くためのフレームワークです。
Cloudflare Workers 向けのアプリをRubyで、それもHonoみたいな洗練されたシンプルな構文で書きたかったから作りました。

フレームワークの名前はとりあえず Hibana にしました。
hiroeorz/hibana

内部で使ってるプロジェクトテンプレートはこちら
hiroeorz/cloudflare_workers_ruby_template

たとえばこんな感じで書きます。

app/app.rb
get "/" do |c|
  c.text("Hello from Ruby WASM")
end

上のように書いてサーバーを立ち上げ、ブラウザから http://localhost:8787/にアクセスすると、Hello from Ruby WASM と表示されます。

注意点

Hibanaで作ったRubyアプリをCloudflare Workersにデプロイするには、Cloudflare Workers で有料プラン(月額5ドル)に加入している必要があります。

HibanaはRubyアプリをCloudflare Workersで動作させるために内部でRuby WASM(WebAssembly)を使っており、Ruby WASMを含むアプリのサイズが、圧縮後であっても9MB程度あるからです。
Cloudflare Workersは無料では3MBまで、有料なら10MBまで使えるため、月額5ドルの有料契約をしていればデプロイ可能です。

新規プロジェクトの作成

新規プロジェクトを作るときは以下のコマンドで作成します。

npm create hibana@latest <project-name>

Ok to proceed? (y) と聞いてきたらyと入力。

プロジェクト作成後は、プロジェクトのルートに移動して初期セットアップをします。

cd hoge-app
npm install

app/app.rb を編集します。

app/app.rb
get "/" do |c|
  c.text("Hello from Ruby WASM")
end

get "/hoge" do |c|
  c.text("Hello Hoge!")
end

開発サーバーの起動

wrangler dev

ブラウザで http://localhost:8787/ にアクセス。

Cloudflareの他サービスとの連携

D1などのCloudflareサービスはWebAssemblyから直接実行することはできません。
なので、予めTypeScript側で低レベルの関数を用意しておき、RubyからTypeScriptの関数を実行し返り値を再びRubyで受け取ることで連携を実現しています。

D1との連携

Cloudflare WorkersにはD1というRDBサービスがあり、データの保存や参照ができます。
Hibana からもこれらの機能を使えます。

db = c.env(:DB)
result = db.prepare("SELECT * FROM posts WHERE id = ?").bind(1).first

KVとの連携

kv = c.env(:MY_KV)

# 保存
kv.put("my-key", "This is Value")

# 参照
kv.get("my-key") # => "This is Value"

R2との連携

S3互換のオブジェクトストレージR2とも連携できます。

bucket = c.env(:MY_R2)

# 保存
bucket.put("my-key", "Hello from R2 sample!")

# 参照
bucket.get("my-key").text # => "Hello from R2 sample!"

その他の連携

DurableObjectやWorkersAI との連携はまだ未実装です。

デプロイ

事前にwrangler loginしてあればデプロイは以下のコマンド一発です。

wrangler deploy

ソースコード

Hibanaは npm create hibana@latest <project-name> したときに生成されるアプリのテンプレートと、hibanaコマンドを提供するツールの2つから構成されます。

テンプレート
hiroeorz/cloudflare_workers_ruby_template

hibanaコマンド
hiroeorz/hibana

実行速度

実行速度はまだ計測していませんが遅いと思います。理由としてRubyアプリをCloudflare Workersで動かすために内部でRuby WASMを含む必要が有るため、TS/JSであればV8上で直接実行できるのに対して、HibanaではまずRuby WASMをロードし、その上でRubyのプログラムを実行するからです。

現時点では体感できるほどの遅延はありませんが、詳細な計測は今後行います。

今後

今はまだとりあえず動くというレベルですので、今後はWorkers AI や DurableObjectとの連携も実装していきたいです。まったりやっていきます。

Discussion