💡

Fastly Compute SDK の機能と役割 (5) Wasm ABI で定義される Hostcall

2023/12/13に公開

この記事は Fastly Compute (旧 Compute@Edge) 一人アドベントカレンダー 12 日目の記事です。

Fastly Compute での開発に欠かせない SDK について少し深掘りして見ていくシリーズ(Fastly Compute SDKの機能と役割)の第五回目です。本稿では SDK の動作を裏側で支える Hostcall の動きについて、知っておくと開発に便利そうな点を中心に紹介します。

おさらい: Hostcall が呼び出されるまで

以前の記事で SDK を通して Hostcall が呼び出されるまでのフローを簡単に以下のように図示しました。

その際に Compute Platform の Wasm ABI が定義されているリポジトリもご紹介しました。このフォルダには 4 つの .witx ファイルが含まれていて、以下のように compute-at-edge.witx がそれ以外の全ての .witx をインポートする構成になっています。

以下ではこの compute-at-edge.witx において現時点で定義されているインターフェースについてモジュール単位で概要を簡単にまとめてみたいと思います。これを知っていると、ある SDK で使いたい機能が見つからない時でも、使えない理由がある程度わかるようになりますし(例:他の SDK では使えるのか、またはそもそも Hostcall のレベルで機能が開放されていないのか、等)、あるいは自分で好みの言語の SDK を自作したくなったような時でも API の実装を検討する上で大きな助けになったりします。

定義されているモジュールの概要

頻繁に使われるモジュール:

  • fastly_http_req / fastly_http_resp / fastly_http_body: HTTP リクエスト/レスポンスの作成や送受信に利用できる各種メソッドの定義
  • fastly_backend: Dynamic Backend を利用する際や Health Check を行う際必要なメソッド定義

Cache 関係のモジュール:

  • fastly_cache: Cache API 用のメソッド定義 (e.g. SimpleCache, CoreCache 用の lookup/insert, transaction_lookup/transaction_insert といったメソッドや、cache 書き込み時の各種オプション(e.g. TTL, サロゲートキー etc)
  • fastly_purge: 指定のサロゲートキーで Cache のパージを行うためのメソッド定義

EdgeStorage 関係のモジュール:

  • fastly_object_store: KVStore API 用のメソッド定義 (e.g. open/lookup/insert )
  • fastly_secret_store: SecretStore API 用のメソッド定義 (e.g. open/get)
  • fastly_config_store: ConfigStore API に利用できる open/get メソッドの定義
    • 元々は fastly_dictionary という module として公開されていたが、現在は機能名が ConfigStore に変更され、dictionary api については deprecated 扱いとなっている

その他知っておくと便利かもしれないモジュール:

  • fastly_log: リアルタイムロギングのためのメソッドの定義
  • fastly_uap / fastly_device_detection: UserAgent 文字列を parse したり文字列をもとにデバイスを判別したりするのに使えるメソッドの定義
  • fastly_geo: IP アドレスを利用して位置情報を検索する際に利用するメソッドの定義
  • fastly_erl: Edge Rate Limiting 関係のメソッド定義
  • fastly_async_io: 非同期の IO 制御を行うために使えるメソッドの定義 (e.g. JavaScript SDK ではこの Hostcall を使って setTimeout/setInterval 等の実装を行なっている)
  • fastly_abi: Hostcall 利用時に共通して利用する init メソッドの定義

Hostcall を呼び出す API 実装の具体例

理解を深めるために、例として fastly_http_body module の new メソッド(API)の実装例を紹介します。このメソッドは、その後の各種 Body に関する処理(例:Bodyの書き込み 等)を呼び出すために必要になる body_handle を取得するためのメソッドです。

例えば Go SDK の場合の実装は以下のように go:wasmimport ディレクティブを利用して ABI 定義を使うことで実装されています。この場合 fastlyHTTPBodyNew() が Hostcall にあたり、NewHTTPBody() が SDK が開発者に提供する API となります。

https://github.com/fastly/compute-sdk-go/blob/main/internal/abi/fastly/hostcalls_guest.go#L178-L195

多くの場合 Hostcall の API と SDK の API は一対一で対応していますし、API の内容も get や set といった単純な内容である場合もあり、読んでみると意外に読みやすかったりします。もし SDK の API について疑問や不思議な点に気がついたら、Hostcall についても調べてみることもお勧めです。

まとめ

本シリーズ(SDK の機能と役割)の最終回となる本稿では SDK の動作を支える Hostcall の概要について簡単にご紹介しました。次のシリーズ以降は少しずつ SDK を利用した実装の話に入っていきます。明日の記事では、 HTTP リクエストの作成時に気をつけたいことについていくつかご紹介します。

Discussion