😊

WebAssembly入門とコンピューティング基盤としての可能性

2022/12/01に公開
2

これは2022年Aidemy社のアドベントカレンダー1日目の記事です。

はじめに

WebAssembly(以下Wasm)といえばブラウザ上で高速に動くプログラム...程度の認識でした。

ところがよく調べてみると、fastlyやvercelがエッジロケーションでの実行環境を提供し始め、KrustletなどWasmをPodとして稼働させる動きもあり、ブラウザに閉じた話ではないということに驚きました。

実際にOpen Source SummitでコンテナとWasmを組み合わせたオーケストレーションのデモも為されており、コンテナよりも軽量なFaaSやマイクロサービスとしての活用が目指されている動きがあると知りました。
気になって夜も眠れないため調べてみたことをまとめました。

(WebAssembly初心者なので、誤りなどがあればコメントで訂正いただきたいです)

WebAssemblyとは何か

Wasmは共通バイナリフォーマットの仕様で、ランタイム実装さえあれば様々な環境での動作が可能となります。
コンパイル元言語はRust, C/C++, AssemblyScript, TinyGoなどがあり、門戸は広いように感じます。
元々はJavaScriptの性能限界を突破するためにブラウザ上でバイナリを実行するのが主な用途で、TensorFlow.jsPostgreSQLをブラウザで動作させるのに使われていたりします。

The WebAssembly System Interface

The WebAssembly System Interface(以下WASI)はWasmがホストのハードウェア資源にアクセスするためのAPIを規格化しているものです。
Wasmでクラウドサービスをハードウェアリソースのように使う
SpiderLightningなど、とても面白そうなプロダクトも現れました。

しかし、まだまだ道半ばのようで、完全に定着するまでの道のりは長そうです。

この記事の執筆時点では全てのAPIがPhase2以下となっており、通信の要となるHTTPやgRPC、CryptoなどはPhase1です。

Phase1, 2の温度感はこんな感じです。
正確な情報はWebAssembly W3C Processをご一読ください。

Phase1
Community Group(以下CG)のみが存在し、Working Group(以下WG)は存在しない。
CG内で議論がすすみ、提案前投票(その機能が目的のスコープ内であり実現可能か問う投票)で合意を得られている。
独自のリポジトリを立ち上げ、その中で機能設計を練っている最中。
プロトタイプ実装を使った実験をする場合もある。

Phase2
独自のリポジトリを立ち上げ、英語の提案書が存在する。
正式な記法、テストスイート、リファレンスインタプリタへの更新は不要。

WasmEdgeを試す

今回はWasmEdgeでの実装を試してみます。

使用環境

  • macOS Monterey v12.5.1
  • Apple M1 Pro

homebrewで入れるとrustupとcargoの間に参照先のパスに食い違いが起きてコンパイルできませんでした。
そのためbrewを経由せずにインストールしています。

EasmEdgeのGetting Startedに従ってビルド

$ rustup target add wasm32-wasi
$ cargo build --target wasm32-wasi

サンプルコードを試してみましょう。
(中身はサンプル実装の丸パクリです)

$ curl -X POST http://127.0.0.1:1234 -d "name=WasmEdge"
curl: (52) Empty reply from server
 $ wasmedge target/wasm32-wasi/release/app.wasm
new connection at 1234
Error: Os { code: 52, kind: Unsupported, message: "Function not implemented" }

がっくし...

stable最新版のrust1.65でもネットワーク周りのWASIが実装されていないものも多いみたいです...涙

感想

ポータビリティに無限の可能性は感じつつも、コンテナのようなスタンドアローンで機能するアプリケーションの実現への道のりはまだまだかかりそうだと感じました。
一方でWASIに依存しない純粋な関数として、様々な環境やプログラムで使いまわせるのはかなり魅力的ではあるので、成熟を待ちつつも少しずつ使って慣れていきたいなと思います。
(プラグイン的に使うならエッジコンピューティングやFaaSの基盤としては十分な気もしますし、結構近いうちに大きな発展に期待できますね)

Aidemy Tech Blog

Discussion

KJKJ

WebAssemblyはC#のBlazorが一番情報多くて充実してますね