サーバーレスで 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 管理といった管理機能 (共通サービス) を使い、ユーザーの管理を行っています。

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

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

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

オンボーディングが完了すると、ユーザーは 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 キーごとにスロットリングを実施し、例えば「プレミアムプラン」のテナントのユーザーのリクエストを優先してつなげる、といったトラフィック制御が可能です。

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

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

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

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

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

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

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

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

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

  • CreateOrder
  • UpdateOrder
  • DeleteOrder
  • FindOrders

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

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

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

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

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

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

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

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

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

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

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

AWS グラレコ解説のその他の記事はこちら

選択
  • 選択
  • 今話題のブロックチェーンをAWSで実現する仕組みをグラレコで解説 »
  • サーバーレスって何が便利なの ? AWS でサーバーレスを構築するためのサービスをグラレコで解説 »
  • 機械学習のワークフローってどうなっているの ? AWS の機械学習サービスをグラレコで解説 »
  • 外部から AWS のバックエンドサービス利用を実現する仕組みをグラレコで解説 »
  • AWS でデプロイの自動化を実現するベストプラクティスをグラレコで解説 »
  • コンテナを使ってモノリスを分割する方法をグラレコで解説 »
  • クラウドへ移行する理由とそのステップをグラレコで解説 »
  • Windows ワークロードをクラウドへ移行するためのベストプラクティスをグラレコで解説 »
  • サーバーレスのイベントバスって何 ? Amazon EventBridge をグラレコで解説 »
  • サーバーレスで SaaS を構築する方法をグラレコで解説 »
  • 「あなたへのおすすめ」はどう生成するの ? Amazon Personalize で簡単に実現する方法をグラレコで解説 »
  • クラウド設計・運用のベストプラクティス集「AWS Well-Architectedフレームワーク」をグラレコで解説 »
  • 特定の顧客セグメントにメッセージ送信。「Amazon Pinpoint」の仕組みをグラレコで解説 »
  • アプリにユーザー認証機能を簡単に追加できる「Amazon Cognito」をグラレコで解説 »
  • わずか数分で WordPress サイトを構築できる「Amazon Lightsail」をグラレコで解説 »
  • 異なるアプリケーション同士の疎結合を実現。「Amazon SQS」をグラレコで解説 »
  • Web アプリを高速に開発できる「AWS Amplify」をグラレコで解説 »
  • 機械学習の知識ゼロでもテキストデータを分析。Amazon Comprehend をグラレコで解説 »
  • ビジネスデータをまとめて可視化 & 分析。Amazon QuickSight をグラレコで解説
  • 人工衛星の地上局を 1 分単位で利用。AWS Ground Station をグラレコで解説
  • カオスエンジニアリングで本当にカオスにならないための進め方をグラレコで解説
  • GraphQL API を簡単に作成 & 運用。AWS AppSync をグラレコで解説
  • IoT 環境を必要な機能を選択するだけで構築。AWS IoT をグラレコで解説
  • 高い可用性と耐久性のオブジェクトストレージ。Amazon S3 をグラレコで解説
  • サーバーレスでイベント駆動型アプリケーションを実現。AWS Lambda をグラレコで解説
  • データサイエンス教育の強い味方。Amazon SageMaker Studio Lab をグラレコで解説
  • 高速で柔軟な NoSQL データベースサービス。Amazon DynamoDB をグラレコで解説
  • リレーショナルデータベースを簡単・迅速に実現。Amazon RDS をグラレコで解説
  • アプリのワークフローを視覚的に構成。 AWS Step Functions をグラレコで解説
  • データ保護に使う暗号化キーを一元管理。AWS KMS をグラレコで解説
  • アプリケーションへのトラフィックを効率的に負荷分散。Application Load Balancer をグラレコで解説
  • AWS で簡単にコンテナアプリケーションを構築 ! Amazon ECS をグラレコで解説
  • 大規模データセットも簡単クエリ! Amazon Athena をグラレコで解説
  • キャッシュ機能でアプリの高速化を実現 ! Amazon ElastiCache をグラレコで解説
  • 使い慣れたプログラミング言語でクラウド環境を構築 ! AWS CDK をグラレコで解説
  • ストリーミングデータを簡単にキャプチャ、処理、保存 ! Amazon Kinesis Data Streams をグラレコで解説
  • AWS で始める機械学習はじめの一歩 ! AWS の主要な AI/ML サービスをグラレコで解説
  • リレーショナルデータベースをサーバーレス化 ! Amazon Aurora Serverless をグラレコで解説
  • ML 駆動の検索エンジンで企業の情報管理を革新! Amazon Kendra をグラレコで解説
  • オンプレミス、エッジ、どこでも楽々コンテナ管理 ! Amazon EKS Anywhere をグラレコで解説
  • 生成 AI アプリケーション開発をもっと身近に、簡単に ! Amazon Bedrock をグラレコで解説

builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

安田 茂樹
アマゾン ウェブ サービス ジャパン合同会社
テクニカルコンテンツマネージャー。

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

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

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