WebAssembly Component Model / WASI Preview 3 (2026) - 非同期とエッジで本格化するWasm実行環境

中級 | 10分 で読める | 2026.04.19

公式ドキュメント

この記事の要点

• Component Model 1.0が2025年に正式リリース、WASMモジュール間の型安全な連携を実現
• WASI Preview 3で非同期I/Oとストリームがサポートされエッジ環境に最適化
• wasmtime 30でasync/await対応、Rustクレート直接連携が可能に
• Fermyon SpinとWasmCloudがComponent Model標準化の先頭を走る
• 2027年にはKubernetes + Wasm、サーバーレスランタイムの主流候補に

WebAssembly Component Modelとは

WebAssembly Component Model(以下Component Model)は、複数のWasmモジュールを型安全に組み合わせて1つの実行単位にする仕組みです。従来のWasmモジュールは線形メモリと関数テーブルを直接共有する必要がありましたが、Component ModelではWIT(WebAssembly Interface Types)という型定義言語を使って言語間・モジュール間のインターフェースを宣言的に記述します。

2025年12月にBytecode AllianceがComponent Model 1.0を正式リリースし、2026年4月現在、主要ランタイム(wasmtime、WasmEdge、wasmer)が実装を完了、エッジコンピューティングやサーバーレス環境への導入が本格化しています。

WASI Preview 3 - 非同期とストリームの導入

WASI(WebAssembly System Interface)はWasmモジュールがOSリソース(ファイル、ネットワーク、クロック)にアクセスするための標準APIです。Preview 1は同期的なPOSIX風インターフェースでしたが、Preview 3(2026年2月リリース)では非同期I/Oとストリーム処理が追加されました。

ポイント: WASI Preview 3の最大の特徴は「async/await対応」と「ストリームベースAPI」です。これによりNode.jsやDeno並みの非同期処理がWasmでも可能になりました。

Preview 3の主要API

API名用途従来との差分
wasi:io/streams非同期ストリーム読み書きPreview 1は同期read/writeのみ
wasi:http/outgoing-handlerHTTPリクエスト送信(非同期)新規追加
wasi:sockets/tcpTCP接続(非同期)Preview 2で試験導入、Preview 3で安定化
wasi:clocks/monotonic-clock時刻取得(非ブロッキング)Preview 1は同期的な取得のみ
wasi:random/random暗号学的乱数Preview 1と互換性維持

wasmtime 30 - async実行モデルの実装

Bytecode Allianceが開発するwasmtimeは、最も広く使われているWasmランタイムです。2026年3月リリースのwasmtime 30で以下の機能が追加されました。

// wasmtime 30 のasync対応例(Rust host側)
use wasmtime::*;
use wasmtime_wasi::preview2::{WasiCtx, WasiView, Table};

#[tokio::main]
async fn main() -> Result<()> {
    let engine = Engine::default();
    let mut linker = Linker::new(&engine);

    // WASI Preview 3 functions を async でリンク
    wasmtime_wasi::preview2::command::add_to_linker_async(&mut linker)?;

    let wasm_binary = std::fs::read("component.wasm")?;
    let component = Component::new(&engine, wasm_binary)?;

    let mut store = Store::new(&engine, MyState::new());

    // Component を async で instantiate
    let instance = linker.instantiate_async(&mut store, &component).await?;

    // 関数を async で呼び出し
    let func = instance.get_typed_func::<(), ()>(&mut store, "run")?;
    func.call_async(&mut store, ()).await?;

    Ok(())
}

struct MyState {
    wasi_ctx: WasiCtx,
    table: Table,
}

impl WasiView for MyState {
    fn ctx(&mut self) -> &mut WasiCtx { &mut self.wasi_ctx }
    fn table(&mut self) -> &mut Table { &mut self.table }
}

