コンテナとの統合の動きも見せる「WebAssembly」の進化とは? | 東京エレクトロンデバイス

Publickey新野淳一IT羅針盤

コンテナとの統合の動きも見せる「WebAssembly」の進化とは?
クラウドネイティブ最新動向(後編)

クラウドネイティブで注目されている技術といえば「eBPF」と「WebAssembly」。この2つの技術のクラウドネイティブにおける最新動向を紹介する。前編「eBPFの利点とその登場が及ぼすクラウドネイティブへの影響とは?」に続き、今回はコンテナとの統合といった動きも見せるWebAssemblyについて、その進化を解説する。

WebAssemblyがOS上でも実行可能に

クラウドネイティブにおいてDockerコンテナが不可欠かつ重要な要素であることは、すでに過去の本コラムで何度も説明してきたので多くの読者がご存じのことでしょう。2019年8月の本コラム「『クラウドネイティブ』とはなにか――『クラウドファースト』となにが違うのか?」では、「クラウド
ネイティブでは仮想マシンではなく、より粒度の細かなコンテナをベースとします。それにより、よりスケーラブルで柔軟なアプリケーションが構築でき、クラウドファーストよりもさらに踏み込んだクラウドのメリットが得られます」と説明しました。

そして、このクラウドネイティブのベースとなっているコンテナに「WebAssembly」が統合されようとしています。2022年10月、Dockerコンテナの開発元であり、Dockerコンテナをベースとした開発ツールであるDocker Desktopを提供するDocker社は、Docker DesktopにWebAssemblyランタイムを統合すると発表しました。

つまり、Docker DesktopでDockerコンテナを扱うのと同じように、WebAssemblyアプリケーションも扱えるようになるのです。言い換えれば、Docker Desktop上でWebAssemblyアプリケーションがDockerコンテナのように扱えるということになります。

WebAssemblyとは、もともとWebブラウザ上で高速に実行できるバイナリフォーマットとして開発されました。これまでWebブラウザで実行できるプログラミング言語は基本的にJavaScriptだけ
でしたが、コンパイルしてWebAssembly形式のバイナリを出力できるプログラミング言語であれば、
どんな言語でもWebブラウザ上で実行可能になるのです。

このWebAssemblyは、OSのAPIを抽象化する業界標準仕様「WASI(WebAssembly System Interface)」の登場によって、WebブラウザだけでなくWindowsやLinuxといったOSの上にWebAssemblyランタイムを配置し、そこでも実行可能となりました。この動きについては本コラムの2020年1月の記事「さまざまな言語と実行環境に対応する“ユニバーサル・バイナリフォーマット”への期待を抱かせるWebAssembly」でも紹介しています。

WASIの登場によりWebAssemblyをサーバーアプリケーションのプラットフォームとして活用する
動きが広がり、前述のDocker DesktopによるWebAssemblyランタイムの統合へとつながるのです。

WebAssemblyがOS上でも実行可能に-東京エレクトロンデバイス
右端がDockerとWebAssemblyを統合する仕組み。高レベルランタイムcontainerdから「container-wasm-shim」経由でWebAssemblyランタイム「wasmedge」を操作 (「Introducing the Docker+Wasm Technical Preview」から引用) (https://www.docker.com/blog/docker-wasm-technical-preview/)

ピンチアウトで拡大

containerdにrunwasiが組み込まれる

当初、Docker DesktopへのWebAssemblyランタイムの統合はDocker社の独自技術によって行われていました。しかし2022年12月、コンテナランタイムの事実上の標準となっているcontainerdに、containerdの管理下で主にコンテナのプロセスを管理する低レベルランタイムruncの代わりに、WebAssemblyランタイムを用いること可能にするshimである「runwasi」が組み込まれました。

つまり、containerd管理下でWASIに対応したWebAssemblyランタイムが実行できるようになったのです。これで、Dockerコンテナと同じようにWebAssemblyランタイムを扱う機能はDocker Desktop独自の機能ではなくなりました。

containerdを利用するさまざまな環境、すなわち事実上のほとんどのDockerコンテナ環境で、Dockerコンテナと同様にWebAssemblyランタイムが扱えるようになったのです。WebAssemblyがDocker
コンテナと同様、これからのサーバーアプリケーションインフラとなる方向性は誰の目にも明らかです。

ガベージコレクションやスレッドへも対応

WebAsesmbly自体の改善も進んでいます。WebAssemblyにはもともとガベージコレクション機能がなかったため、C言語のようにプログラマーが明示的にメモリ管理を行う言語には対応していますが、Javaのように言語ランタイムにガベージコレクション機能が備わっていることを前提とした言語は、WebAssemblyバイナリへのコンパイルが事実上、不可能でした。

しかし現在、WebAssemblyにおけるガベージコレクション機能の仕様策定が進められており、ChromeをはじめとするWebブラウザへの試験的実装も行われています。すでにKotlinやDartなどのプログラ
ミング言語で、WebAssemblyのガベージコレクション機能の利用が始まっており、これまで以上に多様な言語がWebAssemblyへのコンパイルに対応することでしょう。

また、WebAssemblyにスレッドやコンポーネントモデルなどを導入する動きも始まっており、今年から来年にかけて仕様や実装が固まっていくとみられます。

これらが実現することで、マルチスレッドのアプリケーションのほか、さまざまな言語で開発されたWebAssemblyモジュールを組み合わせてアプリケーションを開発するといった、より高度なアプリケーション開発がWebAssemblyで実現することになります。

そして、そうしたツールもしくはツールチェーンをいちから開発する必要はありません。DockerコンテナとWebAssemblyランタイムの統合により、現在のDockerコンテナのツールチェーンを基盤にして、その開発環境は進化していくはずです。またDockerコンテナによって、とくにサーバーアプリケー
ションの開発やテスト、デプロイといった開発ライフサイクルは大きく進化しましたが、WebAssemblyはその進化もさらに推し進めていくことでしょう。

IT羅針盤

※このコラムは不定期連載です。
※会社名および商標名は、それぞれの会社の商標あるいは登録商標です。

新野淳一

新野淳一Junichi Niino

ブログメディア「Publickey」( http://www.publickey1.jp/ )運営者。IT系の雑誌編集者、オンラインメディア発行人を経て独立。新しいオンラインメディアの可能性を追求。

「Kubernetesセキュリティ/コンテナセキュリティ」に関連する製品・サービス