横断的関心事の実装
Java 言語、例えば、Spring Framework を使用してアプリケーションを実装する場合に、認証といった横断的関心事は、Spring Security などのライブラリにより実現することがこれまでよく行われていました。
Spring Framework やこれらのライブラリは、Servlet や Servlet Filter といった基盤の上に構築されています。そして、認証のような横断的関心事の中心は Servlet Filter としてライブラリに実装されたコードになります。
外部からくる Ingress traffic が Servlet Filter や Servlet と通信し Egress traffic として外部に出ていく様子を図にすると次のようになります。
モノリスなアプリケーションの場合、Servlet Filter のような仕組みを使って認証のような横断的関心事を実装することは特に問題にはなりませんでした。
クラウドコンピューティングの流行とともにマイクロサービスアーキテクチャの時代になり、問題は顕在化されてくることになります。
数百、数千というマイクロサービスに分割されたとき、それぞれのサービスが同時に全く同じ言語、フレームワークで構築されるというよりは、それぞれのサービスに適した言語、フレームワークが利用されることになります。
こうした時に横断的関心事の実装は言語に依存しないことが望ましいといえます。クラウドコンピューティングはコンテナテクノロジーの進化ももたらしました。コンテナはそれぞれが独自のサーバとして動作し独自のアドレスを持っているだけでなく、コンテナ間で通信する独自のネットワークを持つこともできます。
例えば、人気のある Envoy Proxy を Servlet Filter の代わりに利用すると、次の図のような構成にすることができます。
Envoy Proxy と Open Policy Agent などを組み合わせると、JWT を使うユーザ認証や RBAC でのユーザ認可だけでなく、これまでアプリケーションに組み込んでいたさまざまな横断的関心事の実装を分離することができます。
ここで登場した、Envoy Proxy はサービスメッシュのデータプレーンでよく利用されるコンポーネントです。
サービスメッシュは、east-west トラフィックを処理し「The InfoQ eMag - Service Mesh Ultimate Guide 2021」によると、以下のような機能を提供します。
- 接続性 (Connectivity)
- 信頼性 (Reliability)
- サーキットブレーカー
- 失敗の挿入/カオステスト
- セキュリティ (Security)
- サービス間認証 (mTLS)
- 証明書管理
- ユーザ認証 (JWT)
- ユーザ認可 (RBAC)
- 暗号化
- 可観測性 (Observability)
- モニタリング
- テレメトリ、計測、メトリクス
- 分散トレーシング
- サービスグラフ
最後に
このような構成は以前からなかったものではありません。Apache HTTP Server、Nginx、HAProxy などでも認証をはじめとして横断的関心事を処理する機能があります。
これらにある大きな違いは、パフォーマンスとコンテナ環境での利用のしやすさにあります。
さらに最近、eBPF と呼ばれるこうした横断的関心事の処理を Linux カーネルモジュールとして実現しようという動きもあります。
このようなトレンドがどこに向ったとしても、開発者がドメインのコードに集中できるようにするという目的から離れることはないでしょう。
参考
- Envoy と Open Policy Agent を使用した認可
- Envoy を使用して ID Token (OIDC) を検証する
- S3 の静的 Web サイトを Envoy でホスティング
- コンテナ化に適したアーキテクチャ
- The InfoQ eMag - Service Mesh Ultimate Guide 2021
- eBPF and Wasm: Exploring the Future of the Service Mesh Data Plane