サーバーレスアプリケーションの2-Tier Architectureと3-Tier Architecture
サーバレスアプリケーションを作っていて、2-Tier Architectureと3-Tier Architectureのどちらを選ぶべきなのかを悩んでいる。
少し前に作ったアプリは2-Tier Architectureで作っていて、会社の先輩に話すと「API Gatewayを入れた方が良い」との意見をいただいていた。なぜAPI Gatewayを入れた方が良いのか、きちんと考えておいた方がいいなと思った。
2-Tier Architectureとは
クライアントから直接AWSサービスを呼び出す方式のアプリケーション。
モバイル開発を支えるAWS Mobile Servicesから引用。
3-Tier Architectureとは
2-Tier ArchitectureにAPI Gateway + Lambdaを挟んで、クライアントからはAPI Gatewayを呼び出すようにする。Lambdaにアプリケーションのビジネスロジックを集約させる方式。
2-Tier Architectureのメリット・デメリット
- サーバサイドの開発が不要なため、開発コスト・運用コストの削減が可能
- 簡単な権限制御は可能 1
- 管理ユーザだけ全ユーザのデータにアクセスできるなどの細かい権限制御ができない 2
- 非力なクライアントやレガシーなクライアントでは動かない可能性がある
- ビジネスロジックの改修をするたびに、ユーザにクライアントを配布する必要がある(ネイティブアプリの場合)
- 必要なデータだけを取れない場合、通信量が多くなる
3-Tier Architectureのメリット・デメリット
- サーバサイドの開発が必要なため、開発コスト・運用コストが必要
- 細かい権限制御ができる
- クライアントにもつビジネスロジックを最小限にできるため、クライアントの幅が広がる。クライアントをネイティブアプリとWebアプリの両方にして、ビジネスロジックはサーバサイドで集約する事ができる
- クライアントに配布せずにビジネスロジックを修正可能
どっちがいいの?
こうやって比較すると、2-Tier Architectureの最大のメリットは「サーバサイド開発が不要であること」だというのが分かる。つまり、以下のようなアプリケーションが向いているように思う。
- 簡単なアプリケーション
- 開発期間・開発コストを抑えたい
- 利用クライアントが限られている
3-Tier Architectureでは、以下のようなアプリケーションが向いているように思う。
- ある程度の複雑さを持つようなアプリケーション
- 複数種類のクライアントを想定している
- 今後の拡張性を持っておきたい
サーバサイドとクライアントサイドを分けて開発すると、意外と手間がかかる。API定義も必要だし、結合テストも増えるので、コストと時間がかかる。開発するリソース量が増えると、今後の改修時に修正量も増えることになる。とはいえ、後から3-Tier Architectureに変えるにはかなり大変そう。
基本的に3-Tier Architectureで作成し、期間やコスト面が厳しい時に2-Tier Architectureという選択肢を持っておくのが良いと考えた。