Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pure Goで体験するWasmの未来

Avatar for asuka asuka
September 28, 2025

Pure Goで体験するWasmの未来

Avatar for asuka

asuka

September 28, 2025
Tweet

More Decks by asuka

Other Decks in Technology

Transcript

  1. WHOAMI 2 name = asuka fav = Wasm [org] name

    = 株式会社モニクル role = SWE [sns] X = @a_skua GitHub = @a-skua Bluesky = @askua.dev
  2. GOOS=wasip1 GOARCH=wasm 5 Go 1.21から,WASI 0.1をサポート WASIに準拠することで, OSやCPUアーキテクチャに関係なく アプリケーションを動かせるようになる +セキュア

    WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 2018年 8月 G o 1.11 リ リ ー ス W asm サ ポ ー ト 2019年 W A SI 0.1 リ リ ー ス 2023年 8月 G o 1.21 リ リ ー ス W A SI 0.1 サ ポ ー ト 2024年 1月 W A SI 0.2 リ リ ー ス 2024年 8月 W A SI 0.2.1 リ リ ー ス W asm O C I A rtifact layout 2025年 W A SI 0.3 リ リ ー ス ? 2025年 2月 G o 1.24 リ リ ー ス W A SI 0.1 リ ア ク タ ー モ ジ ュ ー ル サ ポ ー ト
  3. GOOS=wasip1 GOARCH=wasm 6 Go 1.21から,WASI 0.1をサポート WASIに準拠することで, OSやCPUアーキテクチャに関係なく アプリケーションを動かせるようになる WASI

    - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 2018年 8月 G o 1.11 リ リ ー ス W asm サ ポ ー ト 2019年 W A SI 0.1 リ リ ー ス 2023年 8月 G o 1.21 リ リ ー ス W A SI 0.1 サ ポ ー ト 2024年 1月 W A SI 0.2 リ リ ー ス 2024年 8月 W A SI 0.2.1 リ リ ー ス W asm O C I A rtifact layout 2025年 W A SI 0.3 リ リ ー ス ? 2025年 2月 G o 1.24 リ リ ー ス W A SI 0.1 リ ア ク タ ー モ ジ ュ ー ル サ ポ ー ト e.g.$ cat examples/go/hello.go package main import ( "fmt" ) func main() { fmt.Println("Hello, 世界!") } e.g.$ GOOS=wasip1 GOARCH=wasm go build -o hello.wasm hello.go e.g.$ wasmtime run hello.wasm Hello, 世界! 配布するバイナリは1つだけで良い
  4. GOOS=wasip1 GOARCH=wasm 7 どこでも動かせて嬉しい でも配布はどうしよう🤔 WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1

    - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 2018年 8月 G o 1.11 リ リ ー ス W asm サ ポ ー ト 2019年 W A SI 0.1 リ リ ー ス 2023年 8月 G o 1.21 リ リ ー ス W A SI 0.1 サ ポ ー ト 2024年 1月 W A SI 0.2 リ リ ー ス 2024年 8月 W A SI 0.2.1 リ リ ー ス W asm O C I A rtifact layout 2025年 W A SI 0.3 リ リ ー ス ? 2025年 2月 G o 1.24 リ リ ー ス W A SI 0.1 リ ア ク タ ー モ ジ ュ ー ル サ ポ ー ト GitHubのリリースファイル? Google Drive? …?
  5. Wasm OCI Artifact layoutの発表 WASIをコンテナレジストリを通して配布できる! Wasm OCI Artifact layout 9

    WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 2018年 8月 G o 1.11 リ リ ー ス W asm サ ポ ー ト 2019年 W A SI 0.1 リ リ ー ス 2023年 8月 G o 1.21 リ リ ー ス W A SI 0.1 サ ポ ー ト 2024年 1月 W A SI 0.2 リ リ ー ス 2024年 8月 W A SI 0.2.1 リ リ ー ス W asm O C I A rtifact layout 2025年 W A SI 0.3 リ リ ー ス ? 2025年 2月 G o 1.24 リ リ ー ス W A SI 0.1 リ ア ク タ ー モ ジ ュ ー ル サ ポ ー ト → WASI 0.2だけでなくWASI 0.1も配布可
  6. Wasm OCI Artifact layoutの発表 WASIをコンテナレジストリを通して配布できる! Wasm OCI Artifact layout 10

    WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 2018年 8月 G o 1.11 リ リ ー ス W asm サ ポ ー ト 2019年 W A SI 0.1 リ リ ー ス 2023年 8月 G o 1.21 リ リ ー ス W A SI 0.1 サ ポ ー ト 2024年 1月 W A SI 0.2 リ リ ー ス 2024年 8月 W A SI 0.2.1 リ リ ー ス W asm O C I A rtifact layout 2025年 W A SI 0.3 リ リ ー ス ? 2025年 2月 G o 1.24 リ リ ー ス W A SI 0.1 リ ア ク タ ー モ ジ ュ ー ル サ ポ ー ト e.g.$ wkg oci push ghcr.io/a-skua/hello hello.wasm ※ wkgを使ってアップロードすると OS=wasip2となりますが, Artifact layoutの仕様としてはOS=wasip1もサポートしています.
  7. Wasm OCI Artifact layoutの発表 WASIをコンテナレジストリを通して配布できる! Wasm OCI Artifact layout 11

    WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 2018年 8月 G o 1.11 リ リ ー ス W asm サ ポ ー ト 2019年 W A SI 0.1 リ リ ー ス 2023年 8月 G o 1.21 リ リ ー ス W A SI 0.1 サ ポ ー ト 2024年 1月 W A SI 0.2 リ リ ー ス 2024年 8月 W A SI 0.2.1 リ リ ー ス W asm O C I A rtifact layout 2025年 W A SI 0.3 リ リ ー ス ? 2025年 2月 G o 1.24 リ リ ー ス W A SI 0.1 リ ア ク タ ー モ ジ ュ ー ル サ ポ ー ト ※ wkgを使ってアップロードすると OS=wasip2となりますが, Artifact layoutの仕様としてはOS=wasip1もサポートしています. e.g.$ wkg oci push ghcr.io/a-skua/hello hello.wasm e.g.$ wkg oci pull -o hello.wasm ghcr.io/a-skua/hello:go Successfully wrote ghcr.io/a-skua/hello:go to hello.wasm e.g.$ wasmtime run hello.wasm Hello, 世界!
  8. GOOS=wasip1 GOARCH=wasm → 安全に実行可能なOneバイナリ → コンテナレジストリを利用して配布できる WASI 0.1 ❌ ネットワーク(ソケット)をサポートしていない

    WASI 0.2 ✅ ネットワーク(ソケット)をサポート Wasm OCI Artifact layout 12 WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 2018年 8月 G o 1.11 リ リ ー ス W asm サ ポ ー ト 2019年 W A SI 0.1 リ リ ー ス 2023年 8月 G o 1.21 リ リ ー ス W A SI 0.1 サ ポ ー ト 2024年 1月 W A SI 0.2 リ リ ー ス 2024年 8月 W A SI 0.2.1 リ リ ー ス W asm O C I A rtifact layout 2025年 W A SI 0.3 リ リ ー ス ? 2025年 2月 G o 1.24 リ リ ー ス W A SI 0.1 リ ア ク タ ー モ ジ ュ ー ル サ ポ ー ト
  9. • IDLWITを用いたインターフェース設計 ◦ = Wasmコンポーネントの採用 ◦ ビルド元の言語に依存しないAPI • ネットワークのサポート •

    CLI以外のエントリーポイントの設計 ◦ wasi:cli/command ◦ wasi:http/proxy • 非同期処理のサポート 0.3〜) package root:component; world root { import wasi:cli/[email protected]; import wasi:cli/[email protected]; export wasi:cli/[email protected]; } WASI 0.2〜 14 Protocol Buffersのような仕組み WITからコード生成できる WITを通してWasmを組み合わせやすくする
  10. • IDLWITを用いたインターフェース設計 ◦ = Wasmコンポーネントの採用 ◦ ビルド元の言語に依存しないAPI • ネットワークのサポート •

    CLI以外のエントリーポイントの設計 ◦ wasi:cli/command ◦ wasi:http/proxy • 非同期処理のサポート 0.3〜) WASI 0.2〜 15 e.g.$ wasmtime serve -S cli http-proxy.wasm Serving HTTP on http://0.0.0.0:8080/ e.g.$ curl http://localhost:8080 Hello, 世界!
  11. wasi:http/proxy ネットワーク通信はランタイム側でハンドリングする → Wasm側はリクエストのハンドリングだけでOK 対応しているホスト環境の例 • wasmtime serve • spin

    ◦ v3.0からwasi:http/proxyに準拠 • wasmCloud ◦ Linuxコンテナの代わりにWasmをホスティングするプロジェクト 17 wasi:http/proxyに準拠 = どこでもHTTPホスティングできる handle(request, response-out) wasi:http/proxy Runtime Resource HTTP
  12. WASI 0.1とWASI 0.2互換性がない GoでWASI 0.2を使う → TinyGo ʕ◔ϖ◔ʔ? GoからWASI 0.2のバイナリを作るには

    21 WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 2018年 8月 G o 1.11 リ リ ー ス W asm サ ポ ー ト 2019年 W A SI 0.1 リ リ ー ス 2023年 8月 G o 1.21 リ リ ー ス W A SI 0.1 サ ポ ー ト 2024年 1月 W A SI 0.2 リ リ ー ス 2024年 8月 W A SI 0.2.1 リ リ ー ス W asm O C I A rtifact layout 2025年 W A SI 0.3 リ リ ー ス ? 2025年 2月 G o 1.24 リ リ ー ス W A SI 0.1 リ ア ク タ ー モ ジ ュ ー ル サ ポ ー ト e.g.$ GOOS=wasip2 GOARCH=wasm tinygo build -o hello.wasm hello.go ※Wasmに関して,TinyGoがサポートを先行して行っている
  13. e.g.$ wkg oci pull -o wasip122.wasm \ > ghcr.io/a-skua/wasip122:0.1.0 e.g.$

    wasmtime run --dir . wasip122.wasm \ > -o hello_p2.wasm hello.wasm GoからWASI 0.2のバイナリを作るには 22 WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 WASI 0.1のAPIをアダプタでラップする方法がある WASI 0.1 WASI 0.2 Adapter Runtime = wasm-tools component new -o <output>.wasm --adapt <adapter>.wasm <input>.wasm
  14. e.g.$ wkg oci pull -o wasip122.wasm \ > ghcr.io/a-skua/wasip122:0.1.0 e.g.$

    wasmtime run --dir . wasip122.wasm \ > -o hello_p2.wasm hello.wasm GoからWASI 0.2のバイナリを作るには 23 WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 WASI 0.1のAPIをアダプタでラップする方法がある = wasm-tools component new -o <output>.wasm --adapt <adapter>.wasm <input>.wasm e.g.$ wasmtime run hello_p2.wasm assertion failed at adapter line 2795Error: fai... Caused by: 0: failed to invoke `run` function ... GoからビルドしたWasmをそのままラップするとエラー になる... WASI 0.1 WASI 0.2 Adapter Runtime
  15. e.g.$ wkg oci pull -o wasip122.wasm \ > ghcr.io/a-skua/wasip122:0.1.0 e.g.$

    wasmtime run --dir . wasip122.wasm \ > -o hello_p2.wasm hello.wasm GoからWASI 0.2のバイナリを作るには 24 WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計 WASI 0.1のAPIをアダプタでラップする方法がある = wasm-tools component new -o <output>.wasm --adapt <adapter>.wasm <input>.wasm e.g.$ wasmtime run ./hello_p2_fix.wasm Hello, 世界! 気合いで動くようになる! WASI 0.1 WASI 0.2 Adapter Runtime
  16. WASI 0.1 WASI 0.2 Adapter Runtime GoからWASI 0.2のバイナリを作るには 25 TinyGoを使わなくとも,アダプタを使えばWASI

    0.2を作って動かすことができそう 1. GOOS=wasip1 GOARCH=wasmでビルド 2. アダプタでラップする 3. 良い感じにゴニョゴニョする a. 詳しくはZennの記事を参考にしてください i. GoのWASI 0.1をWASI 0.2に変換して実行する e.g.$ wasmtime run ./hello_p2_fix.wasm Hello, 世界! WASI - Wasmを汎用バイナリとして利用するためのAPI仕様 WASI 0.1 - POSIX APIを参考に策定 / ネットワークは未サポート WASI 0.2 - Wasmコンポーネントモデルをベースに再設計
  17. Pure Goで体験するWasmの未来 1. WASIを使うことで,OS/Arch問わず安全に実行できる 2. Wasm WASIをコンテナレジストリ経由で配布できる 3. TinyGoを使わなくとも,気合いでWASI 0.2を作る方法がある

    TinyGoを使うことをお勧めします) fin. ツールを作りたい時にGOOS=wasip1 GOARCH=wasmでビルドすると良さそう ツール作成者 - 実行環境別のバイナリを用意しなくても良い - 既存のコンテナレジストリのエコシステムを利用して配布できる ツール使用者 - 既存のコンテナレジストリのエコシステムを利用して取得できる - セキュリティ面でも安心して実行できる WASI 0.2 - ネットワークのサポート - CLI以外のエントリーポイント (wasi:http/proxy) - IDLによるインターフェース設計
  18. • Wasm OCI Artifact layout | CNCF TAG Runtime •

    GoのWASI 0.1をWASI 0.2に変換して実行する リンク 29