明けましておめでとうございます。
Uzumibi (埋み火)と言う、あらゆるエッジでRubyを動かすためのウェブフレームワークを作っています。この度RC版を出したので使い方を共有します。
What is Uzumibi
Uzumibi は各種エッジコンピューティングサービスでRubyのアプリケーションを動かしたい時に使うフレームワークです。
詳細はこういう雰囲気です。
- ひとまず、 Cloudflare Workers、Fastly Compute、Spin(Fermyon Cloud)をサポートした*1
- Rubyランタイムは mruby/edge を利用(なのでまだそもそも機能が少ない...)
- mruby/edgeを丸っと含んだWebAssemblyバイナリを作って動かします
mruby/edge 自体については、2024年に発表していました。当時はこれはRubyと言えるか怪しかったのですが、その後色々改善し、2年かけて応用例を公開できてよかったです。
ところで同じく日本語で炎っぽい...名前の...各種エッジで動くフレームワークがありますが、若干は影響を受けてるかもしれません*2。
install
$ cargo install uzumibi-cli@0.1.0-rc3
もうRC3になっていますが気にしないでください。
動かしてみよう
uzumibi というコマンドが入るので、なんでもいいんですが、 uzumibi new --template fastly project-name とでも実行しましょうか。
$ uzumibi new --template fastly test-project-1
Creating project 'test-project-1'...
generate test-project-1/.fastlyignore
generate test-project-1/.gitignore
generate test-project-1/Cargo.toml
generate test-project-1/build.rs
generate test-project-1/fastly.toml
generate test-project-1/rust-toolchain.toml
generate test-project-1/.cargo/config.toml
generate test-project-1/lib/app.rb
generate test-project-1/src/lib.rs
generate test-project-1/src/main.rs
✓ Successfully created project from template 'fastly'
Run 'cd test-project-1' to get started!
Next steps:
0. Install required tools (if not installed):
• Rust & Cargo:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
• Fastly CLI:
brew install fastly/tap/fastly
Or visit: https://www.fastly.com/documentation/reference/tools/cli/
1. Build the project:
fastly compute build
2. Start local development server:
fastly compute serve
3. Deploy to Fastly:
fastly compute deploy
• After trying to bootstrap, edit lib/app.rb to develop your custom application
ファイルを一通り作ってくれて、インストラクションも表示してくれます。その通りに fastly コマンドを入れて fastly compute build && fastly compute serve ってやるとdevサーバが立ち上がります。
$ fastly compute serve ✓ Verifying fastly.toml ✓ Identifying package name ✓ Identifying toolchain ✓ Running [scripts.build] ✓ Creating package archive SUCCESS: Built package (pkg/test-project-1.tar.gz) ✓ Running local server INFO: Command output: -------------------------------------------------------------------------------- 2025-12-31T15:38:42.118657Z INFO checking if backend 'uzumibi' is up 2025-12-31T15:38:42.120151Z WARN backend 'uzumibi' on 'http://localhost:7676/' is not up right now 2025-12-31T15:38:42.120194Z INFO Listening on http://127.0.0.1:7676 ---- $ curl http://localhost:7676/ It works!
その後は、 lib/app.rb を編集して自分のエッジアプリケーションを作ることができます。
基本的に、プロジェクトに関してRuby以外のところは触る必要はありません。Rubyだけ書いたらエッジでアプリを公開できます。
テンプレートは他にも cloudflare spin を用意しています。中には無料枠のあるプラットフォームもあるので、試しやすいかなと思います。
ちなみに、今のところ、作られるバイナリも比較的小さく。各種制限がそこまで心配になる規模じゃないかなと思います。
# for cloudflare ただしJSなどを除外 -rwxr-xr-x 1 udzura staff 335K 1月 1 12:07 ./target/wasm32-unknown-unknown/release/cf_test.wasm # for fastly -rwxr-xr-x 1 udzura staff 1.6M 1月 1 12:06 ./target/wasm32-wasip1/release/fs-test.wasm # for spin -rwxr-xr-x 1 udzura staff 509K 1月 1 12:09 ./target/wasm32-wasip1/release/spin_test.wasm
同じRubyのコードが色々なエッジプラットフォームで動く
さて、複数のプラットフォームに対応したフレームワークということで、テンプレートこそそれぞれに特化したものを生成しますが、コアとなる lib/app.rb を見てみるとこういう感じです。
class App < Uzumibi::Router get "/" do |req, res| res.status_code = 200 res.headers = { "content-type" => "text/plain", "x-powered-by" => "#{RUBY_ENGINE} #{RUBY_VERSION}" } res.body = "It works!\n" res end end $APP = App.new
これは、初期では上記の3つのプラットフォームで全く同じものを生成します。全く同じコードが3つのプラットフォームで動きます。プラットフォーム固有の色々はそのうち対応しますが、基本的なAPIは共通のものとして、それだけ覚えればアプリケーション開発ができるようになるというのが狙いです。
というか、ご覧の通り Sinatra 風のAPIになっていますし、実際今後の機能もそういう雰囲気になると思いますので*3、Rubyistなら速攻でエッジアプリ開発ができるって感じになる予定です。
ただ、この記事を書いた時点で get しかサポートしてないんですが...
まああとは実装するだけですんで、色々と。パラメータとかもまだない。
絶賛開発中です
RC と言いつつmruby/edgeもUzumibi自体も激しくバグだらけで、実際なんか知らんけどヘッダが壊れる現象とかを観測しています。適宜直してから、というのと、そもそもWAFとしてもあまりに機能が足りないので一通りなんとかしてからRCを外します。RCじゃなくてPoCなんだと思います。
シュッと遊ぶ分には今すぐでもできるので、お暇ならぜひ...。
ところで。
2026年は Haconiwa の公開10周年
だったのです!個人的に RubyKaigi で初めて登壇してからも10年です。
コンテナの使われ方やエコシステムも変わり、すっかりHaconiwaの開発は止まってしまいましたが、今年はUzumibiをよろしくお願いします。
最後に、以下は完全にどうでもいい話ですが。
HaconiwaもUzumibiもゼロ年代の日本のアンダーグラウンドインディーズバンドに由来しています。
ということで良いお年をお過ごしください。