🧨Cloudflare Workers アプリをRubyで書くフレームワークを作った
どんなフレームワーク?
Cloudflare WorkersのアプリをRubyで書くためのフレームワークです。
Cloudflare Workers 向けのアプリをRubyで、それもHonoみたいな洗練されたシンプルな構文で書きたかったから作りました。
フレームワークの名前はとりあえず Hibana にしました。
hiroeorz/hibana
内部で使ってるプロジェクトテンプレートはこちら
hiroeorz/cloudflare_workers_ruby_template
たとえばこんな感じで書きます。
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 を編集します。
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