9
11

WebAssembly を使ったサーバレス開発の基礎と実践 (ServerlessDays Tokyo 2024 配布用資料)

Last updated at Posted at 2024-09-21
1 / 17

用語解説


WebAssembly

  • スタックベースの仮想マシン用のバイナリ命令フォーマット
    • しばしば拡張子が .wasm であるバイナリファイルのことを指す
    • それ自体は実行ファイルではなく、Wasmランタイムに読み込ませて動作する
      • ランタイムの例:主要なブラウザ、Wasmtime など
  • WebAssembly が使われているケース
    • ブラウザ上: Figma, Photoshop, Unity, Google Meet etc
    • ブラウザ外(Wasi): エッジコンピューティング, コンテナ, IoT etc
  • 参考リンク

WebAssembly 略歴

  • 2012-2013年頃、Emscripten や asm.js といったブラウザ上でアプリケーションを高速に動作させる手法が開発され注目を集める
  • 2015年 Mozilla や Chromium, Edge, WebKit の開発者が W3C コミュニティグループとして WebAssembly の開発開始を発表
  • 2016年 主要なブラウザが実験的なサポートを開始
  • 2019年 W3C 勧告が策定
  • 〜2024年現在 ブラウザ内外の様々なシーンで利用が広がっている

Wasi

  • WebAssembly System Interface
  • システムの各種リソースへのインターフェースを定義
    • 例: File System, Network
  • W3C WebAssebmly CG のサブグループとして活動
  • https://wasi.dev/

例)ビルドターゲットに WebAssembly を指定してコンパイル

$ cat main.rs
fn main() {
  println!("Hello");
}
$ rustc main.rs --target wasm32-wasi
$ ls
main.rs main.wasm

Wasmtime とは

  • WebAssembly, WASI, Component Model のためのスタンドアロンのランタイム
    • Bytecode Alliance が開発
    • リリースログなど確認できる限り開発開始は 5 年以上前(ソース)
    • それ以降 2020 年に、同じく Wasm ランタイムの一つで Fastly が開発してオープンソース化した Lucet の開発チームが合流し、現在も活発な開発が続いている

Wasmtime の特徴


例) Wasmtime を利用した Wasm module の実行

#$ cat main.rs
#fn main() {
#  println!("Hello");
#}
#$ rustc main.rs --target wasm32-wasi
#$ ls
#main.rs main.wasm
$ wasmtime main.wasm
Hello
$ wasmtime compile main.wasm
$ ls
main.cwasm main.rs main.wasm
$ WASMTIME_NEW_CLI=0 wasmtime main.cwasm --allow-precompiled
Hello
$ wasmtime explore main.wasm 
Exploration written to main.explore.html

Wasmtime の性能

  • 高速起動
  • 安全性
    • メモリ安全なRustの採用、各種サプライチェーン安全性への対応、徹底的で執拗なファジング、形式的検証やスペクトル対策などによりセキュリティ対策を強化(2022年9月のBAのブログ記事より引用)

(余談/閑話休題) 上記のような Wasm ランタイムの最適化のほかに、Wasm module (バイトコード) 自体の最適化を行う wizerweval といったプロジェクトもあり、最適化は様々な方向性で実施されている。 ※どちらも Bytecode Alliance のプロジェクト


WebAssembly x サーバレス開発


Wasi の種類

  • Wasi 0.1(p1): 枯れてる仕様。Viceroy などで利用
  • Wasi 0.2: 今年1月にローンチ。Component Model に基づく仕様、wasmtime serveなどで利用

Wasi の動作環境

  • WebAssemblyをセルフホスト
    • オンプレでもマネージドな一般的なサーバレス環境でも
    • 例) コンテナのファイルシステムの中に Wasm ランタイムと Wasm module (.wasmファイル)を格納して実行 [1]
  • WebAssemblyに特化したサーバレスマネージド環境で動作(Fastly Compute, Fermyon等)

[1] (脱線/閑話休題) 先月発表された Wasi 0.2.1 で Wasm Component を Warg だけでなく OCI準拠のコンテナレジストリ(e.g. GitHub Packages, Azure Container Registry, Google Artifact Registry) に fetch/publish などできる仕様が策定完了(ソース)


Fastly Compute の特徴

(詳細は講演資料で紹介、ここでは概要と要約のみ)

  • グローバルで約100拠点ある各POP上のサーバで実行される Wasm バイナリをデプロイ可能
    • VCL では扱えなかった HTTP Req/Res Body の操作含めて汎用言語で操作可能に
  • Rust, Go, JavaScript で開発可能(公式サポート)
    • 非公式 SDK を自作することも可能 (例: Zig, Swift, Ruby, C#)
  • 開発の始め方や SDK の基本的な紹介はここ
  • 主な各種リソース制限はここ
    • 100 MBのパッケージまでアップロード可能、130 sec / process、メモリ消費 128 MB まで等
  • コードの公式サンプル(大量)はここ

Fastly Compute の利用例


お知らせ 1

今年6月に無料プランを提供開始(公式ブログ記事)

  • CDN 無料枠についてわかりやすく紹介されている Zenn の記事

お知らせ 2

明日ワークショップがあります;
Fastly と Glitch の無料プランで作るサーバレス開発入門

(ServerlessDays Tokyo参加者用)登録フォーム:
https://forms.gle/FjoqGYVRzkupURJy8

9
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11