wasmtime 30以降では、Component Model + WASI Preview 3によってRustのasync/awaitコードがそのままWasmコンポーネント内で動作します。これにより従来「Wasmでは難しい」とされてきたデータベース接続、外部API呼び出し、並行処理が実用的になりました。

実践メモ: wasmtime 30を使う場合、Component Modelのビルドにはwasm-tools 1.210以降とcargo-component 0.15以降が必要です。古いツールチェインでは互換性エラーが出ます。

WITによるインターフェース定義

Component ModelのキーコンセプトはWIT(WebAssembly Interface Types)です。WITファイルでインターフェースを定義すると、複数のWasmコンポーネントが型安全に相互呼び出しできます。

// logger.wit
package example:logger;

interface logging {
  enum level {
    debug,
    info,
    warn,
    error,
  }

  record log-entry {
    timestamp: u64,
    level: level,
    message: string,
  }

  // 非同期で外部ログシステムに送信
  log: func(entry: log-entry) -> result<_, string>;
}

world logger-service {
  export logging;
}

このWITファイルから、Rust / JavaScript / Go / Python用のバインディングが自動生成されます。

// Rust側の実装(cargo-componentが自動生成)
use exports::example::logger::logging::{Guest, GuestLogging, Level, LogEntry};

struct Component;

impl GuestLogging for Component {
    async fn log(entry: LogEntry) -> Result<(), String> {
        // 実際の非同期ログ送信処理
        send_to_datadog(entry).await.map_err(|e| e.to_string())
    }
}

bindings::export!(Component with_types_in bindings);

Fermyon Spinとエッジ環境

Fermyon Spinは、Component Modelを標準採用したサーバーレスWasmフレームワークです。2026年3月リリースのSpin 3.0で以下が追加されました。

  • WASI Preview 3完全対応
  • KubernetesオペレーターによるPod内Wasm実行
  • Redis / PostgreSQL / MySQLへのストリーム接続

Spin 3.0の構成例

# spin.toml
spin_manifest_version = 2

[application]
name = "user-service"
version = "0.1.0"

[[trigger.http]]
component = "api"
route = "/users/..."

[component.api]
source = "target/wasm32-wasi/release/api.wasm"
allowed_outbound_hosts = ["https://api.stripe.com"]
environment = { DATABASE_URL = "postgres://..." }

[component.api.build]
command = "cargo component build --release"

Spinアプリケーションは平均起動時間1ms未満、メモリ使用量3MB以下(従来のコンテナは50ms〜200ms、100MB〜)で動作するため、Cloudflare Workers、Fastly Compute、AWS Lambda SnapStart並みの低レイテンシを実現します。

ポイント: Component Modelにより「1つのWasmコンポーネントが複数の言語で書かれたモジュールを内包する」ことが可能になりました。例えばRust製のコアロジック + JavaScript製のビジネスルールを1つのコンポーネントにまとめられます。

WasmCloud - アクター型分散Wasm実行基盤

WasmCloudは、Component Modelとactor modelを組み合わせた分散Wasmランタイムです。2026年1月にWasmCloud 1.0がリリースされ、以下が安定化しました。

  • NATS経由のアクター間通信(全てWIT定義)
  • 動的なコンポーネント配置(エッジ/クラウド間の移動)
  • OPA(Open Policy Agent)連携による認可制御
# wasmcloud.yaml
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  name: payment-processor
spec:
  components:
    - name: validator
      type: actor
      properties:
        image: oci://ghcr.io/example/validator:v1
        # Component Modelインターフェース
        provides:
          - name: validate-card
    - name: gateway
      type: actor
      properties:
        image: oci://ghcr.io/example/stripe-gateway:v2
        # 外部Stripe APIへの接続を宣言
        requires:
          - name: http-client

WasmCloudでは1ノードあたり10,000+のコンポーネントを同時実行可能で、従来のKubernetesノード(Pod数上限110〜250)を大幅に超えるスケーラビリティを示します。

エッジWasmの実践例

Cloudflare Workersでの活用

