たまごかける日報

ここにAA貼りたい

Cloudflare と Fastly で wasm on edge の素振りと雑な所感 🦀

クリスマスですね

どうも、メリークリスマス🎄🎅🎄
会社のアドベントカレンダーにこんな日記みたいな記事を書いてしまって死にたみが高まる @kakerukaeru です。

最近のぼく

去年ぐらいから、Cloudflare が Edge 上で JavaScript を実行できるようにする Cloudflare Workers を発表したかと思えば、Akamai も負けじと Edge Workers を Edge Conference で発表したりして、今までの面倒な CDN の Configuration からより Dynamic な Routing だったり Caching の設定を Code で表現出来るようになってきてて夢が広がるなぁ〜と思いつつ、Cloudflare Workers を遊びでちびちび触ったりしていた。

ちなみに、Akamai の Edge Workers は楽しみではあるんだけど、まだまだ private β っぽくて触れるようになるのはまだ先かぁといた感じだったので、触ってない。Cloudflare Workers は既に本番でも使えるし、無料で遊べる場所もあったりlocal で debug 出来る仕組みも整ってあるので興味があれば触ってみて欲しい。結構簡単に挙動の変更ができるので触ってて楽しいと思う。

そんな中、とはいえ一旦 vcl でいいや〜と fastly をちまちま本番導入してたりしたら、Cloudflare が Cloudflare Workers を WebAssembly に対応させるわと発表したり、Fastly Workers とか来るんじゃね〜と冗談をいってたら Worker をすっ飛ばして Fastly も WebAssembly 対応するわと言う発表が今年の年末にかけて飛び出してきた。

今まで CDN 上での HTTP Request を Rich にハンドリングできる Worker だったり vcl だったりとは違い、(本当に wasm にそんな事をさせるのか?という事はさておき)使える module の制限はあるものの、API と static resources さえ用意できれば、簡単なサイトの Rendering を edge で完結できるのではという様な違う方向にも夢が広がり始めた。

wasm on edge

普段自分が仕事で関わってる領域でいうと、冷静に wasm をゴリゴリ使う様なシーンはまだまだあまり想像できないんだけど、なんとなくどんな使用感なのかは知っておきたくて、一旦触ってみることにした。

wasm 自体は初心者だったので、一旦 Rust 🦀 and WebAssembly 🕸 チュートリアルを掻い摘みつつ...

Cloudflare de wasm

先程、Cloudflare Workers は 無料の遊び場 があるって言ったんだけどこの子は wasm に対応してないので、Cloudflare の Account を作成して Worker を有効化した環境($5/Month)を用意してからじゃないと試せない。

Worker は遊び場の感覚で設定するとして、wasm は compile 済みの file を何がしかで upload する必要がある。Resource Binding APIAPI 経由で upload する形式と、Worker の edit 画面から GUI 経由で upload する方法がある。

今回は使用感を知りたいだけなので、GUI からポチポチ file を uload する方法を取った。 bind した module をどうやって呼び出すのか一瞬わからなかったけど、upload したときの名前で呼び出せるみたいだった。結構簡単

f:id:kakerukaeru:20181224161133p:plain
isqrtという、variables nameでwasmをuploadしてるのがわかる

設定してた worker はこんな感じ。特になにもない。

let instance = new WebAssembly.Instance(isqrt, {});

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request));
});

/**
 * Fetch and log a request
 * @param {Request} request
 */
async function handleRequest(request) {
  const url = new URL(request.url);
  const num = url.searchParams.get('num') || 1;
  let squareroot = instance.exports._Z7Q_rsqrtf(num);
  return new Response(squareroot, { status: 200 });
}

Fastly de wasm

Fastly はまだ production には出てないが、最近発表された Fastly LabsTerrarium で wasm on edge が遊べるようになっている。Cloudflare と違って compile 済みの file を upload するのではなく、fastly 上で build を走らせるぽい。そして、ホスト側の機能を叩けるように faslty 側で用意してくれてる http_guest の Code も公開されていた。でもなんで Rust だけ公開されてるんだろう。

f:id:kakerukaeru:20181224190107p:plain
Browser上で好きなCodeを編集してdeployできる

まだ、sandbox 感が強くて正直どんな感じで本番時に適用させるのか想像がつかないけど、もうちょっと情報公開されてきたら触ってみたい。

もうちょっと触ってみたかったんだけど、サンプルプログラム書き換え〜とかしかする時間がなくて断念した

雑所感

近年 CDN layer で出来る事がどんどん増えていって、昔のただ Cache させるという単純な CDN からどこまで役割を広げるかを悩むシーンが増えてきた気がする。個人的にはまだまだ従来の origin でやっていた WebServer の責務をよりユーザーに近い Edge に負わせて origin の CPU resources の節約と 柔軟な Caching Configuration による Performance 向上といった所までしか考えてはいないんだが、来るべき満塁のチャンスのためにこれからも CDN 界隈の動きを注視して素振りを続けようと思う。

あともうちょっと wasm のもくもく会して、ちょっと Rich なナニカを作ってみたい。