用語解説
WebAssembly
- スタックベースの仮想マシン用のバイナリ命令フォーマット
- しばしば拡張子が .wasm であるバイナリファイルのことを指す
- それ自体は実行ファイルではなく、Wasmランタイムに読み込ませて動作する
- ランタイムの例:主要なブラウザ、Wasmtime など
- WebAssembly が使われているケース
- ブラウザ上: Figma, Photoshop, Unity, Google Meet etc
- ブラウザ外(Wasi): エッジコンピューティング, コンテナ, IoT etc
- 参考リンク
WebAssembly 略歴
- 2012-2013年頃、Emscripten や asm.js といったブラウザ上でアプリケーションを高速に動作させる手法が開発され注目を集める
- 2015年 Mozilla や Chromium, Edge, WebKit の開発者が W3C コミュニティグループとして WebAssembly の開発開始を発表
- 2016年 主要なブラウザが実験的なサポートを開始
- 2019年 W3C 勧告が策定
- 〜2024年現在 ブラウザ内外の様々なシーンで利用が広がっている
Wasi
- WebAssembly System Interface
- システムの各種リソースへのインターフェースを定義
- 例: File System, Network
- W3C WebAssebmly CG のサブグループとして活動
- https://wasi.dev/
例)ビルドターゲットに WebAssembly を指定してコンパイル
$ cat main.rs
fn main() {
println!("Hello");
}
$ rustc main.rs --target wasm32-wasi
$ ls
main.rs main.wasm
Wasmtime とは
- WebAssembly, WASI, Component Model のためのスタンドアロンのランタイム
- Bytecode Alliance が開発
- リリースログなど確認できる限り開発開始は 5 年以上前(ソース)
- それ以降 2020 年に、同じく Wasm ランタイムの一つで Fastly が開発してオープンソース化した Lucet の開発チームが合流し、現在も活発な開発が続いている
- 例) 2週間ほど前の BA の記事 "New Stack Maps for Wasmtime and Cranelift"
Wasmtime の特徴
- 多機能
- ランタイムとしての機能が有名
-
wasmtime
コマンド、または各言語からの呼び出し
-
- Wasm バイナリの JIT/AOT コンパイラである Cranelift も同梱
-
wasmtime serve
コマンドで wasi-http の実装も使える - デバッガをアタッチしたりプロファイラでパフォーマンス測定したりもできる
- ランタイムとしての機能が有名
- 参考リンク
- github.com/bytecodealliance/wasmtime Cranelift のソースも見れる
- Guide for C and Rust programmers | Fastly Cranelift の最適化動作イメージ図
-
https://bytecodealliance.org/
- ここまでの用語がわかると Zulipchat の話が少し読みやすくなるはず
例) Wasmtime を利用した Wasm module の実行
#$ cat main.rs
#fn main() {
# println!("Hello");
#}
#$ rustc main.rs --target wasm32-wasi
#$ ls
#main.rs main.wasm
$ wasmtime main.wasm
Hello
$ wasmtime compile main.wasm
$ ls
main.cwasm main.rs main.wasm
$ WASMTIME_NEW_CLI=0 wasmtime main.cwasm --allow-precompiled
Hello
$ wasmtime explore main.wasm
Exploration written to main.explore.html
Wasmtime の性能
- 高速起動
- JS 実行エンジン(SpiderMonkey)の Wasm Module を5マイクロ秒で起動(2022年9月のBAのブログ記事より引用)
- 安全性
- メモリ安全なRustの採用、各種サプライチェーン安全性への対応、徹底的で執拗なファジング、形式的検証やスペクトル対策などによりセキュリティ対策を強化(2022年9月のBAのブログ記事より引用)
(余談/閑話休題) 上記のような Wasm ランタイムの最適化のほかに、Wasm module (バイトコード) 自体の最適化を行う wizer や weval といったプロジェクトもあり、最適化は様々な方向性で実施されている。 ※どちらも Bytecode Alliance のプロジェクト
WebAssembly x サーバレス開発
Wasi の種類
- Wasi 0.1(p1): 枯れてる仕様。
Viceroy
などで利用 - Wasi 0.2: 今年1月にローンチ。Component Model に基づく仕様、
wasmtime serve
などで利用
Wasi の動作環境
- WebAssemblyをセルフホスト
- オンプレでもマネージドな一般的なサーバレス環境でも
- 例) コンテナのファイルシステムの中に Wasm ランタイムと Wasm module (.wasmファイル)を格納して実行 [1]
- WebAssemblyに特化したサーバレスマネージド環境で動作(Fastly Compute, Fermyon等)
[1] (脱線/閑話休題) 先月発表された Wasi 0.2.1 で Wasm Component を Warg だけでなく OCI準拠のコンテナレジストリ(e.g. GitHub Packages, Azure Container Registry, Google Artifact Registry) に fetch/publish などできる仕様が策定完了(ソース)
Fastly Compute の特徴
(詳細は講演資料で紹介、ここでは概要と要約のみ)
- グローバルで約100拠点ある各POP上のサーバで実行される Wasm バイナリをデプロイ可能
- VCL では扱えなかった HTTP Req/Res Body の操作含めて汎用言語で操作可能に
- Rust, Go, JavaScript で開発可能(公式サポート)
- 非公式 SDK を自作することも可能 (例: Zig, Swift, Ruby, C#)
- 開発の始め方や SDK の基本的な紹介はここ
- 主な各種リソース制限はここ
- 100 MBのパッケージまでアップロード可能、130 sec / process、メモリ消費 128 MB まで等
- コードの公式サンプル(大量)はここ
Fastly Compute の利用例
- Yamagoya 2023 (日本での年次カンファレンス)
- Altitude 2023 セッション動画
お知らせ 1
今年6月に無料プランを提供開始(公式ブログ記事)
- CDN 無料枠についてわかりやすく紹介されている Zenn の記事
お知らせ 2
明日ワークショップがあります;
Fastly と Glitch の無料プランで作るサーバレス開発入門
(ServerlessDays Tokyo参加者用)登録フォーム:
https://forms.gle/FjoqGYVRzkupURJy8