Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Axum+RustをWebAssemblyを使ってCloudflare Workersで動かしてみた

Axum+RustをWebAssemblyを使ってCloudflare Workersで動かしてみた

axumで開発中のSlackbotをCloudflare Workersで動かす際に得た知見をシェアします。

More Decks by PharmaX(旧YOJO Technologies)開発チーム

Transcript

  1. (C)PharmaX Inc. 2023 All Rights Reserve 2 自己紹介 • YOJO事業部

    エンジニアリーダー • 開発生産性集計SlackBotをRustで 開発中です • 息子の運動会のためにリングフィッ ト再開しました 古家 大 X(旧Twitter)
  2. (C)PharmaX Inc. 2023 All Rights Reserve 9 Rust開発環境の準備 Even Better

    TOMLを導入 (.tomlのシンタックスハイライト用)
  3. (C)PharmaX Inc. 2023 All Rights Reserve 10 WranglerでCloudflare Workersのワーカーの雛形作成 npx

    wrangler generate [プロジェクト名] https://github.com/cloudflare/workers-sdk/templates/experimental/worker-rust
  4. (C)PharmaX Inc. 2023 All Rights Reserve 11 Cloudflare Workersについて •

    Cloudflare社のCDNのエッジでJavaScriptを動かせる • 他にもVercel Edge Functions・Deno Deployとか色々ある • コンテナを使用しないサーバーレス環境
  5. (C)PharmaX Inc. 2023 All Rights Reserve 12 Cloudflare Workersの対応言語 •

    JavaScript / TypeScriptが基本 • JavaScriptにコンパイルできる他言語もサポート (Kotlin / Dart / Python / Scala / Perl / PHP / OCaml / F#) • WebAssembly(Wasm)に対応しているので、Rust・C・C++等でコンパ イルしたバイナリを使ってネイティブに近い速度で実行可 → Rustで書いたコードを動かすにはWasmコンパイルが必要
  6. (C)PharmaX Inc. 2023 All Rights Reserve 13 WebAssemblyについて • 元々Webブラウザ上でJavaScriptでは荷が重い処理(グラフィック処理な

    ど)を高速に実行できるバイナリーフォーマットとして開発 • 2017年に主要なブラウザはすべてサポートを開始 • 今ではWebブラウザ以外でもエッジコンピューティングなど 高速動作が求められる環境で活用が広まっている
  7. (C)PharmaX Inc. 2023 All Rights Reserve 14 WranglerでCloudflare WorkersにRustアプリをデプロイ •

    npx wrangler deployをするだけでWasmコンパイルされ秒速デプロイ • CloudFlareのアカウント登録は事前に必要 • 無料でhttps://プロジェクト名.サブドメイン.workers.dev を発行
  8. (C)PharmaX Inc. 2023 All Rights Reserve 15 axumをCloudflare Workersで動かすには •

    そのままだとCloudflare Workersとaxumが競合して動かない • リクエストとレスポンスの型が異なるため変換が必要だったり (Worker::Request ⇔http::Request) • Cloudflare Workersのworker::ENVがAxumルート内で使えなかったり • 上記を行うため axum-cloudflare-adapter というクレートを使う
  9. (C)PharmaX Inc. 2023 All Rights Reserve 17 axumをWasm対応させる • axumのデフォルト機能の一つであるtokioを無効化(wasm未対応のため)

    https://docs.rs/tokio/latest/tokio/#wasm-support • 他のデフォルト機能も無効化するため必要なjson機能は明示的に有効化 https://docs.rs/axum/latest/axum/#feature-flags
  10. (C)PharmaX Inc. 2023 All Rights Reserve 18 axum-cloudflare-adapterを使った書き方でmainを更新 • workerとaxumの

    request・responseを変 換 • Workerのenvをラッパー 用の構造体に格納して State管理
  11. (C)PharmaX Inc. 2023 All Rights Reserve 19 axumのStateを利用した環境変数の渡し方 • 状態管理のためのStateという概念はaxum

    v0.6から導入された • axum+Cloudflare WorkersではWorkerで設定した環境変数をstateで渡す
  12. (C)PharmaX Inc. 2023 All Rights Reserve 24 axumをCloudflare Workersで使ってみて •

    現状、axum-cloudflare-adapterを使うしかなさそう • Cloudflare WorkersやWasm対応のまとまったドキュメントがないので大変 • Cloudflare Workersの爆速デプロイ・レスポンスには感動したので 引き続きSlackbot開発など小さい所から使っていきたい (個人利用なら無料でも十分そう) • axum-cloudflare-adapterのコードリーディングを通して Rustやaxumの仕組みについて理解が深まった