Unofficial SDK で更に便利に Fastly Compute を使う(ために試行錯誤してる話)
2023/12/26
この記事は Fastly Compute (旧 Compute@Edge) 一人アドベントカレンダー 25 日目の記事です。最終日の今回は自分の個人プロジェクトとして、 Fastly Compute の Unofficial SDK のうち Ruby SDK の実装を一部追加している話をします。
この PR にあるような形で未実装となっている C 拡張のコードを少しずつ実装しています。去年 katei さんが実装して公開されたデモで Ruby が Fastly Compute (旧 Compute@Edge)上で動くという最も難しい部分を超えてもらっているので、不足している C 拡張部分を実装して便利にエッジ環境での開発ができたらというナイーブなモチベーションで進めています。
進め方としては、Fastly Compute が Wasm ABI で提供する Hostcall の API の振る舞いについてドキュメントは特に用意されていないので、他の言語での SDK の実装を頼りにトライアンドエラーで実装を進めています。ただ実際に進めてみると、このトライアンドエラーの試行のために毎回 Ruby をソースビルドするのでデバッグに時間がかかりがち(20分前後/回)だったり、そもそもどの gem が WASI 環境で使えるか確認しながら手探りで作業を進める感じもあったりして中々ワイルドな体験をしています。
さて今回マージして取り込んでもらった前述の PR によって、以下のようなコードが Fastly Compute 上で動くようになりました。これまではバックエンドのサーバと通信するためのメソッドが未実装になっていたので、今回は Request をプロキシする(いわゆる普通のリバプロ的な)動作ができるように実装してごく一部のパターンのみ動くようにした感じです。
上記はこちらのデモサイトで動作を確認できます。見事に CSS があたっていないことからも分かっていただけるかと思いますが、この状態だと request の URI/path が毎回固定なので、どんなリクエストに対しても一律に https://www.ruby-lang.org/en/
の内容を返す挙動となっています。これを解消するために、次に request された path に応じてコンテンツを返すために別の C 拡張実装を進める、といった具合に少しずつ実装を進めています。
上記サンプルコードは kateinoigakukun/ruby-compute-runtime の README の手順で環境構築して動かして試せますので、興味がある方は試してみてください。Viceroy という Wasmtime をランタイムとした Fastly Compute 環境のエミュレーションツールを使うことで Fastly のアカウント等を作成せずともローカル環境っでビルドして試すことが可能です。11 日目のアドベントカレンダーで紹介した wizer が Ruby SDK でも使われているところなどは見どころの一つで、同じスクリプト言語として JS SDK と比較した時の最終的な wasm パッケージサイズや実行速度の違いなどを比較してみるなどするのも面白いかもしれません。
about me
@remore is a software engineer, weekend contrabassist, and occasional public speaker. Read more