メインコンテンツへスキップ
DevOpsMar 28, 2026

WASI 0.3とコールドスタートの終焉:サーバーサイドWasmの本番運用

OS
Open Soft Team

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は言語レベルの非同期プリミティブに直接マッピングするネイティブ非同期モデルを導入します:

  • Rustasync fntokioまたはasync-stdとともに使用するとWASI 0.3ネイティブ非同期にコンパイル
  • Go:GoroutineがWASI非同期タスクにマッピング
  • PythonasyncioイベントループがWASIスケジューラと統合
  • JavaScriptPromiseasync/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::listentcp::connectでサーバーおよびクライアントソケット
  • udp::bindudp::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 LambdaWasmモジュール(Spin)Wasmモジュール(Wasmtime)
コールドスタート500ms - 5s100ms - 2s0.5ms - 3ms0.3ms - 2ms
ウォーム呼び出し1ms - 50ms1ms - 20ms0.1ms - 1ms0.05ms - 0.5ms
メモリフットプリント50MB - 500MB128MB - 10GB1MB - 20MB1MB - 15MB
バイナリサイズ50MB - 2GBN/A(zipパッケージ)1MB - 30MB1MB - 30MB
起動オーバーヘッドOS + ランタイム + アプリランタイム + アプリモジュールインスタンス化モジュールインスタンス化
分離Linux namespaces + cgroupsFirecracker microVMWasmサンドボックス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 - 5s0.3ms - 3ms
メモリオーバーヘッド50MB - 500MBベースライン1MB - 20MBベースライン
バイナリサイズ50MB - 2GBイメージ1MB - 30MBコンポーネント
分離モデルLinux namespaces + cgroupsWasmサンドボックス(設計上メモリ安全)
言語サポートすべて(ネイティブバイナリ)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, NomadSpinKube, 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:keyvaluewasi:sql、またはWASIソケットを通じた外部サービスを使用します。

Rust + Wasmの学習曲線は?

Rustを既に知っていれば、追加学習は最小限です——wasm32-wasip2ターゲットをインストールし、WITインターフェース定義を学びます。Rustが新しければ、生産的になるまで2-4週間かかります。