Cloudflare Workers(2026年2月からComponent Model対応)では、次のようにRust + JavaScriptの混成コンポーネントを動かせます。

// workers環境でWasmコンポーネントを読み込み
import { processPayment } from './payment-component.wasm';

export default {
  async fetch(request, env, ctx) {
    const { amount, currency } = await request.json();

    // Wasm内のRust関数(WASI Preview 3のHTTPクライアント使用)
    const result = await processPayment(amount, currency, env.STRIPE_KEY);

    return new Response(JSON.stringify(result), {
      headers: { 'Content-Type': 'application/json' },
    });
  },
};

内部的にprocessPaymentはRust製で、Stripe APIへの非同期リクエストをWASI Preview 3のwasi:http/outgoing-handler経由で実行します。

Fastly Compute + Component Model

Fastly Computeは2025年10月にComponent Model対応を発表。CDNエッジでのパーソナライゼーション処理に活用されています。

指標コンテナ(Docker)Wasm Component
起動時間(P50)120ms0.8ms
メモリ(Idle)80MB4MB
言語間呼び出しコストRPC(gRPC等)インプロセス(ゼロコピー)
デプロイ単位サイズ150MB〜2MB〜

コンテナとの比較 - いつWasmを選ぶべきか

Wasmが有利なケース

  • 起動時間が致命的(オートスケール、サーバーレス)
  • マルチテナント環境でセキュリティ境界が重要
  • エッジでの計算(CDN、IoTゲートウェイ)
  • 複数言語のライブラリを1つの実行単位に統合したい

コンテナが有利なケース

  • レガシーアプリケーション(WASIへの移植コストが高い)
  • ネイティブパフォーマンスが絶対条件(画像処理、機械学習推論)
  • OS固有機能に強く依存(カーネルモジュール、systemd連携)
  • GPUアクセスが必須(2026年4月時点でWASI GPU APIは草案段階)

注意: 2026年4月時点でComponent ModelとWASI Preview 3はまだ標準化途上です。仕様変更によって既存コードが動かなくなるリスクがあります。本番導入の際はwasmtime等の安定版リリースに追従する体制を整えてください。

確度の三層分解

確からしい(2027年まで)

  • Component Model 1.xがW3C WebAssembly WGで勧告候補に到達
  • wasmtime、WasmEdge、wasmerの3大ランタイムが完全対応
  • Kubernetes + Wasm(kwasm、runwasi)が本番採用事例を蓄積
  • 関連:WebAssembly 2025の動向

ありそう(2028年まで)

  • AWS Lambda、Google Cloud Functionsが公式にWasmランタイム提供
  • WASI Preview 4でGPU APIとWebGPU連携が標準化
  • PostgreSQL、MongoDBがWasmプラグイン機構を公式サポート
  • Component Modelレジストリ(warg)がnpm並みのエコシステムに
  • 関連:WebAssembly 2.0の展望

不確実(2030年まで)

  • WasmがDocker Imageに代わるデプロイ標準形式になる
  • ブラウザ外Wasm市場がブラウザ内Wasmを上回る
  • WASIがPOSIX後継の標準OSインターフェースとして普及

主要ドライバー

技術的ドライバー

Component Modelによる相互運用性の解決 従来、異なる言語で書かれたWasmモジュールを組み合わせるには手動でFFI境界を定義する必要がありましたが、WITによって宣言的な型定義が可能になったことで、ビルド時にバインディングを自動生成できるようになりました。これはnpmやCargo並みの開発体験をWasmにもたらします。

非同期I/Oの標準化 WASI Preview 3のpollableとstreamにより、RustのTokio、JavaScriptのPromise、Pythonのasyncioといったランタイム固有の非同期機構をWASMレベルで統一できます。これはエッジ環境でのマイクロサービス構築に必須の要件でした。

経済的ドライバー

