プログラマでありたい

おっさんになっても、プログラマでありつづけたい

モバイル/JavaScriptアプリで、Cognitoを利用した2-Tier構成とAPI Gatewayを利用した3-Tier構成の比較

 前回、AWSを利用したサーバレスアーキテクチャという構成の紹介をしました。サーバレスという言葉に違和感があると、多くの意見を聞いて成る程と思いました。意味的には、EC2インスタンスレスやサーバのマネージメントレスという意味なのですが、それをサーバレスと言うのかとのご意見でした。
 さて、このサーバレスアーキテクチャの所で、私が気にしているのはCognitoとMobile Hubを利用した2-Tier(2層)構成か、API Gatewayを利用した3-Tier(3層)構成、このどちらの方が主流になるかです。結論的にはケースバイケースなので、一方が他方を完全に圧倒するというケースはないと思います。ただ、今後の見通しとして、どちらに注力していくか考えたいと思っています。ということで、前回の話とかぶるところが多いですが、改めて考えてみます。

Cognitoを利用した2-Tier構成



 2-Tier構成の場合は、AWSの各種サービスの利用制御はモバイル/JavaScriptアプリ側となります。その際の肝となるのが、Cognitoとなります。Cognitoの機能の1つに、認証後のユーザに対しての一時的な権限付与があります。例えば、認証後のユーザに対してDynamoDBに書き込み権限を与えるといったことも出来ますし、逆に未認証の場合にも読み込み権限のみ与えるといったことも可能です。
f:id:dkfj:20151019080117p:plain


 一方で、CognitoはあくまでAWSリソースに対してのみの権限付与の機能です。構築するシステムに対しての権限付与ではありません。その為、このユーザはシステム管理者権限だからこの機能が使えるとといった制御には基本的には使えません。また権限付与も、認証済み・未認証の2値しか取れません。
 この為、ユーザ側のシステムで制御する必要があります。この辺りをどうするかが、2-Tierにするか3-Tierにするかの設計のポイントではと思います。あまり面倒くさいことを考えなくてよいのであれば、アプリ単体で見た場合に、2-Tierで作る方がシンプルかつ短期間で構築できると思います。また、それをサポートするMobile Hubというサービスも提供されています。それが出来ない場合は、アプリの方で制御するかCognitoを利用して、そちらの方で権限制御することになります。後者の場合、実質的に3-Tierになります。

API Gatewayを利用した3-Tier構成



 それでは、API Gatewayを利用して3-Tier構成にした場合はどうなるのでしょうか?現状のAPI Gatewayの機能を考えると、実質的にLambda前提で利用することが多いと思います。AWS Proxyという面白い機能があるものの、現状ではそれほど使い勝手はよくなくLambdaを介した方が便利なことが多いでしょう。となると、API Gateway⇒Lambda⇒AWS各種リソースという形になります。
 この構成のメリットとしては、APIを通じて連携する為にモバイル/JavaScriptのクライアント側とサーバ側であるAWSを完全に分離できるところです。極端な話、APIのインターフェイスを同じにすればサーバ側を別のクラウドであったりオンプレミスでも、クライアント側としては関係なくなります。またAWS側も、クライアント側がiOSであろうがAndroid,JavaScriptということも意識しません。疎結合という点で、素晴らしいですね。
f:id:dkfj:20151019080147p:plain

 さて、2-Tierアーキテクチャで課題となった認証機能はどうするのでしょうか?ロジックについては、Lambdaを使って実装することになると思います。一方で、その実装の一部でCognitoを利用した方が楽に作れると思います。というのは、AWSに対する一時的な権限発行等は、ちゃんと管理するのはかなり手間が掛かります。そこについては、サービスとして提供されているものを利用することをお勧めします。次にシステム的な権限管理については、Lambda内で独自に管理することがあります。ただ権限管理のモジュールは、AWS外にいろいろあるのでそちらを利用するということも検討できます。JavaやPythonが利用できるようになっているので、選択肢は広がっています。
 逆にAPI Gatewayのデメリットとしては、2-Tierアーキテクチャに較べてオーバヘッドが多いところです。必ずAPI Gatewayを通るために、登場人物が多く通信箇所も増えます。そして、かならずJSONを介して通信することが多いので、通信量も増えます。その辺りのトレードオフを考える必要があります。

まとめ



 2-Tierにしろ3-Tierにしろ、権限管理については、まだまだ面倒くさいことが多く、今のところ決定打はありません。しかし、どちらの構成にするにしろ、CognitoとLambdaを利用する可能性は高いです。今のうちに習熟しておくと、いろいろ効率化できて無駄な時間に人生を費やせる時間が8%くらい捻出できるかもしれません。どちらも無料枠で相当使えるので、まずは試してみることをお勧めします。

Cognito

AWS 無料利用枠では、無制限のユーザー認証と ID 生成、10 GB のクラウド同期ストレージを提供しており、Amazon Cognito による 1 か月あたり 100 万回の同期操作が可能です。


AWS Lambda

1 か月当たり 100 万件の無料リクエスト
1 か月当たり最大 320 万秒のコンピューティング時間

 上記をテーマにしたAWSアプリ本を書いています。2-Tier,3-Tierのサンプル多数掲載しているので、ぜひ読んでみてください。

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく

  • 作者: 佐々木拓郎,佐藤瞬,石川修,高柳怜士,佐藤雄也,岸本勇貴
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2016/04/20
  • メディア: Kindle版
  • この商品を含むブログを見る
Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2015/03/25
  • メディア: Kindle版
  • この商品を含むブログを見る

See Also:
サーバレスアーキテクチャとは?
サーバレスアーキテクチャ(ServerLess Architecture)とBaaSの違い
仮想サーバ、コンテナサービス、ファンクション
クラウドファーストとクラウドネイティブ
AWS Mobile HubとAmazon API Gatewayからモバイル開発の今後を考える
JAWSUG千葉で、API Gatewayの話をしてきました。
5分で何となく解るAmazon Cognito