サーバーレスで SaaS を構築する方法をグラレコで解説

2020-10-01
AWS 最新ドキュメント紹介

Author : 安田 茂樹

本記事では、AWS re:Invent 2019 にて行われたセッションの 1 つである ”Serverless SaaS deep dive: Building serverless SaaS on AWS (サーバーレス SaaS を読み解く : AWS で構築するサーバーレス SaaS)” セッションの概要を、グラレコを使って解説します。

※ 本連載では、様々な AWS サービスをグラフィックレコーディングで紹介する awsgeek.com を、日本語に翻訳し、図の解説をしていきます。awsgeek.com は Amazon Web Services, Inc. プリンシパル・テクニカル・エバンジェリスト、ジェリー・ハーグローブが運営しているサイトです。

SaaS (サース) とは、Software as a Service の略で、ソフトウェアベンダーがクラウド上でソフトウェアを稼働させ、ユーザーがネットワーク経由でそのサービスを利用できる仕組みのことを言います。ユーザーがソフトウェアをローカル環境にインストールして使う場合に比べ、

  • ユーザー側でのソフトウェアのインストールやアップデートが不要
  • 様々なデバイスから利用できる
  • 初期費用が少額あるいは無料の場合が多く、スモールスタートが可能

といった多くのメリットがあります。

一般的な SaaS アーキテクチャでは、クラウド上にある個別の Web アプリケーションやアプリケーションサービスとは別に、ユーザー管理 / 課金管理 / メトリクス管理 / ID 管理といった管理機能 (共通サービス) を使い、ユーザーの管理を行っています。

img_awsgeek-saas-serverless_01

また、SaaS では、複数のテナント (顧客企業) がソフトウェアを共有する、「マルチテナント」という概念があります。マルチテナントを実現するためには、「オンボーディング」というプロセスで、

  • 各テナントの登録を行う
  • テナントごとにユーザー設定を行う (ユーザー設定には、各テナントが持つ Amazon Cognito ID プールなどを使用)
  • 各テナントの契約プランに応じたテナント設定を行う

を実施します。オンボーディングプロセスを考慮せずにシステムを設計した場合、後からマルチテナントを実現するためにはコードを書き直す必要が出てくるため、ご注意ください。

img_awsgeek-saas-serverless_02

オンボーディングが完了すると、ユーザーは ID とパスワードを使い、サービスにサインインできるようになります。Amazon Cognito を使用する場合、図のように、ユーザー名・パスワードを入れて送信すると、Amazon Cognito ID プールで認可が行われ、ユーザーの名前・メールアドレス・テナント ID・ロールなどが記載された JSON Web Token (JWT) が返されます。その後、返された JWT は Amazon API Gateway に送られます。

API Gateway では、送られた JWT を Lambda オーソライザーに送り、Lambda オーソライザーでは JWT に記載された情報 (テナント ID やロール) を基に、ユーザーがアクセスできるサービスを定め、API Gateway に返します。それを基に API Gateway はユーザーがアクセスできるサービスを設定します。

また、API Gateway へのリクエスト数が多い場合には、API Gateway の持つ機能である「使用量プラン」を使って、各テナントの API キーごとにスロットリングを実施し、例えば「プレミアムプラン」のテナントのユーザーのリクエストを優先してつなげる、といったトラフィック制御が可能です。

img_awsgeek-saas-serverless_03

次に、API Gateway から先はどうなるのか見てみましょう。

無事 API Gateway を通過したリクエストは、ソフトウェアを実行するマイクロサービスへと転送されます。最初のオンボーディングの段階で「各テナントの契約プランに応じたテナント設定を行う」と書きましたが、テナントによっては「他社から分離された環境でソフトウェアを実行する必要がある」といった要件がある場合があります。その場合には、他のテナントからマイクロサービスを分離して実行する「サイロ型」モデルを用います。サイロ型モデルの場合、Lambda 関数の実行には、オンボーディングの際にテナントごとに設定した「IAM 実行ロール」を使います。

一方、要件によっては、複数のテナントが同じマイクロサービス を共有する「プール型」モデルでもかまわない場合もあります。その場合は全テナント共通の単一の IAM 実行ロールで Lambda 関数を実行することになります。プール型モデルの場合、テナントごとにアクセスできるリソースを定めるために、Lambda 関数は「分離トークンマネージャー (Isolation token manager)」を使って各テナントに対するトークンの払い出しを受け、各テナントがアクセスできるリソース (S3 バケット等) の範囲を制御します。

