Slide 1

Slide 1 text

Pure Goで体験する Wasmの未来 2025.9

Slide 2

Slide 2 text

WHOAMI 2 name = asuka fav = Wasm [org] name = 株式会社モニクル role = SWE [sns] X = @a_skua GitHub = @a-skua Bluesky = @askua.dev

Slide 3

Slide 3 text

Pure Goで体験するWasmの未来

Slide 4

Slide 4 text

GOOS=wasip1 GOARCH=wasm

Slide 5

Slide 5 text

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 リ ア ク タ ー モ ジ ュ ー ル サ ポ ー ト

Slide 6

Slide 6 text

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つだけで良い

Slide 7

Slide 7 text

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? …?

Slide 8

Slide 8 text

Wasm OCI Artifact layout

Slide 9

Slide 9 text

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も配布可

Slide 10

Slide 10 text

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もサポートしています.

Slide 11

Slide 11 text

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, 世界!

Slide 12

Slide 12 text

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 リ ア ク タ ー モ ジ ュ ー ル サ ポ ー ト

Slide 13

Slide 13 text

WASI 0.2〜

Slide 14

Slide 14 text

● 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を組み合わせやすくする

Slide 15

Slide 15 text

● 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, 世界!

Slide 16

Slide 16 text

wasi:http/proxy

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

wasi:http/proxy ネットワーク通信はランタイム側でハンドリングする → Wasm側はリクエストのハンドリングだけでOK 18 handle(request, response-out) wasi:http/proxy Runtime Resource HTTP どこかでみたことあるような...? async fetch(req)...? func Handler(w, r)...?

Slide 19

Slide 19 text

WASI 0.2って Goじゃ使えないんでしょう?

Slide 20

Slide 20 text

GoからWASI 0.2のバイナリを作るには

Slide 21

Slide 21 text

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がサポートを先行して行っている

Slide 22

Slide 22 text

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 .wasm --adapt .wasm .wasm

Slide 23

Slide 23 text

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 .wasm --adapt .wasm .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

Slide 24

Slide 24 text

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 .wasm --adapt .wasm .wasm e.g.$ wasmtime run ./hello_p2_fix.wasm Hello, 世界! 気合いで動くようになる! WASI 0.1 WASI 0.2 Adapter Runtime

Slide 25

Slide 25 text

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コンポーネントモデルをベースに再設計

Slide 26

Slide 26 text

GoからWASI 0.2のバイナリを作るには TinyGoを使わなくとも,アダプタを使えばWASI 0.2を作って動かすことができそう(多分) 26 handle(request, response-out) wasi:http/proxy Runtime Resource HTTP func Handler(w, r) WASI 0.1α handle(request, response-out) wasi:http/proxy Adapter ※Go1.24以降

Slide 27

Slide 27 text

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によるインターフェース設計

Slide 28

Slide 28 text

Pure Goで体験するWasmの未来

Slide 29

Slide 29 text

● Wasm OCI Artifact layout | CNCF TAG Runtime ● GoのWASI 0.1をWASI 0.2に変換して実行する リンク 29