DDDからみたインフラ(サーバーレースアーキテクチャ)
去年の夏前くらいにDDDまわりの勉強していた。でこのメモを書いていたので少し直して晒してみる。 前回の続編。
ソフトウェアアーキテクチャや設計論はたくさんあってややこしい。なので自分なりに整理してみる。
前回までにDDDを中心にクリーンアーキテクチャなどコンテキストの独立性を高める 基盤となるアーキテクチャ とコンテキストがどのようにコミュニケーションして全体として機能するかの方針に関わる 連携パターンとしてのアーキテクチャ について並べてみた。
このコンテキストは実装のことで例えばライブラリであったりCLIであったりWebサービスだったりAndroidアプリだったりする。
アプリはマーケットプレイスやWebを経由して配布され端末上で実行される。 一方でシステムのサーバーサイドは物理サーバーなどのインフラに配置することになる。
ここ10年くらいかけて、ハイパーバイザやクラウドサービスやコンテナオーケストレーションなどインフラなどリソースの調達形態も変化してきた。
多くのアプリケーションで汎用サブコンテキストとして独立するような部分は既にサービスとして提供されてたりする。 そのなかに FaaS, BaaS に分類されるインフラやコンポーネント(汎用サブコンテキスト)の提供方法がある。
サーバーレスアーキテクチャと呼ばれるアーキテクチャでは、ユーザーの端末で動くサブコンテキスト以外ではこの FaaS, BaaS で調達する。 こうすることで、アプリケーション開発者はオペレーションコストやキャパシティプランニングにかかる時間を大幅に削減できる。
ここまでくると、アーキテクチャというよりも開発ポリシーと呼びたくなる。
サーバーレスアーキテクチャを支えるサービス
インフラやサブコンテキストの調達先を FaaS,BaaS にしようとするだけ。 これらのサービスやソフトウェアの代表的なものを紹介する。
Function
Knativeはk8s上でAWS Lambdaのような機能を実現するコンポーネントらしい(試したことがない)。
認証・認可
イベントハンドラにやってくる要求の認証・認可が必要になり、クライアントサイドでセッション関連情報を保持しないとならない。
また複数のサービス・ハンドラで共通する認可を共通化したい。
ミドルウェアを開発するわけじゃない場合では、認証・認可やアカウント情報の管理をアプリケーション本体で実装したくない。
状態管理・永続化
簡単な永続化(複数の集約やエンティティを横断した整合性の確認が不要など)の場合はクライアントから永続化サービスを利用すると簡単になる。
これにはフルマネージドでオートスケールするKVSがあると楽になる。 さらに前述の認証基盤に対応してるとなお嬉しい。
特にFirestoreはクライアントから直接ユーザー単位で認証できる。ただしミスるとセキュリティ周りのリスクが大きい。
サーバーレスの開発ツール
サーバーレスアーキテクチャは非同期処理を前提とする箇所が多く設計で考慮することは多くなる。 またイベントハンドラを中心に構成するため、全体の処理フローが把握しづらくなる。 更にアプリケーションは処理基盤に依存しがちで再現性も確保しづらくなる。
これらの問題の一部はサブコンテキストを適切に切り出し、クリーンアーキテクチャなどを用いて適切にドメインを独立させれば軽減させられる。
一方、実装方針自体がインフラやサービスに依存してしまう。 そこはそれぞれツールが提供されているので使ってしまう方がいい。 これらのツールはサポートするサービスやインフラへのデプロイを簡単にするし、デプロイ後に想定されるイベントをローカル環境でシミュレートできたりとテストを簡単にしてくれたりする。
ツール | 説明 |
---|---|
Firebase | 買収されてGCPの一部に入ったサービス用のツール |
AWS SAM | AWS公式というか買収されたツール(ローカルでAWSのイベントを再現できる) |
Serverless | マルチクラウドな定番ツール(デプロイなどを簡単にしてくれる) |
FirebaseはもともとBaaSを提供していたけれどGCPと統一されCloud Functionsも提供されている。 アプリケーションのバックエンド向けの汎用な機能が重複なく揃っている。 なのでFirebaseを基盤に決めてしまうと悩まずに開発をはじめられる。
AWS SAMはAWS CloudFormationの拡張ツール。 AWS専用ではあるものの、ローカルでLambdaのハンドラをシミュレートしてパイプ経由でイベントを渡せる。また典型的なイベントを生成できる。 これらを組み合わせることで容易にローカル環境でテストできる。
Serverlessはマルチベンダに対応している。 SAMとの比較はComparisons: Serverless vs. other toolsで行われている。