WASI

WebAssembly System Interface。WASM モジュールがブラウザ外でファイルシステム、ネットワーク、時刻取得等のシステムリソースにアクセスするための標準化 API 群。Capability-based security (deny-by-default) が設計の核心。Bytecode Alliance が主導し、Edge Computing の基盤技術として機能する。

なぜ WASI が必要か

Core WASM はサンドボックス内の純粋な計算しかできない。ファイル、ネットワーク、乱数、時刻へのアクセス手段が一切ない。WASI がこのギャップを埋める。

設計哲学: Capability-Based Security

プログラムはデフォルトで一切のシステムリソースにアクセスできない。ランタイムが明示的に渡した capability (権限トークン) のみを通じてアクセスする。

graph LR
    Runtime["ランタイム"] -->|"capability 付与<br/>(--dir ./data)"| Component["WASM Component<br/>(ゼロ権限で起動)"]
    Component -->|"capability 経由でのみ"| FS["ファイルシステム<br/>(./data のみ)"]
    Component -.->|"アクセス不可"| Net["ネットワーク"]
    Component -.->|"アクセス不可"| Env["環境変数"]

WASI vs POSIX

項目POSIXWASI
権限モデルAmbient authority (暗黙の全権)Capability-based (明示的付与)
ファイルアクセスopen("/etc/passwd") で任意ファイルopenat(dir_handle, "file") でハンドル範囲内のみ
グローバル名前空間ファイルシステム、ネットワーク等の全名前空間なし。一切存在しない
サンドボックス哲学全権プロセスを事後的に制限 (chroot, seccomp)ゼロ権限から必要なものだけを付与 (secure by design)

POSIX のサンドボックスは「天井から壁を下ろす」。WASI は「地面から必要な穴だけ開ける」。

Preview 1 → Preview 2 → Preview 3

Preview 1 (legacy)

45個のフラットな C ABI 関数群。fd_read, fd_write, path_open 等。Rust ターゲット: wasm32-wasip1。

制限詳細
ネットワーキングTCP/UDP クライアント接続不可
スレッドなし
非同期 I/Opoll_oneoff のみ
データ交換C ABI + linear memory 上のポインタ

レガシーだがツールチェーンの成熟度から依然として広く使われている。

Preview 2 (WASI 0.2, 2024年1月〜)

Component Model ベースへの根本的移行。最新: v0.2.11 (2026年4月)。

インターフェース説明
wasi:cliコマンドライン (args, env, stdio)
wasi:httpHTTP incoming/outgoing handler
wasi:ioストリーム、ポーリング
wasi:filesystemファイル/ディレクトリ操作
wasi:socketsTCP/UDP ソケット (P1 にはなかった)
wasi:random暗号的安全乱数
wasi:clockswall-clock, monotonic-clock

Rust ターゲット: wasm32-wasip2 (Rust 1.82+ で Tier 2)。

Preview 3 (WASI 0.3, 策定中)

最大の変更: async I/O のネイティブサポート。

Component Model

Core Module から Component への進化。WASI の価値の大部分がここにある。

Core Module vs Component

項目Core ModuleComponent
インターフェース数値型の関数のみWIT で定義された型付きインターフェース
データ交換linear memory 上の生ポインタstring, record, variant, list を直接授受
言語間結合共有メモリ + 手動 FFIWIT を共通契約として自動バインディング生成
メモリ隔離単一 linear memory を共有コンポーネントごとに独立メモリ

WIT (WebAssembly Interface Types)

Component Model の IDL。コンポーネントの import/export を型安全に定義する。

package my-company:my-api@1.0.0;

interface greeter {
    record person {
        name: string,
        age: u32,
    }
    greet: func(who: person) -> string;
}

world my-service {
    import wasi:http/types@0.2.0;
    export greeter;
}

型システム:

resource は偽造不可能なハンドル + メソッドを持つ型。WASI の capability モデルの基盤。

Canonical ABI

WIT の高水準型を Core WASM の linear memory 上の表現に変換するルール。コンポーネント間のデータマーシャリングを自動化する。WASI 0.3 では stream<T>, future<T> が追加。

コンポーネントの配布

Rust / Almide での実践

ビルド

# ターゲット追加
rustup target add wasm32-wasip2

# 直接ビルド (WASI インターフェースのみ使用する場合)
cargo build --target wasm32-wasip2 --release

# cargo-component (カスタム WIT / 多言語結合が必要な場合)
cargo install cargo-component
cargo component new --lib my-handler
cargo component build --release

HTTP ハンドラの実装

// wit/world.wit:
// world my-handler {
//     export wasi:http/incoming-handler@0.2.0;
// }

wit_bindgen::generate!({
    world: "my-handler",
    path: "wit",
});

struct MyHandler;

impl Guest for MyHandler {
    fn handle(request: IncomingRequest, response_out: ResponseOutparam) {
        // リクエスト処理
    }
}

export!(MyHandler);

Edge デプロイ

# Fermyon Spin (Akamai)
spin build && spin deploy

# Fastly Compute
fastly compute build && fastly compute deploy

# Wasmtime で直接実行
wasmtime serve target/wasm32-wasip1/release/handler.wasm

Almide のパス: *.almd → Almide コンパイラ → *.rs → cargo-component → *.wasm (Component) → Edge デプロイ。Almide が直接 wasm32-wasip2 互換の WASM を出力できれば Rust 経由のパスをスキップ可能。

ランタイムサポート状況

ランタイムP1P2P3Component Model特徴
WasmtimeFullFullRCFullリファレンス実装。Fastly の基盤
WasmerFullPartial—開発中WASIX (独自拡張) に注力。ロックインリスク
WasmEdgeFull開発中—PartialEdge AI 特化 (WASI-NN)
WAMRFullPartial—Partial超軽量。組み込み/IoT

WASIX (Wasmer 独自): fork(), exec(), pthreads, BSD ソケットを追加。公式 WASI 標準ではないため、Wasmer でしか動作しない。

提案段階のインターフェース

インターフェース段階内容
wasi:nnPhase 2ML 推論 (ONNX, TF Lite, GGML)
wasi:gfxPhase 2GPU アクセス (WebGPU バインディング)
wasi:blob-storePhase 1オブジェクトストレージ
wasi:cryptoPhase 1暗号操作
wasi:keyvaluePhase 1KV ストア
wasi:messagingPhase 1メッセージング/Pub-Sub
wasi:sqlPhase 1SQL データベース
wasi:threadsPhase 1スレッドサポート

押さえどころ(カード化候補)

関連

Graph