Fastly のネイティブ WebAssembly コンパイラ & ランタイム「Lucet」を発表

本日Fastly WebAssembly コンパイラランタイムであるオープンソースの Lucet発表できることを非常に喜ばしく思います。WebAssembly Web ブラウザがネイティブに近い速度で安全にプログラムを実行できるよう作成されたテクノロジーで、2017年初頭から4つの主要ブラウザに取り入れられています。

Lucet WebAssemblyブラウザの枠を超えて利用し、Fastlyエッジクラウド上でより速く、より安全に実行できるプラットフォームを構築するために設計されています。WebAssembly Rust TypeScript、C、C++ などの多くの言語で既にサポートされていて、開発過程ではさらに多くの言語で WebAssemblyサポートされています。Fastly は、お客様が Fastly VCL域を超えてより多くのロジックをエッジに移し、任意の言語を使えるようにしたいと考えています。LucetWebAssembly使用した Fastlyエッジコンピューティング用実験プラットフォームである Terrarium搭載されているエンジンです。Lucet は、まもな Fastlyエッジクラウドでも利用できるようにな予定です。

Lucet主な設計要件は、Fastly扱う1つ1つのリクエストを実行できるようにすることでした。これは、単一プロセスで1秒間に何万件というレベルで発生するリクエストに対して WebAssembly インスタンスを生成するということです。これには JavaScript エンジンのブラウザよりもはるかに低いランタイムフットプリントが必要になります。Lucet は、わずかキロバイトのオーバーヘッドメモリにより WebAssembly モジュールを50マイクロ秒以下でインスタンス化することができます。比較すると、Chromium V8 エンジンでは JavaScript もしくは WebAssembly プログラムのインスタンス化に 5 ミリ秒の時間と数十メガバイトのオーバーヘッドメモリが必要です。

Lucet使うと、Fastlyエッジクラウドはセキュリティを損なうことなく同一プロセスで同時に数千もの WebAssembly プログラムを実行することができます。Lucetコンパイラとランタイムは共に動作して WebAssembly プログラムがそれぞれの独自リソースにのみアクセスできるようにします。これはFastly客様が当社が常に提供しているセキュリティと安全性を損なうことなく、より一般的で汎用な言語でプログラムを記述し実行できるようになるということを意味しています。

Lucet は、WebAssembly実行責任を WebAssembly モジュールをネイティブコードにコンパイルするコンパイラと、リソース管理およびランタイム障害を捕捉するランタイムという2つのコンポーネントに分離しています。Lucet WebAssemblyネイティブコードに事前 (AOT) コンパイルするよう設計されているソフトなので、ブラウザエンジンが利用している実行時 (JIT) コンパイル戦略と比較してランタイムの設計とオーバーヘッドが大幅に簡素化されています。

Lucet構築方法

Lucet Cranelift Code Generator 上に構築されています。この Cranelift プロジェクトは Firefox WebAssembly JavaScript JIT エンジンを使えるよう Mozillaよって作成されたもので、現在は Firefox Nightlyプレゼンスフラグ有効にできます。Fastly Cranelift設計と実装に 取り組んでおり、これにより Firefox ユーザーの Web 体験についても向上させることができることを嬉し思っています。

Lucet WebAssembly System Interface (WASI)サポートします。WASI は、WebAssembly プログラムへのファイルシステム、ネットワーキング、そのシステム機能にレベルのインターフェイスを公開するために新たに提案された安全標準です。Lucet チームは Mozillaその他と協力して、このシステムインターフェースの設計、実装、および標準化に取り組んでいます。

Fastly は、このプロジェクトに2017年から取り組んでいたので、ついに公開できることに非常に喜んでいます。また、Lucet Fastly初めてプログラミング言語の Rust使ったプロジェクトでもあったので、このプロジェクトでのRust大きな成功を報告できることを嬉し思います。この言語を使う新規 Rust ユーザーは、迅速に生産性を向上できたことがわかりました。ライブラリエコシステムでは、WebAssembly動作する多くの有効なライブラリを提供します。Lucet開発初期、Fastly C 言語でランタイムの最初のバージョンを実装しました。しかし、最近になって C 言語のランタイムを Rust戻して移植し、その処理内で安全性や同時実行性バグを複数発見し修正しました。

Terrarium プロジェクトのエンジンとして、Lucet数か月の稼働テストで2018年後期の開始以降、数千ものさまざまな WebAssembly プログラムを実行してきました。また、詳細なサードパーティのセキュリティ評価対象にもなっています。

Lucetクイックデモ

まずは GitHub から Lucetクローンしてください。

$ git clone --recurse-submodules https://github.com/fastly/lucet

README にはDocker使った開発環境のセットアップ方法が記載されています。Docker既にインストールされている場合の手順は1つだけです。すべて完了するには数分かかることがあります。

$ cd lucet
$ source devenv_setenv.sh

では、ちょっとした C プログラムを作成して Clang WebAssemblyコンパイルします。

$ mkdir demo
$ cd demo
$ cat > hello.c <<EOT
#include <stdio.h>
int main(int argc, char* argv[])
{
if (argc > 1) {
printf("Hello from Lucet, %s!\n", argv[1]);
} else {
puts("Hello, world!");
}
return 0;
}
EOT
$ wasm32-unknown-wasi-clang hello.c -o hello.wasm

これで WASI利用するよう設定された Lucet コンパイラを使って、WebAssemblyネイティブコードにコンパイルできるようになりました。

$ lucetc-wasi hello.wasm -o hello.so

最後に、WASI使うよう設定された Lucet ランタイムでネイティブコードを実行します。

$ lucet-wasi hello.so
Hello, world!
$ lucet-wasi hello.so world
Hello from Lucet, world!

ドキュメントやその他の例は Lucet リポジトリで確認できます。

エッジクラウドのその先へ

オープンソースの Lucet Fastly注目しているのは、WebAssembly Web ブラウザやエッジクラウドの域を超える大きな可能性が秘められているからです。たとえば、Lucet WASI 対応は、ユーザーが任意のプラットフォーム (クラウド、エッジ、ブラウザ、ノートパソコンやスマートフォンのネイティブなど) でその強力なセキュリティ保証を保ったまま実行できる WebAssembly プログラムへの大きな一歩です。Fastly は、動的言語、インタプリタ、JIT コンパイラ上に構築された現在のソリューションよりも少なリソースを使いながら、スクリプティングや拡張を許容するあらゆるプログラム内で WebAssembly実行できるようにしたいと考えています。

最も重要なことは、Fastly Lucet、Cranelift、WASI、およびその他の WebAssembly 対応テクノロジーのオープンソースコミュニティと協力していきたいということです。Fastlyオープンソース上に構築されているので、オープンソースのサポートに積極的に取り組んでいますオープンソースコードなしには Lucet構築できませんでした。Fastlyこれまで夢見たこともないような新しいことを Lucet実現できることを願っています。

Pat Hickey
Principal Software Engineer
投稿日
興味がおありですか?
エキスパートへのお問い合わせ
この投稿を共有する
Pat Hickey
Principal Software Engineer

Pat Hickey Fastly 分離技術チームのプリンシパルソフトウェアエンジニアです。Fastly 入社前は、セーフティクリティカルなシステムのオペレーティングシステムとコンパイラの開発に取り組みました。