blog.sh1ma.dev

プログラムが好きです
2023-11-17

Cloudflare WorkersでWASIが使えるらしいので試した

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/releasehello_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にコードあげると思います。