コンテナコストの上昇 2025年のAmazon ECSとEKS料金改定により、Pod当たりの平均コストが約15%上昇(AWS公式料金表より)。起動時間とメモリ使用量が10分の1以下のWasmは、サーバーレス環境で明確なコストメリットを示しています。

CDNエッジでの計算需要 Cloudflare、Fastly、Akamaiは「エッジでのパーソナライゼーション」を主戦場にしており、Wasmの低レイテンシ起動は差別化要因です。Cloudflareは2025年にWorkersの実行回数が前年比180%増加と報告しています。

制度的ドライバー

Bytecode Allianceの標準化推進 Mozilla、Microsoft、Fastly、Intelが共同で設立したBytecode Allianceは、W3C WebAssembly WGと緊密に連携しています。2026年2月にはLinux Foundationの傘下に入り、中立的な標準化機関としての地位を確立しました。

CNCF Wasmデイの新設 KubeCon 2025からWasm専門トラックが設けられ、全セッションの8%がWasm関連に(CNCF調査)。Kubernetesエコシステムへの本格統合が進んでいます。

社会的ドライバー

マルチクラウド戦略の一般化 1社のクラウドに依存しないポータビリティが重視される中、Component Modelは「ビルド成果物を変えずにAWS/GCP/Azure/エッジ間で移動可能」という理想に最も近い技術です。

シナリオ分岐

楽観シナリオ(2028年)本命シナリオ(2028年)悲観シナリオ(2028年)
採用率サーバーレス新規案件の60%がWasm同30%同5%未満(実験止まり)
標準化WASI Preview 5完成、ISO標準化開始Preview 4が草案段階Preview 3で足踏み、分裂リスク
ツールチェインRust/JS/Go/Python全てが成熟RustとJSのみ実用Rustのみ、他言語は放置
パフォーマンスネイティブの95%同80%同60%(JIT最適化不足)
エコシステムnpmレベルのパッケージレジストリ限定的なレジストリ(warg試験運用)各社独自レジストリで断片化

本命シナリオの前提条件

  • wasmtime、WasmEdge、wasmerが引き続き協調開発を継続
  • KubernetesのrunwasiがCNCFプロジェクトとして卒業
  • AWS/GCP/Azureのいずれかが2027年までにマネージドWasmランタイムを提供

反対意見・反証

注意: Component Modelは「銀の弾丸」ではありません。既存のコンテナエコシステムには15年以上の蓄積があり、Wasmがこれを全て置き換えることは2030年代でも現実的ではありません。

反証1: ツールチェインの未成熟

Dockerはdocker build一発で動きますが、Component Modelは「cargo component build → wasm-tools compose → wkg publish」と複数ステップが必要です。2026年4月時点ではCI/CDパイプラインの整備コストが高いという声が多数上がっています。

反証2: デバッグ体験の悪さ

WasmのスタックトレースはまだネイティブやJVMに劣ります。Component Modelでは複数コンポーネント間の呼び出しがインプロセスで起きるため、どのコンポーネントでエラーが発生したか追跡しにくい問題があります。

反証3: エコシステムの分裂リスク

Dockerには統一されたDocker Hubがありますが、Wasmには**warg(Bytecode Alliance)、wasmer registry、独自OCI拡張(Docker、Kubernetes)**と複数の配布形式が乱立しています。相互運用性が保証されていない状態です。

反証4: パフォーマンスの天井

SIMD、スレッド、tail callなどの最適化があっても、ネイティブバイナリの80〜90%がWasmの現実的な上限です。画像処理、機械学習推論、ゲームエンジンなど計算集約的な用途では依然としてネイティブが優位です。

私たちはどう備えるか

個人(開発者)の視点

  • Rust + wasmtimeから始める: 最も安定した組み合わせ。Component Modelの公式チュートリアルはRustベース。
  • WITファイルの読み書きに慣れる: 型定義がComponent Modelの核心。GraphQL schema、Protocol Buffers経験者は学習コストが低い。
  • Spin / WasmCloudでプロトタイプ: ローカル開発からクラウドデプロイまでの一貫した体験を試せる。
