📀

Fastly Compute SDK の機能と役割 (3) 各 SDK の特徴 <前編: Rust, Go>

2023/12/11に公開

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

Fastly Compute での開発に欠かせない SDK について少し深掘りして見ていくシリーズ(Fastly Compute SDKの機能と役割)の第三回目です。本稿では各言語 SDK の特徴について紹介します。

Rust SDK

昨日の記事でも触れましたが Rust SDK の特徴は呼び出せる機能が最も多いことで、新機能を積極的に使う場合やパフォーマンスを重視する場合は特に Rust が有力な選択肢になります。

Rust の場合、$fastly compute build コマンドは内部的に以下のコマンドを実行します(source)。ターゲットに wasm32-wasi を指定しただけのごく普通の cargo build コマンドです。

cargo build --bin %s --release --target wasm32-wasi --color always

あとは Cargo.toml の dependencies に fastly = "<任意のバージョン>" が追加されていれば SDK の API が利用可能になります。

ソースコードの調べ方

Rust の場合ちょっと特殊なのが、SDK のソースコードが GitHub 上でホストされていないことです。 https://docs.rs/ で公開されているソースコードを確認することで多くの場合事足りるのですが、Rust の SDK は複数の crate から構成されていることもあってたまに見辛く感じることがあります。以下に fastly crate を構成する crate を以下に並べて書いておきます。

SDK のコードベース自体はこじんまりとしていて見通しは非常に良いので、UI 上見づらいことはあっても読解にはそこまで困らないかと思います。関連する小ネタとして、がっつり SDK のソースコードを調べる必要が出た場合などは、docs.rs によると https://docs.rs/crate/fastly/0.9.9/download みたいな URL を叩くとドキュメント一式をダウンロードできるみたいなので、こちらをローカルに保存して使っても良いかもしれません。(全文検索したい時とかは便利かも)

#[fastly::main] マクロ

名前から大体想像できるので特別な補足は必要なさそうですが、例えば fastly-macros crate には Rust のサンプルコードによく出てくる #[fastly::main] マクロの処理が定義されています。docs.rs にも解説があるので冗長かと思いつつ一応こちらにも記載しておくと、以下のようなマクロつきのサンプルコードを通常よく見ると思うのですが

use fastly::{Error, Request, Response};

#[fastly::main]
fn main(req: Request) -> Result<Response, Error> {
    Ok(req.send("example_backend")?)
}

このコードは以下のマクロなしのコードと同等の動作をします。

use fastly::{Error, Request};

fn main() -> Result<(), Error> {
    let req = Request::from_client();
    let resp = req.send("example_backend")?;
    resp.send_to_client();
    Ok(())
}

マクロを使わないケースとしては、こちらのサンプルコードのように response を返す処理にマクロで定義される send_to_client() ではなく stream_to_client() を使う必要があるケースなどではマクロを使わないケースももしかするとたまに出てくるかもしれません。

Go SDK

Go SDK の一つの特徴に通常の Go と TinyGo の両方を選べる点があります。Wasm のファイルサイズにこだわる場合は TinyGo を、Standard / 3rd party 含む豊富なライブラリパッケージを最大限活用する場合は通常の Go を、といったように状況に合わせて使い分けることが可能です。(通常の Go と TinyGo をスイッチする際の手順は README を参照してください

Go の場合、$fastly compute build コマンドは内部的に以下のコマンドを実行します。こちらもターゲットに wasm や wasi といった標準的なオプションを指定しただけのなんの変哲もない go build コマンドです。

# Go の場合
GOARCH=wasm GOOS=wasip1 go build -o bin/main.wasm .
# TinyGo の場合
tinygo build -target=wasi -o bin/main.wasm .

SDK のソースコードは整理されており見やすいので特に補足はありません。一つオススメしたいポイントとしては、go の場合 _examples フォルダの内容が充実している点です。例えば "Fastly Compute の Go SDK では Goroutine は動きますか?" という質問を受けることがたまにあって、回答としては動きます、という回答になりますが、実際公式 Web サイトのサンプルでは数例くらいしか出てこなかったりするなど見つけづらかったりします。ところが SDK の方の _example/ フォルダであれば multiple_goroutines というそのままドンピシャなテーマのサンプルが見つかったりしますし、それ以外のサンプルも充実しています。

まとめ

当初本稿で JavaScript も含めてまとめて全 SDK の機能詳細を紹介しようと思っていましたが、少し内容が長くなってきたため内容を分割して、残る JavaScript SDK については明日の記事で紹介します。

Discussion