RustのWebフレームワーク「axum」でSNSアプリのAPIサーバを作る――Web開発での記述性、要素技術を解説:Rustで始めるWebアプリケーション(2)
RustでWebアプリケーションを開発する際に基礎となる要素技術からRustの応用まで、Rustに関するあれこれを解説する本連載。第2回ではAPIサーバを構築し、SNSアプリを簡易実装することでRustを使ったWeb開発での記述性や要素技術を解説する。
paizaでWebエンジニアをやっている藤田と申します。
前回は、WebアプリケーションにおけるRDB(リレーショナルデータベース)の立ち位置と、RustからRDBを制御する実装および自動テストについて記述しました。今回は、RustでWebフレームワークである「axum」を用いて(REST)APIサーバを構築し、SNSアプリを簡易実装することで、RustでのWeb開発での記述性や要素技術を解説します。
今回のプロジェクトもGitHubのサンプルリポジトリを用意していますので、コードを実行する際はご利用ください。
今回の記事のスコープ設定
現代のWebアプリケーションは、ネットワーク、データベース、ブラウザ、暗号などの技術を核として、データモデリング、デザイン、UI/UX(ユーザーインタフェース/ユーザーエクスペリエンス)、セキュリティ、ログ、トレーシング、テレメトリー、データ分析、自動テスト、監視などの非常に多種多様な関心事に取り囲まれています。
その全てを詳述し、一度にその解決策を実装するのも難しいため、この記事ではサーバサイドで重要な基礎となるデータモデリングとRDB+クッキーによるセッション管理のサンプル実装を提示します。HTTPS、認証機能、ロギングなども実装されていないので、本番環境で利用する際はアプリに要求されるセキュリティ基準にのっとり機能を追加してください。
RustでAPI開発を進める利点の再整理
RustでAPI開発を進めた所感として、Ruby on Railsなどの成熟したWebフレームワークに比べると、モノリシックに提供されるソリューションが少なく、硬めの型システムを持つ静的型付け言語でAPIを記述するのはそれなりに難しいということです。一方で、以下のような利点があると考えています。
- 実行性能が高い
- 限られた計算量をUX改善に使ったり、システムの複雑性を下げたり、インスタンスサイズを下げるのに使える
- OSS(オープンソースソフトウェア)フレームワークの開発ポリシーの影響を受けにくく、最新のソリューションへの段階的移行を進めやすい
- 高度な静的型システム
- システムがよく定義された(well-defined)状態になる
- エラーハンドリングを精緻に行いやすい
- 技術的負債が積まれにくい
RustでのWeb開発は、初期段階でさまざまな難しさ(言語の難しさ、実装選択の難しさ)に直面するため短期、小規模での開発には向かないと思われますが、長期、継続的に規模が拡大する開発において有利に作用するファクターが多いように感じます。
今回の記事で作るSNSアプリのAPI要件
今回はRustでAPIサーバのサンプルを実装するに当たり某SNSサービスの機能をまねたアプリ「Ruitter」を作成しようと思います。作成するAPIとその基本的要件は以下のようになります。
- ユーザー新規作成API(ユーザー名をPOSTすると、ユーザー名が重複していなければユーザーが作成できる)
- ログインAPI(ユーザー名をPOSTすると、ユーザー名がRDBに登録されていればログインでき、クッキーとRDBにセッションキーが記録される)
- フォローAPI(ログイン状態でフォローしたいユーザー名をPOSTすると、フォローできる)
- メモ作成API(ログイン状態で140文字以内のテキストをPOSTすると、テキストを記録できる)
- タイムラインAPI(ログイン状態でGETすると、自分とフォローしているユーザーのメモが最新順で見られる)
あくまで今回の記事の主体はRustによるAPIサーバ実装ですが、サンプルコードにはデバッグのWeb UIプログラムも用意しています。
APIサーバ動作確認用のデバッグUI。左の「ユーザー管理」で機能1〜3を、中央の「メモを投稿する」で機能4を、右の「タイムライン」で機能5を検証できます。またChrome DevToolsを活用し、Set-CookieレスポンスヘッダやCookieリクエストヘッダを確認すると検証がはかどります
機能2に至ってはユーザー名さえ知っていれば誰でもなりすましができるなど本番運用するには課題がありますが、今回の内容を理解すれば機能拡張を進めていくことができると思います。
今回の利用ライブラリ
今回はWebフレームワークライブラリとしてaxumを利用します。このライブラリは非同期ランタイムTokioの開発チームが開発を進めており、扱いやすいため採用しています。その他利用ライブラリはプロジェクトファイル(Cargo.toml)に記述しています。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- なぜ「Rustは難しい言語」とされるのか――習得の難しさとその対策をWebエンジニアが考察
Web開発者としての興味、関心に基づきRustを端的に紹介し、その強みや弱みについて理解を深める本連載。第3回は、Rustの開発生産性を支える言語機能と難しさについて。 - 「Rust」が開発者に最も愛される言語であり続ける理由――Rustを取り巻く状況はここ1年でどう変わったのか
人気記事を電子書籍化して無料ダウンロード提供する@IT eBookシリーズ。第69弾は、プログラミング言語「Rust」のニュース記事をeBookにまとめてお送りする。 - 「Rust」言語はCよりも遅いのか、研究者がベンチマーク結果を解説
ミュンヘン工科大学の研究チームのメンバーはRust言語で開発したネットワークデバイスドライバの処理速度をC言語のものと比較した。その結果、Rust版の速度低下は最大でも数%にとどまっていた。なぜ処理性能がわずかに遅くなるのか、その理由も説明した。