サーバーレスアプリケーションの2-Tier Architectureと3-Tier Architecture

サーバレスアプリケーションを作っていて、2-Tier Architectureと3-Tier Architectureのどちらを選ぶべきなのかを悩んでいる。

少し前に作ったアプリは2-Tier Architectureで作っていて、会社の先輩に話すと「API Gatewayを入れた方が良い」との意見をいただいていた。なぜAPI Gatewayを入れた方が良いのか、きちんと考えておいた方がいいなと思った。

2-Tier Architectureとは

クライアントから直接AWSサービスを呼び出す方式のアプリケーション。

serverless 2tier

モバイル開発を支える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という選択肢を持っておくのが良いと考えた。