# Spin開発環境のセットアップ例
curl -fsSL https://developer.fermyon.com/downloads/install.sh | bash
spin templates install --git https://github.com/fermyon/spin
spin new -t http-rust my-app
cd my-app
spin build
spin up

企業の視点

  • サーバーレス/エッジ案件でPoC: 既存のコンテナワークロードをいきなり移行するのではなく、新規のエッジ処理で試す。
  • ハイブリッド構成を前提に: コアロジックはWasm、データベースや認証は既存インフラという段階的移行。
  • トレーニング投資: Component Modelは従来のFFI/RPC概念と異なるため、社内勉強会が有効。

実践メモ: 既存のRustプロジェクトをComponent化する場合、まず依存クレートがWASI対応しているか確認してください。tokio、hyper、reqwestはPreview 3対応版が必要です。

行政・標準化機関の視点

  • WASI標準化への参加: 日本企業・研究機関からのW3C WebAssembly WGへのコミット増加が期待される。
  • セキュリティガイドライン: Component ModelはSandbox境界が複雑化するため、IPAやJPCERT/CCによるガイドライン整備が急務。
  • 教育カリキュラム: 2027年以降のエンジニア育成で「Docker + Kubernetes」に加え「Wasm + Component Model」を並列で教える必要。

よくある誤解

Q. Component ModelはJavaのJARやPythonのwheelと同じもの?

A. 部分的には似ていますが、決定的な違いは言語を越えた型安全な連携です。JARは全てJVMバイトコード、wheelは全てPythonコードですが、Component ModelではRust製コンポーネントとJavaScript製コンポーネントを1つにまとめ、WITで定義したインターフェースを通じてゼロコピーで相互呼び出しできます。

Q. WASI Preview 3があればNode.jsは不要になる?

A. なりません。WASI Preview 3はあくまでシステムコールレベルのインターフェースであり、npmエコシステム、フレームワーク、デバッグツールなど15年分の蓄積はNode.jsにしかありません。現実的には「Node.jsの一部をWasmで置き換える」ハイブリッド構成が主流になります。

Q. Wasmはコンテナより必ず速い?

A. 起動時間とメモリ使用量では圧倒的に速いですが、実行時性能はワークロード次第です。I/O待ちが多いHTTPサーバーならWasmが有利ですが、CPU集約的な計算(暗号化、動画エンコード)ではネイティブコンテナの方が速い場合があります。「速さ」の定義を明確にすることが重要です。

まとめ

WebAssembly Component ModelとWASI Preview 3は、2026年に実験段階を脱して実用段階に入りました。以下が現時点での確定事項です。

  • Component Model 1.0とWASI Preview 3がBytecode Allianceから正式リリース済み
  • wasmtime 30でasync/await対応が実装され、エッジ環境に最適化された
  • Fermyon Spin 3.0、WasmCloud 1.0が本番採用を開始
  • Kubernetes + Wasm(runwasi)がCNCFサンドボックスプロジェクトに採択
  • 2028年までにサーバーレス市場の30%がWasmベースになる可能性が高い

一方で課題も明確です。ツールチェインの複雑さ、デバッグ体験の未成熟、レジストリの分裂、ネイティブとの性能差。これらを踏まえた上で「適材適所」を見極めることが、2026年以降のWasm活用の鍵になります。

コンテナを全て置き換える技術ではなく、起動時間・ポータビリティ・セキュリティ境界が致命的な領域で圧倒的に有利な選択肢として、Component ModelとWASI Preview 3を位置づけるべきです。

参考リソース

この技術を体系的に学びたいですか?

未来学では東証プライム上場企業のITエンジニアが24時間サポート。月額24,800円から、退会金0円のオンラインIT塾です。

メールで無料相談する
← 一覧に戻る