Cloudflare WorkersでWASIが使えるらしいという記事 を見てすごいと思ったので試してみた。
環境#
- rustc 1.73.0
- Cloudflare Workers
- npm
npx wrangler@wasm
を実行するのに必要です
- wasmtime
本題#
前準備#
ビルドターゲットにwasm32-wasi
を使うので、wasm32-wasi
をインストールします。
rustup target add wasm32-wasi
まずcargo new
でプロジェクトつくります
cargo new hello_world
一度実行してみます
cargo run
当然ですが以下の出力になります
Hello, world!
これをwasmにビルドします
cargo build --target wasm32-wasi --release
target/wasm32-wasi/release
にhello_world.wasm
ファイルができます。
試しに手元でwasmが動くか確認したいのでwasmランタイムのwasmtimeを使ってみます。
まずはwasmtimeのインストール
curl https://wasmtime.dev/install.sh -sSf | bash
次にwasmを実行してみます。
wasmtime target/wasm32-wasi/release/hello_world.wasm
これもHello, world!
と出力されます。ここまでで下準備は完了です。
Cloudflare Workersで動かす#
npx wrangler@wasm dev target/wasm32-wasi/release/hello_world.wasm
⛅️ wrangler 0.0.0-c0d7699
---------------------------
⬣ Listening at http://localhost:8787
こんな感じでサーバーが立ち上がるのでブラウザなどでアクセスするとHello, World!
が出力されるのがわかると思います。
どうやらHTTPリクエストをトリガーにmain関数が叩かれているようです。
POSTリクエストを使えば標準入力を渡せるっぽいのでやってみます。
まずは標準入力を受け取るようなコードに書き換えます
fn main() {
let mut input = String::new();
std::io::stdin().read_line(&mut input).unwrap();
println!("Hello, world! {}", input);
}
これを再度ビルドして、wranlgerで実行します。
cargo build --target wasm32-wasi --release
npx wrangler@wasm dev target/wasm32-wasi/release/hello_world.wasm
curlでPOSTリクエストを送ってみます。
curl -X POST -d sh1ma https://localhost:8787
レスポンスはHello, World! sh1ma
となりました。
まとめ#
こんな感じでただのrustプログラムをCloudflare Workersで動かすことができました。
ただ現状WASIからCloudflare d1のAPIなどを叩くことはできない?らしい(人に聞いた)です。
これを使って画像からexifを削除した結果を返すFunctionを作ってみようと思ってるので出来たらgithubにコードあげると思います。