はじめに:なぜRustとWASMがサーバーレスで注目されるのか?
サーバーレスコンピューティング、特にエッジ環境では、低レイテンシーと高速なコールドスタートが極めて重要です。従来のコンテナやVMベースのサーバーレスは、起動時間に課題を抱えることがありました。ここで注目されているのがRustと**WebAssembly (WASM)**の組み合わせです。
- Rustの強み: メモリ安全性、高いパフォーマンス、そしてC/C++に匹敵する低レベルな制御を、ガベージコレクションなしで実現します。これにより、予測可能で安定したパフォーマンスを持つコードを記述できます。
- WASMの強み: ブラウザだけでなく、サーバーサイドでも動作するポータブルなバイナリフォーマットです。軽量なサンドボックス環境で安全に実行でき、起動時間が非常に短い(マイクロ秒単位)という特徴があります。
この2つを組み合わせることで、**「安全で、非常に高速かつ軽量なサーバーレス関数」**を実現できます。JavaScript/TypeScriptで書かれた既存のサーバーレス関数の一部(CPU負荷が高い処理など)をRust+WASMに置き換えることで、パフォーマンスを劇的に改善することも可能です。
本記事では、Cloudflare Workersをプラットフォームとして、Rustで書いたコードをWASMにコンパイルし、サーバーレス関数としてデプロイするまでの全手順を解説します。
最短で課題解決する一冊
この記事の内容と高い親和性が確認できたベストマッチです。早めにチェックしておきましょう。
開発環境のセットアップ
まず、必要なツールをインストールします。
- Rust: 公式サイト(rust-lang.org)の指示に従い、
rustupをインストールします。curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - WASMターゲットの追加: RustのコンパイラがWASMを生成できるように、ターゲットを追加します。
rustup target add wasm32-unknown-unknown wasm-pack: RustコードをWASMにコンパイルし、JavaScriptから利用しやすいようにパッケージ化してくれる必須ツールです。cargo install wasm-packwrangler: Cloudflare Workersのプロジェクト作成、テスト、デプロイを行うためのCLIツールです。npm install -g wrangler
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
ステップ1:Rustで基本的なWASM関数を作成する
wasm-packを使って、新しいRustライブラリプロジェクトを作成します。
npm init cloudflare my-worker worker-rust
cd my-workerCloudflareのテンプレートはworker-rustを指定することでRustベースのプロジェクトを生成してくれます。
生成されたsrc/lib.rsを以下のように編集してみましょう。
// src/lib.rs
use worker::*
#[event(fetch)]
pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> Result<Response> {
// シンプルなテキストを返す
Response::ok("Hello, World from Rust and WASM!")
}このコードは、Cloudflare Workersのfetchイベントをトリガーに、"Hello, World from Rust and WASM!"というレスポンスを返す非常にシンプルなワーカーです。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
ステップ2:wranglerによるビルドとパッケージ化
Cloudflare WorkersのRustテンプレートは、wranglerコマンドでビルドプロセスを抽象化してくれます。
以下のコマンドを実行するだけで、RustコードがWASMにコンパイルされ、デプロイ可能な状態になります。
wrangler buildこのコマンドは内部でwasm-packを呼び出し、src/lib.rsをコンパイルしてpkgディレクトリにWASMファイルとJavaScriptの連携コードを生成します。その後、Workersが必要とする形式に全体をパッケージングします。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
ステップ3:Cloudflare Workersへのデプロイ
ローカルでの開発とテストが完了したら、デプロイは非常に簡単です。
ローカルでのテスト
デプロイする前に、ローカル環境でワーカーの動作を確認できます。
wrangler devこのコマンドを実行すると、ローカルサーバーが起動し、ブラウザやcurlで http://localhost:8787 にアクセスすることで動作確認ができます。
本番環境へのデプロイ
準備ができたら、以下のコマンドでCloudflareのグローバルネットワークにデプロイします。(初回はCloudflareアカウントでの認証が必要です)
wrangler deployデプロイが完了すると、公開URLが発行され、世界中のどこからでもアクセス可能な高速なサーバーレス関数が誕生します。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
実践:フィボナッチ数列の計算をWASM化する
もう少し実用的な例として、計算負荷のかかるフィボnaッチ数列の計算をRustで実装してみましょう。
src/lib.rsを以下のように書き換えます。
// src/lib.rs
use worker::*;
// フィボナッチ数を計算する再帰関数
fn fib(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fib(n - 1) + fib(n - 2),
}
}
#[event(fetch)]
pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> Result<Response> {
// URLから数値を取得 (例: /?n=40)
let url = req.url()?;
let query_params: std::collections::HashMap<String, String> = url.query_pairs().into_owned().collect();
let n_str = query_params.get("n").cloned().unwrap_or_else(|| "35".to_string());
let n = n_str.parse::<u32>().unwrap_or(35);
// フィボナッチ数を計算
let result = fib(n);
Response::ok(format!("Fibonacci({}) = {}", n, result))
}このコードは、URLのクエリパラメータ(?n=...)から数値を取得し、そのフィボナッチ数を計算して返します。再帰的な計算はCPU負荷が高いため、このような処理こそWASM化の恩恵を大きく受けられます。
再度 wrangler deploy を実行してデプロイし、https://<your-worker-url>/?n=40 のようにアクセスしてみてください。JavaScriptで同じ処理を実装した場合と比較して、高速に応答が返ってくるのが体感できるはずです。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
まとめ:サーバーレスの新たな可能性
本記事では、RustとWebAssemblyを使って、非常に高速で安全なサーバーレス関数を開発し、Cloudflare Workersにデプロイする方法を解説しました。
- Rustのパフォーマンスと安全性をサーバーサイドで活用できる。
- WASMの高速な起動時間とポータビリティが、サーバーレス(特にエッジ)と非常に相性が良い。
wasm-packとwranglerを使うことで、開発からデプロイまでの体験がスムーズになる。
すべての処理をRustで書く必要はありません。Node.js (JavaScript/TypeScript) ベースのサーバーレス関数の中で、パフォーマンスがボトルネックとなっている特定の処理だけをRust+WASMに置き換える「ハイブリッドアプローチ」も非常に有効です。
RustとWASMは、サーバーレス開発のパフォーマンスと効率性を新たなレベルに引き上げる可能性を秘めています。ぜひこの強力な組み合わせを試してみてください。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。





![はじめてでもここまでできる Stable Diffusion画像生成[本格]活用ガイド](https://m.media-amazon.com/images/I/51ZTahsGlKL._SL500_.jpg)