img_migration-to-cloud_05

分離トークンマネージャーは、テナントごとにオンボーディングの際に設定された IAM 実行ロールを基にトークンを生成しますが、代わりに「トークンベンディングマシン(Token vending machine)」を使ってトークンを動的に生成することもできます。テナント数が多くオンボーディングの際にテナントごとに IAM 実行ロールの設定が難しい場合、トークンベンディングマシンが役立ちます。

img_migration-to-cloud_06

なお、「サイロ型」「プール型」モデルの使い分けの注意点として、テナントごとに「サイロ型」「プール型」モデルのどちらか一方を選ばなければならないわけではなく、セキュリティ要件の厳しい特定のマイクロサービスのみ「サイロ型」を選び、他は「プール型」にしてコストを削減する、といった運用も可能です。 

また、プール型の場合は、テナントごとに

  • 分離トークンマネージャーからトークンの払い出しを受ける (前処理部分)
  • トークンを基に Lambda 関数を実行 (本体部分)
  • 遅延データなどのメトリクスを記録 (後処理部分)

といった一連の処理を行う必要がありますが、これらの処理をラッピングして、単一のラッパー関数とすることで、前処理部分・後処理部分を Lambda 関数本体のコードから分離させることができ、開発効率が向上します。

img_migration-to-cloud_07

次に、マイクロサービスについて見てみましょう。
各マイクロサービス は、厳密には複数の Lambda 関数から構成されています。例えば、「オーダー管理」のマイクロサービス の場合、

  • CreateOrder
  • UpdateOrder
  • DeleteOrder
  • FindOrders

といった複数の Lambda 関数から構成されている場合があります。
その場合でも、外から見た場合は、全体が単一のマイクロサービスとして機能します。

img_migration-to-cloud_08

また、Lambda 関数には、複数の関数で共有するコードをレイヤー化できる「Lambda レイヤー」という機能があります。

「ログ記録」「メトリクス記録」「トークン管理」といったマルチテナントに関わる機能を切り離して Lambda レイヤーに配置することで、開発者はマルチテナントに関わる処理を Lambda 関数本体でコーディングする必要がなくなり、開発がよりシンプルになります。

また、Lambda レイヤーのバージョンは、Lambda 関数本体のバージョンとは分けて管理されるため、Lambda レイヤーのバージョンをアップデートすることで、レイヤーを参照している全 Lambda 関数に変更を反映させることができるというメリットがあります。

img_migration-to-cloud_09

なお、SaaS を Lambda で稼働させる主なメリットとしては、

  • 需要に応じ自動的にスケーリングが可能
  • フルマネージドサービスのため、基盤部分の運用管理が不要
  • リソースのキャパシティ vs. 実際の使用量の差を最小限に抑えられるため、余分なリソースを事前にプロビジョニングしておく必要がなく、コストの無駄が生じにくい

といった点が挙げられます。

img_migration-to-cloud_10

最後に、全体の図を見てみましょう。 

img_awsgeek-saas-serverless_full

SaaS アプリケーションの構築にあたっては、マルチテナントを念頭に置いた設計を行う事が重要です。

AWS で構築する場合は、ラッパー関数と Lambda レイヤーを併用することで、ソフトウェア開発者はマルチテナントに関するコーディングを意識することなく、本来の機能の開発に集中できます。

AWS で SaaS ソリューションを構築する方法の詳細に関しましては、こちらをご覧ください。

筆者プロフィール

photo_yasuda

安田 茂樹

アマゾン ウェブ サービス ジャパン株式会社 テクニカルコンテンツマネージャー。
2014 年にアマゾンジャパン合同会社に入社後、デバイス試験部門にて発売前の数多くの Amazon デバイスの試験に携わる。2019 年より現職。
趣味は新しいガジェットを試すこと、旅行、食べ歩き。

AWS のベストプラクティスを毎月無料でお試しいただけます

さらに最新記事・デベロッパー向けイベントを検索

下記の項目で絞り込む
絞り込みを解除 ≫
フィルタ
フィルタ
1

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する