お金をかけずにサーバーの勉強をしよう

Wasm Workers Server インストール

2023年3月10日

メニューへ戻る

Wasmのサーバー? よく分かりませんが入れてみました。

ホンの2年前くらいからだったと思いますが、ウェブブラウザ内のサンドボックスでローカルネイティブコードを実行する WebAssemblyというのを目にするようになりました。

WebAssembly = WASM という文脈で語られる事が多くなってきたようですので、以降は WASMと書きます。

WASMは新しい開発言語ではなく、既存の開発言語のコードをそのまま WEBブラウザで実行する環境と捉えています。

そのプログラム自体と実行用のランタイムライブラリを共にサーバーから Web経由で配信するようになっています。

Webクライアントには、そこの OS上のネイティブコードに近い実行環境があり、高速動作する…とは聞いています。

その仕組みを見ると、今は亡き Java Appletを連想するのですが、最新技術ですのできっと大変に洗練されたものになっているのでしょう。

私は .NETで作れるようになった、Blazor WebAssembly というプロジェクト形態で初めて動くものを体験したのですが、最近では WebAssembly版の PostgreSQLデータベースやらが界隈を賑わしています。
これからの Webアプリ周りで上がってくるモノの一つになるのは間違いないと思います。


私がよく拝見している最新技術情報ブログの Plublic Key 殿の、2023年3月9日のエントリで、Wasm Workers Server なるものを知ることとなりました。

オープンソースのWebAssemblyサーバレス基盤「Wasm Workers Server 1.0」正式リリース。RubyとPythonのWASMランタイムに対応し、Ruby/Pythonでの記述が可能に

そこに記されているリンクはこちら。
Wasm Workers Server

「サーバーレスファンクションを提供するフレームワーク」と言っていてここからしてよく分からんのですが、OSに囚われないマルチプラットフォームの Webサーバーを作れる…と言ってるように思います。

「でもサーバーレスのサーバープログラムって何?」と思うので、どこで動かすことを念頭に置いているのか。

ドキュメントには「AWS Lambdaに似たもの」とか「Deno Deployのような環境」と書いてありますので、以下のような感じなのかと。

よく分かってませんが、勝手にこう理解しました。

こちらに導入手順がありますので、これに従って入れてみます。
Quickstart

環境は Ubuntu Server 22.04.2を使っています。


curlコマンドでインストールスクリプトをダウンロードして、パイプ bashに渡して実行しています。

subro@UbuntuServer2204-1:~$ curl -fsSL https://workers.wasmlabs.dev/install | bash
👋 Hello
I'm going to install Wasm Workers Server in your system

⚙  Downloading
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 10.6M  100 10.6M    0     0  2139k      0  0:00:05  0:00:05 --:--:-- 3104k
⚙  Decompressing
./
./README.md
./wws
./LICENSE
⚙  Installing
Wasm Workers Server will be installed in /usr/local/bin.
This requires sudo permissions. If you prefer to install it
in your current directory, run the installer with --local.
If you want it to be global, just type your password:
[sudo] subro のパスワード: パスワード
🧹 Cleaning up
🚀 Wasm Workers Server (wws) was installed correctly!
You can now try it: wws --help

最近流行りのようにインストールしようとしているユーザーのホームディレクトリ下に入るのかと思っていましたが、/usr/local/binに入るようで、sudoするためにパスワードを聞かれましたね。

/usr/local/binを見てみると

subro@UbuntuServer2204-1:~$ ls -l /usr/local/bin
合計 32420
-rwxr-xr-x 1 subro subro 33195336  3月  9 04:57 wws

wwsコマンド(これがサーバープログラムの本体のようです)だけ、ここに入っています。
ただユーザーとグループはちょっといただけない…。

とりあえずインストールは完了です。


上のドキュメントに沿って進めていくと、JavaScriptのプログラムを動かす例がありますのでやってみます。
ワーキングディレクトリとして、~/work/wws に移っています。

