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

Pure Goで体験するWasmの未来

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
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