WASI 0.3とコールドスタートの終焉:サーバーサイドWasmの本番運用
Engineering Team
WASI 0.3登場——すべてが変わる
WebAssembly System Interface(WASI)0.3は2026年2月にリリースされ、サーバーサイドWasmがメインストリームの本番ワークロードに入ることを妨げていた最後のギャップを埋めました。ネイティブasync I/O、ファーストクラスのストリーム型、完全なTCP/UDPソケットサポートにより、Wasmモジュールはコンテナができることすべてを実行できるようになりました——起動コストの一部で。
サーバーサイドWasmをおもちゃだと思っていたなら、このリリースは再考するきっかけです。AWS、Google Cloud、AzureはすべてWasmサーバーレスランタイムを2025-2026年に立ち上げ、Fermyon、Fastly、Cloudflareなどの企業は2年以上Wasmを本番環境で大規模に運用しています。
WASI 0.3が実際に提供するもの
WASI 0.2(2024年1月)はComponent Modelと基本I/Oインターフェースを導入しました。WASI 0.3はその基盤の上に3つの重要な追加を行います:
ネイティブAsync I/O
WASI 0.2はブロッキングI/Oのみを提供していました。Wasmモジュールが複数の同時接続を処理する必要がある場合、スレッドやぎこちないポーリングループに頼るしかありませんでした。WASI 0.3は言語レベルの非同期プリミティブに直接マッピングするネイティブ非同期モデルを導入します:
- Rust:
async fnをtokioまたはasync-stdとともに使用するとWASI 0.3ネイティブ非同期にコンパイル - Go:GoroutineがWASI非同期タスクにマッピング
- Python:
asyncioイベントループがWASIスケジューラと統合 - JavaScript:
Promiseとasync/awaitがJCOを通じてそのまま動作
ランタイム(Wasmtime、WasmEdge、またはSpin)がイベントループを管理します。コードは選択した言語で慣用的な非同期を記述し、WASI層が残りを処理します。
// WASI 0.3にコンパイルされるRust非同期HTTPハンドラ
use wasi::http::types::{IncomingRequest, ResponseOutparam};
async fn handle_request(req: IncomingRequest, resp: ResponseOutparam) {
// リクエストボディを非同期に読み取り
let body = req.consume().await.unwrap();
let bytes = body.read_all().await.unwrap();
// アウトバウンドHTTP呼び出し(ノンブロッキング)
let api_response = wasi::http::outgoing_handler::handle(
build_api_request(&bytes)
).await.unwrap();
// レスポンスをストリーミング
let out = resp.set(200, &headers);
out.body().write_all(&api_response.body()).await.unwrap();
}
ストリーム型
WASI 0.3はComponent Modelの型システムにおけるファーストクラスの型としてstream<T>とfuture<T>を導入します。これにより、コンポーネントはシリアライゼーションなしで言語の境界を越えてストリーミングデータを渡すことができます:
// ストリーム型を持つWITインターフェース定義
interface data-processor {
process: func(input: stream<list<u8>>) -> stream<record>;
record record {
id: u64,
payload: list<u8>,
timestamp: u64,
}
}
これにより、Rustデータパーサーの出力がPython MLモデルに、さらにGoシリアライザに流れる真のストリーミングパイプラインが可能になります——すべて同じプロセス内でゼロコピーストリームを通じて通信します。
完全なソケットサポート
WASI 0.3は完全なTCPおよびUDPソケットAPIを提供します:
tcp::listenとtcp::connectでサーバーおよびクライアントソケットudp::bindとudp::send_to/udp::recv_fromでデータグラムプロトコルwasi:sockets/tlsによるTLS終端wasi:sockets/name-lookupによるDNS解決
これにより、Wasmモジュールはカスタムプロトコル、データベースドライバー、メッセージキュークライアント、その他のネットワーク依存ワークロードをHTTPをトランスポート層として使用せずに実装できます。
Component Model:ポリグロット合成
Component ModelはWASI 0.2で安定化され、0.3で改良されました。これがサーバーサイドWasmをコンテナと根本的に異なるものにしています。異なる言語で書かれた複数のWasmコンポーネントを単一のアプリケーションに合成できます:
+------------------+ +-------------------+ +------------------+
| Auth Component |---->| Business Logic |---->| Data Layer |
| (Rust) | | (Python) | | (Go) |
+------------------+ +-------------------+ +------------------+
| | |
wasi:http wasi:keyvalue wasi:sql
capability capability capability
各コンポーネントは:
- ケイパビリティベースのセキュリティ(アンビエント権限なし)を持つ独自のサンドボックスで実行
- WITを通じて必要なシステムインターフェースを宣言
- シリアライズされたJSONではなく、型付きインターフェースを通じて他のコンポーネントと通信
- アプリケーション全体を再デプロイせずに独立して更新可能
これは理論上の未来ではありません。2026年1月リリースのFermyon Spin 3.0は本番環境でマルチコンポーネントアプリケーションをサポートしています。Fastly Computeは2025年後半からコンポーネント合成を提供しています。
パフォーマンス:マイクロ秒のコールドスタート vs コンテナの秒単位
Wasmをサーバーレスにとって魅力的にする主要指標はコールドスタート時間です。実世界のベンチマークでの比較:
| 指標 | Dockerコンテナ | AWS Lambda | Wasmモジュール(Spin) | Wasmモジュール(Wasmtime) |
|---|---|---|---|---|
| コールドスタート | 500ms - 5s | 100ms - 2s | 0.5ms - 3ms | 0.3ms - 2ms |
| ウォーム呼び出し | 1ms - 50ms | 1ms - 20ms | 0.1ms - 1ms | 0.05ms - 0.5ms |
| メモリフットプリント | 50MB - 500MB | 128MB - 10GB | 1MB - 20MB | 1MB - 15MB |
| バイナリサイズ | 50MB - 2GB | N/A(zipパッケージ) | 1MB - 30MB | 1MB - 30MB |
| 起動オーバーヘッド | OS + ランタイム + アプリ | ランタイム + アプリ | モジュールインスタンス化 | モジュールインスタンス化 |
| 分離 | Linux namespaces + cgroups | Firecracker microVM | Wasmサンドボックス | Wasmサンドボックス |
差は段階的ではありません——3桁の差です。マイクロ秒で測定されるWasmコールドスタート対秒で測定されるコンテナコールドスタートは、ユーザー向けレイテンシを心配することなくゼロにスケールできることを意味します。
なぜこれほど高速なのか?
WasmモジュールはOS起動シーケンス全体をスキップします。カーネル初期化なし、ファイルシステムマウントなし、動的ライブラリロードなし。ランタイムがWasmバイトコードをネイティブマシンコードに事前コンパイル(AOTコンパイル)し、インスタンス化はリニアメモリ領域の割り当てとグローバル変数の初期化だけです。
Wasmtime 19(2026年3月)はプールドインスタンス割り当てを導入し、メモリスロットのプールを事前割り当てします。新しいWasmモジュールのインスタンス化は1回のポインタバンプ——文字通りナノ秒です。
クラウドプロバイダーの状況
すべての主要クラウドがWasmサーバーレスを提供していますが、成熟度は異なります:
AWS Lambda Wasmランタイム(2025年12月GA)
AWSはLambda用のネイティブWasmランタイムを立ち上げました:
- Wasmtime経由のWASI 0.3サポート
- サブミリ秒のコールドスタート
- マルチ言語関数のComponent Modelサポート
- API Gateway、S3イベント、SQSトリガーとの統合
- 価格:同等のコンテナLambdaより50%安い
Google Cloud Run Wasm(2026年2月GA)
GoogleはCloud Runを拡張してWasmモジュールを受け入れるようにしました:
gcloud run deploy --wasmで.wasmコンポーネントを直接デプロイ- マイクロ秒のコールドスタートでゼロまで自動スケール
- WASIソケット経由のgRPCとHTTP/2サポート
- Pub/Sub、Cloud Storage、BigQueryとの統合
Azure Container Apps Wasm(プレビュー、2026年Q2 GA)
MicrosoftはSpinKubeプロジェクトを通じてWasmをAzure Container Appsに統合しました:
- Kubernetesネイティブ:同じクラスターでコンテナと並行してWasmワークロードを実行
- Spin OperatorがWasmコンポーネントのライフサイクルを管理
- KEDAベースのオートスケーリング(サブ秒レスポンス)
エッジプロバイダー
Cloudflare Workersは2018年からWasmをサポートし、2026年1月にWASI 0.3を完全採用。Fastly Computeはすべてのワークロードをwasmコンポーネントとして実行。Vercel Edge Functionsは2025年後半にWasmサポートを追加。
Rust + Wasm開発ワークフロー
Rustはゼロランタイムオーバーヘッドとファーストクラスのwasm32-wasip2ターゲットにより、Wasm開発で最もサポートされた言語であり続けます。
プロジェクトセットアップ
# WASIターゲットをインストール
rustup target add wasm32-wasip2
# 新しいプロジェクトを作成
cargo init --name my-service
# WASI依存関係を追加
cargo add wit-bindgen
cargo add wasi --features "http,keyvalue,sql"
ビルドとテスト
# Wasmコンポーネントをビルド
cargo build --target wasm32-wasip2 --release
# Wasmtimeでローカル実行
wasmtime serve target/wasm32-wasip2/release/my_service.wasm
# またはSpinで
spin build && spin up
# テスト実行
cargo test --target wasm32-wasip2
コンテナ vs Wasmモジュール:完全比較
| 項目 | コンテナ(Docker/OCI) | Wasmモジュール(WASI 0.3) |
|---|---|---|
| コールドスタート | 500ms - 5s | 0.3ms - 3ms |
| メモリオーバーヘッド | 50MB - 500MBベースライン | 1MB - 20MBベースライン |
| バイナリサイズ | 50MB - 2GBイメージ | 1MB - 30MBコンポーネント |
| 分離モデル | Linux namespaces + cgroups | Wasmサンドボックス(設計上メモリ安全) |
| 言語サポート | すべて(ネイティブバイナリ) | Rust, Go, Python, JS, C/C++, C#, Kotlin |
| ネットワーク | 完全なOSネットワークスタック | WASIソケット(TCP, UDP, TLS) |
| ファイルシステム | 完全なPOSIXファイルシステム | ケイパビリティスコープの仮想FS |
| GPUアクセス | NVIDIA Container Toolkit | 実験的(wasi-nn) |
| エコシステム成熟度 | 12年以上、巨大なエコシステム | 3年、急速に成長中 |
| オーケストレーション | Kubernetes, ECS, Nomad | SpinKube, wasmCloud, Kubernetes(shimを通じて) |
Wasmを使うべき場合
- サーバーレス関数——コールドスタートレイテンシが重要な場合
- エッジコンピューティング——バイナリサイズとメモリが制約される場合
- プラグインシステム——安全なサードパーティコード実行が必要な場合
- マルチテナントプラットフォーム——分離密度が重要な場合
- ポリグロットマイクロサービス——チームが異なる言語を使用する場合
コンテナを維持すべき場合
- GPUワークロード(MLトレーニング/推論)——WASI GPUサポートはまだ実験的
- レガシーアプリケーション——特定のOS機能やライブラリに依存
- ステートフルサービス——永続的なローカルストレージが必要
- 複雑なデバッグシナリオ——完全なOSレベルツールが必要
本番運用事例
Shopify:エッジコマース
Shopifyは2025年にストアフロントレンダリングをエッジのWasmに移行し、Cloudflare Workers上で毎秒230万リクエストを処理。結果:グローバル顧客のTTFBを68%削減。
Midokura(Sony):IoTゲートウェイ
Sonyの子会社Midokuraは256MB RAMのIoTゲートウェイでデバイスプロトコルハンドラーをWasmで実行。以前は各ハンドラーに個別のコンテナが必要でした。Wasmにより、以前4コンテナしかサポートできなかったメモリで40のプロトコルハンドラーを実行。
Fermyon Platform:マルチテナントSaaS
FermyonのクラウドプラットフォームはWasmコンポーネントとして顧客ワークロードを実行し、ノードあたり12,000インスタンス——コンテナでは不可能な密度。平均コールドスタート0.8ms、リクエストあたりのコストは同等のLambda関数の10分の1。
セキュリティモデル
Wasmのセキュリティモデルはコンテナとは根本的に異なります:
- デフォルトで拒否——ホストが明示的にケイパビリティを付与しない限り、Wasmモジュールは何にもアクセスできない
- メモリ安全——リニアメモリがバッファオーバーフローのサンドボックス外への脱出を防止
- アンビエント権限なし——コンテナとは異なり、各ケイパビリティを個別に付与する必要がある
- 形式検証——Wasm仕様は形式検証ツールに十分シンプル
よくある質問
WASI 0.3は本番対応ですか?
はい。WASI 0.3はBytecode Allianceがサーバーワークロード向けに本番対応と見なす最初のバージョンです。Wasmtime 19、WasmEdge 0.15、すべての主要クラウドランタイムがサポートしています。
WasmはKubernetesを置き換えられますか?
完全にではありません。Wasmは適切なワークロードのコンテナランタイムを置き換えますが、オーケストレーションは依然として必要です。SpinKubeとwasmCloudがWasmワークロードのKubernetesネイティブオーケストレーションを提供します。
データベースドライバーはどうですか?
WASI 0.3の完全なソケットサポートにより、ネイティブデータベースドライバーが動作します。wasi:sqlインターフェースが標準化されたSQL APIを提供し、PostgreSQL、MySQL、SQLiteのドライバーがWasmコンポーネントとして利用可能です。
WASI 0.3はステートをどう扱いますか?
Wasmモジュールはデフォルトでステートレスです。ステートにはwasi:keyvalue、wasi:sql、またはWASIソケットを通じた外部サービスを使用します。
Rust + Wasmの学習曲線は?
Rustを既に知っていれば、追加学習は最小限です——wasm32-wasip2ターゲットをインストールし、WITインターフェース定義を学びます。Rustが新しければ、生産的になるまで2-4週間かかります。