subro@UbuntuServer2204-1:~/work/wws$ curl https://raw.githubusercontent.com/vmware-labs/wasm-workers-server/main/examples/js-basic/index.js -o ./index.js
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1439  100  1439    0     0   3288      0 --:--:-- --:--:-- --:--:--  3285

subro@UbuntuServer2204-1:~/work/wws$ ls -l
合計 4
-rw-rw-r-- 1 subro subro 1439  3月 10 14:58 index.js

index.jsというファイルがダウンロードされてきました。
内容は関数呼び出し元に HTMLのテキストを返すようなものです。

実行します。
GUIのないサーバーで動かしているので、クライアントからアクセスできるよう[--host 0.0.0.0]を追加しました。

subro@UbuntuServer2204-1:~/work/wws$ wws --host 0.0.0.0 .
⚙  Loading routes from: .
🗺  Detected routes:
    - http://0.0.0.0:8080/
      => ./index.js (name: default)
🚀 Start serving requests at http://0.0.0.0:8080

8080/tcpで待ち受けているようですので、WEBブラウザでアクセスしてみます。
Wasm Workers Serverの例題

URLはファイルシステムルーティングに依るとドキュメントにありましたが、特に index.js というファイルを指定していません。
カレントディレクトリにある「index」という名のファイルに反応しているのでしょうか。

ドキュメントを読み進めていくと、wws内で発生する「fetch」というイベントをリスニングしていて、同イベントが発生した際にレスポンスを返す関数が実行されていました。

2つ以上のスクリプトが同じイベントに対してレスポンスを発生させるとどうなるのかは分かりませんでした。


どのような言語がサポートされているか(どの言語のWebAssemblyランタイムライブラリがあるか)はコマンドでリストを取れるようです。
既にインストールされているランタイムライブラリはこれ。

subro@UbuntuServer2204-1:~/work/wws$ wws runtimes check
┌───────────┬──────┬─────────┬──────┬───────────┬────────┐
│ Installed │ Name │ Version │ Tags │ Extension │ Binary │
└───────────┴──────┴─────────┴──────┴───────────┴────────┘

💡 Tip: you can check the available language runtimes by running `wws runtimes list`

何も入っていないようです。
JavaScriptはランタイムが無くても行けるのかな…?

インターネット上のリポジトリからインストールできるのはこれら。

subro@UbuntuServer2204-1:~/work/wws$ wws runtimes list
⚙  Fetching data from the repository...
┌────────┬─────────────────┬──────────────────────┬───────────┬─────────────┐
│ Name   │ Version         │ Tags                 │ Extension │ Binary      │
├────────┼─────────────────┼──────────────────────┼───────────┼─────────────┤
│ ruby   │ 3.2.0+20230215  │ latest, 3.2, 3.2.0   │ rb        │ ruby.wasm   │
├────────┼─────────────────┼──────────────────────┼───────────┼─────────────┤
│ python │ 3.11.1+20230217 │ latest, 3.11, 3.11.1 │ py        │ python.wasm │
└────────┴─────────────────┴──────────────────────┴───────────┴─────────────┘

2023年3月10日現在は、Rubyと Python だけのようです。

Rustはコンパイル言語なのでランタイムは必要なく、WASM用にコンパイルしたものを配置するみたいですね。
Rust


ちょっとイジってみたらこんな感じでしたがいかがでしょうか。

C#でやる場合は Rustの例と同じようにするのかな?と思いますけど、WebAssemblyの .NETランタイムはどうすりゃ良いのかまでは分かってません。

私はサーバーレスの分散処理の効果自体が捉えきれてないのでいまいち理解が覚束ないですが、分かる人には何か大きなメリットが感じられるんでしょうね。

この感じだと、ファンクション毎にコンテナを立ち上げて、連携させる感じになるんだと思います。
Kubernetesのような環境と相性が良いのではないかと思いました。

JavaEE(現在はJakertaEEか)と競合する技術になるのかなぁ…。
思想は似ている気がしますが、こちらの方がインターフェイスが随分とシンプルな分、覚えやすいのでしょう。

今後の動静を見ておかなきゃって思う技術がまた1つ増えてしまった感じです。