Slide 1

Slide 1 text

Axum+Rustを WebAssemblyを使って Cloudflare Workersで 動かしてみた 2023/10/18 古家 大

Slide 2

Slide 2 text

(C)PharmaX Inc. 2023 All Rights Reserve 2 自己紹介 ● YOJO事業部 エンジニアリーダー ● 開発生産性集計SlackBotをRustで 開発中です ● 息子の運動会のためにリングフィッ ト再開しました 古家 大 X(旧Twitter)

Slide 3

Slide 3 text

(C)PharmaX Inc. 2023 All Rights Reserve 3 今回やりたいこと Axum+Rustで開発中のSlackbotをCloudflare Workersで動かす

Slide 4

Slide 4 text

(C)PharmaX Inc. 2023 All Rights Reserve 4 rustupでRust環境をインストール Rust開発環境の準備

Slide 5

Slide 5 text

(C)PharmaX Inc. 2023 All Rights Reserve 5 rust-analyzerの導入 Rust開発環境の準備

Slide 6

Slide 6 text

(C)PharmaX Inc. 2023 All Rights Reserve 6 型推論による返り値の型の表示 rust-analyzerの機能例

Slide 7

Slide 7 text

(C)PharmaX Inc. 2023 All Rights Reserve 7 メソッド呼び出し時の引数情報の表示 rust-analyzerの機能例

Slide 8

Slide 8 text

(C)PharmaX Inc. 2023 All Rights Reserve 8 定義へのジャンプ機能 rust-analyzerの機能例

Slide 9

Slide 9 text

(C)PharmaX Inc. 2023 All Rights Reserve 9 Rust開発環境の準備 Even Better TOMLを導入 (.tomlのシンタックスハイライト用)

Slide 10

Slide 10 text

(C)PharmaX Inc. 2023 All Rights Reserve 10 WranglerでCloudflare Workersのワーカーの雛形作成 npx wrangler generate [プロジェクト名] https://github.com/cloudflare/workers-sdk/templates/experimental/worker-rust

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

(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コンパイルが必要

Slide 13

Slide 13 text

(C)PharmaX Inc. 2023 All Rights Reserve 13 WebAssemblyについて ● 元々Webブラウザ上でJavaScriptでは荷が重い処理(グラフィック処理な ど)を高速に実行できるバイナリーフォーマットとして開発 ● 2017年に主要なブラウザはすべてサポートを開始 ● 今ではWebブラウザ以外でもエッジコンピューティングなど 高速動作が求められる環境で活用が広まっている

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

(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 というクレートを使う

Slide 16

Slide 16 text

(C)PharmaX Inc. 2023 All Rights Reserve 16 Cargo.tomlはaxum-cloudflare-adapterに合わせる https://github.com/logankeenan/axum-cloudflare-adapter/blob/main/example/Cargo.toml 依存関係がシビアで バージョンまで合わせないとな かなか動かない

Slide 17

Slide 17 text

(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

Slide 18

Slide 18 text

(C)PharmaX Inc. 2023 All Rights Reserve 18 axum-cloudflare-adapterを使った書き方でmainを更新 ● workerとaxumの request・responseを変 換 ● Workerのenvをラッパー 用の構造体に格納して State管理

Slide 19

Slide 19 text

(C)PharmaX Inc. 2023 All Rights Reserve 19 axumのStateを利用した環境変数の渡し方 ● 状態管理のためのStateという概念はaxum v0.6から導入された ● axum+Cloudflare WorkersではWorkerで設定した環境変数をstateで渡す

Slide 20

Slide 20 text

(C)PharmaX Inc. 2023 All Rights Reserve 20 Cloudflare Workersでの環境変数の設定方法

Slide 21

Slide 21 text

(C)PharmaX Inc. 2023 All Rights Reserve 21 Cloudflare Workersでの環境変数の設定方法 ● SecretsもGUIから設定可能

Slide 22

Slide 22 text

(C)PharmaX Inc. 2023 All Rights Reserve 22 Slackbotの認証処理でSecretsを読み取り

Slide 23

Slide 23 text

(C)PharmaX Inc. 2023 All Rights Reserve 23 Slackbotの認証処理でSecretsを読み取り

Slide 24

Slide 24 text

(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の仕組みについて理解が深まった

Slide 25

Slide 25 text

(C)PharmaX Inc. 2023 All Rights Reserve 25 ご清聴ありがとうございました!