ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

Uzumibi: あらゆるエッジでRubyを動かすために

明けましておめでとうございます。

Uzumibi (埋み火)と言う、あらゆるエッジでRubyを動かすためのウェブフレームワークを作っています。この度RC版を出したので使い方を共有します。

github.com

What is Uzumibi

Uzumibi は各種エッジコンピューティングサービスでRubyのアプリケーションを動かしたい時に使うフレームワークです。

詳細はこういう雰囲気です。

  • ひとまず、 Cloudflare WorkersFastly ComputeSpin(Fermyon Cloud)をサポートした*1
  • Rubyランタイムは mruby/edge を利用(なのでまだそもそも機能が少ない...)
  • mruby/edgeを丸っと含んだWebAssemblyバイナリを作って動かします

mruby/edge 自体については、2024年に発表していました。当時はこれはRubyと言えるか怪しかったのですが、その後色々改善し、2年かけて応用例を公開できてよかったです。

rubykaigi.org

ところで同じく日本語で炎っぽい...名前の...各種エッジで動くフレームワークがありますが、若干は影響を受けてるかもしれません*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になっていますし、実際今後の機能もそういう雰囲気になると思いますので*3Rubyistなら速攻でエッジアプリ開発ができるって感じになる予定です。

ただ、この記事を書いた時点で get しかサポートしてないんですが...

まああとは実装するだけですんで、色々と。パラメータとかもまだない。

絶賛開発中です

RC と言いつつmruby/edgeもUzumibi自体も激しくバグだらけで、実際なんか知らんけどヘッダが壊れる現象とかを観測しています。適宜直してから、というのと、そもそもWAFとしてもあまりに機能が足りないので一通りなんとかしてからRCを外します。RCじゃなくてPoCなんだと思います。

シュッと遊ぶ分には今すぐでもできるので、お暇ならぜひ...。

ところで。

2026年は Haconiwa の公開10周年

だったのです!個人的に RubyKaigi で初めて登壇してからも10年です。

github.com

コンテナの使われ方やエコシステムも変わり、すっかりHaconiwaの開発は止まってしまいましたが、今年はUzumibiをよろしくお願いします。

最後に、以下は完全にどうでもいい話ですが。

HaconiwaもUzumibiもゼロ年代の日本のアンダーグラウンドインディーズバンドに由来しています。

www.youtube.com

ということで良いお年をお過ごしください。

*1:Fermyonがついこの間Akamaiに買われたので、結果的に3大CDNをサポートしてるみたいになった

*2:Hono + Embedded で Uzumibi というのも由来の一つではある

*3:そのうちRackのようなレイヤも入れたいなあ...〜〜