Axum

Axum ミドルウェア入門:Layer と Service の実装とベストプラクティス

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

Axum のミドルウェアシステム概要と Tower の Layer / Service の関係

Axum は内部で Tower ライブラリを利用しており、HTTP リクエストは Layer が生成した Service を順に通過します。この仕組みを理解すると、リクエストの前処理・後処理を安全かつ効率的に差し込めるようになります。以下では概念図と公式ガイドへのリンクを示しながら、ミドルウェアがどのように構築されているかを解説します。

  • Layer:ミドルウェア本体を組み立てるファクトリ的役割です。
  • Servicecall(request) で実際の処理を行うオブジェクトです。
  • リクエストは外側の Layer → 内側のハンドラ の順に流れます。

このパイプラインを把握すれば、任意のロジックを安全に差し込むことが可能です。詳しい解説は公式ガイドをご参照ください【Axum と Tower のミドルウェア入門】。


カスタムミドルウェアの実装基礎

カスタムミドルウェアを作る際は、まず LayerService をそれぞれ実装します。この節では、最小構成のコード例と必要な型制約について初心者でも分かりやすいように解説します。

Layer 構造体の定義と tower::layer::Layer の実装

以下はロギング用ミドルウェアのベースとなる LoggingLayerLoggingService の実装例です。BoxBody が未インポートだった点を修正し、必要なクレートも明示しています。

型制約のポイント

  • S任意の Service で構いませんが、後述する call 実装では Response = Response<BoxBody> が必要です。
  • Clone, Send, 'static の要件は非同期環境で安全に所有権を移すために必須です。

Service トレイトの call メソッドで前処理・後処理を差し込む例(リクエストロギング)

Service を実装するときに必要になる型制約と、非同期処理を扱うための Future の定義について解説します。

async_trait が必要になるケース

上記は 手書き の Future を返すパターンですが、async fn をそのまま実装したい場合は async_trait クレートが便利です。

async_trait を使用するとコードがシンプルになりますが、コンパイル時に追加のボックス化が入るため パフォーマンス要件が厳しい場合 は手書き Future の方が好まれます。


代表的ミドルウェアのステップバイステップ実装

この章では、実務で頻出する「リクエストロギング」と「JWT 認証」の二つのミドルウェアを完成形まで作ります。コード例はすべて Axum 0.7 系 に合わせています。

リクエストロギングミドルウェアの完全実装

まずは Cargo.toml に必要な依存関係を追加します。

次に、先ほど定義した LoggingLayerLoggingService をモジュール化し、アプリ起動時にロガーを初期化します。

この構成で、全リクエストの入出力が標準出力に記録されます。ポイントは「LoggingLayerRouter::layer の最外層に置く」ことです。

JWT 認証ミドルウェア(jsonwebtoken クレート使用)

重要な安全上の注意

本サンプルでは dangerous_insecure_decode フィーチャを有効化していますが、これはトークンの検証を行わないデコード手法であり、本番環境では絶対に使用しないでください。代替として decode に適切な Validation オプションとシークレットキーを渡す方法を推奨します。

Cargo.toml の設定(安全版)

ペイロード構造体

トークン生成関数(参考実装)

JWT 認証ミドルウェアの実装

ルータへの適用例

注意:上記コードは 検証のみ を行う安全な実装です。dangerous_insecure_decode フィーチャは Cargo.toml から除外してください。


ミドルウェアの合成と Router への適用

複数のミドルウェアを組み合わせる場合、Router::layer をチェーンしていくことで実装できます。この節ではレイヤーの順序がどのようにリクエストフローに影響するかを具体例とともに解説します。

合成の基本パターン

  • 外側の Layer が先に poll_readycall を受け取り、内部へ委譲します。
  • 逆に 内側の Service はハンドラ直前で実行されるため、認可やキャッシュ処理に適しています。

型安全性とコンパイルエラーの防止

Tower の設計は「レイヤー合成時にすべての型が決定」になる点が特徴です。Router::layer を連続して呼び出すだけで、ビルド時にミスマッチが検出 されます。そのため、実行時エラーを減らしやすくなります。


テスト・エラーハンドリング・デプロイベストプラクティス

この章では、開発フロー全体で品質を保つためのテスト手法、統一的なエラーレスポンス設計、そして本番環境へのデプロイ時に留意すべき設定項目をまとめます。

ユニットテストと統合テストの書き方

Service 単体のユニットテスト(tower::ServiceExt を活用)

統合テスト(Router 全体を起動)

エラーハンドリングとレスポンス変換のベストプラクティス

エラーは 一元管理 し、IntoResponse を実装した独自型で返すとコードがシンプルになります。

ミドルウェア内では次のように使用します。

本番環境向けデプロイ設定ポイント

項目 推奨設定 理由
Tokio runtime #[tokio::main(flavor = "multi_thread", worker_threads = 4)] I/O と CPU バランスを最適化し、スケーラビリティを確保
リクエストタイムアウト tower::timeout::TimeoutLayer::new(Duration::from_secs(30)) を最外層に配置 長時間ブロックされるリクエストを自動で切断し、サービス全体の安定性向上
構造化ログ出力 tracing_subscriber::fmt().json().with_writer(std::io::stdout).init(); JSON 形式はクラウドロギング(CloudWatch, Loki 等)への転送が容易
Graceful shutdown signal::ctrl_c() を監視し、server.with_graceful_shutdown(shutdown_signal()) を使用 デプロイ時や障害復旧時に接続を安全に閉じられる
ヘルスチェックエンドポイント /healthz で簡易 200 OK を返すハンドラを実装 Kubernetes 等のオーケストレーターが正常性を判定できる

Dockerfile の例(抜粋):


本稿の要点まとめ

  • Axum のミドルウェアは Tower の Layer/Service に基づく。Layer が Service を生成し、リクエストは外側から内側へ流れる。
  • カスタム Layer と Service の実装手順を具体例(ロギング)で示した。型制約や async_trait の使い分けも解説したので、初心者でも安全に実装できる。
  • JWT 認証ミドルウェアでは、危険な dangerous_insecure_decode を使用しない安全な実装を提示し、必ずシークレットで検証するよう注意喚起した。
  • ミドルウェアの合成方法Router::layer のチェーン化で行い、順序が処理フローに直接影響する点を強調した。
  • テスト・エラーハンドリング・デプロイのベストプラクティスを網羅し、実運用で必要となる設定例も提供した。

これらを参考に、自社サービスに最適なミドルウェアを設計・実装し、本番環境でも安定して動作させてください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Axum