この技術記事は、SaaS製品を設計している、または初期設計を見直す必要が生じているCTO・アーキテクト・シニアエンジニアを対象としています。SaaSプラットフォームエンジニアリングガイドでは、サイロ・プール・ブリッジのテナンシーモデルとコントロールプレーンを紹介しています。本記事はその一段階深い内容として、各レイヤーでの分離の実施方法、データのパーティショニング、課金の構成、AIフィーチャーのテナント境界内への制限、プラットフォームのスケーリングについて説明します。マーケットプレイスについてはマーケットプレイスプラットフォームアーキテクチャで扱っています。
コンテキスト:テナント・ユーザー・デプロイメント
まずテナントの定義を明確にします。BtoB SaaSでは、テナントは通常、多数のユーザーを持つ顧客組織を指します。複数のテナントが必要な顧客もいます(例:独立した子会社や、テスト環境と本番環境の分離など)。BtoC製品では、テナントは個人・家族・グループになることもあります。MicrosoftのAzure Architecture Centerは、このテナントの定義とテナンシーモデルが顧客に受け入れられるかどうかは、技術的な決定であると同時にビジネス上の決定でもあると指摘しています。
論理的なテナントと、それにサービスを提供するデプロイメントは分けて考えます。デプロイメント(スタンプとも呼ばれます)は、1セットのインフラストラクチャです。複数のテナントが1つのデプロイメントを共有することも、1つのテナントが専用のデプロイメントを持つこともできます。最初からテナントとデプロイメントのマップを保持しておくことで、アプリケーションを書き直すことなく後でテナントをデプロイメント間で移動できます。
分離はレイヤーごとに決定する
SaaSテナント分離戦略に関するAWSホワイトペーパーは、分離をSaaSデザインの根幹と位置づけ、テナント境界を越えることはビジネスにとって回復不能なイベントになり得ると説明しています。Microsoftは分離を単一のスイッチではなくスペクトラムとして捉えています。実際には、各レイヤーごとに答えが異なります:
| レイヤー | 共有オプション | 分離オプション | 判断基準 |
|---|---|---|---|
| コンピューティング | 共有アプリケーションサーバー | テナントごとの専用サーバーまたはコンテナ | パフォーマンス保証、ノイジーネイバー、顧客要件 |
| データベース | テナントキーを持つ共有テーブル | テナントごとの別スキーマまたはデータベース | データの機密性、バックアップ・リストア要件、スケール |
| ファイルストレージ | テナントプレフィックス付き共有バケット | テナントごとのバケットまたはコンテナ | アクセスポリシー、データレジデンシー、保持ルール |
| キャッシュ | テナントプレフィックス付きキーの共有キャッシュ | テナントごとの別キャッシュ | キー衝突リスク、メモリ圧迫 |
| キューとジョブ | テナントタグ付きジョブの共有キュー | テナントまたはティアごとのキュー | 公平性(1テナントのバックログが他のテナントを遅延させないため) |
| 検索インデックス | テナントでフィルタリングされた共有インデックス | テナントごとのインデックス | インデックスサイズ、テナントごとの関連性チューニング |
| ログとメトリクス | テナントタグ付きの共有パイプライン | 規制対象テナントのための別ストリーム | サポート要件、監査要件 |
| 暗号化キー | プラットフォーム管理キー | テナントごとのキー | 契約上の要求、オフボーディング(テナントのキーを削除) |
| AI検索インデックス | テナントフィルターを適用した共有ベクターインデックス | テナントごとのインデックスまたは名前空間 | データの機密性、インデックスサイズ、オフボーディング |
よく見られる合理的な結果は、プールされたアプリケーション層と、それを必要とするテナントのための分離されたデータという組み合わせです。Microsoftは、一部のコンポーネントをテナントごとに分割しながら他を共有する方法を「水平パーティショニング」と呼び、選ばれたテナントに専用デプロイメント全体を提供することを「垂直パーティショニング」と呼んでいます。
データパーティショニングのオプション
-
共有スキーマ、全行にテナントキー
- 分離の適用方法
- 全クエリにテナントフィルター(データベースの行レベルポリシーで補強)
- 長所
- 最もコストが低く、運用が簡単、クロステナントレポートが容易
- トレードオフ
- フィルター漏れでデータが流出する可能性(データベースポリシーなしの場合)、ノイジーネイバー
- 適用場面
- 小規模テナントが多数
-
テナントごとのスキーマ
- 分離の適用方法
- 1つのデータベース内でテナントごとに別スキーマ
- 長所
- 明確な分離、テナント単位のリストアが容易
- トレードオフ
- マイグレーションはスキーマごとに実行、スキーマ数に実用上の上限あり
- 適用場面
- 数十〜数百の中規模テナント
-
テナントごとのデータベース
- 分離の適用方法
- テナントごとに別データベース
- 長所
- 強力な分離、テナントごとのチューニング、レジデンシーオプション
- トレードオフ
- コスト増、マイグレーションとバックアップのフリート管理が必要
- 適用場面
- 大規模または規制対象テナント
-
テナントごとのデプロイメント
- 分離の適用方法
- テナントごとに別スタック
- 長所
- 最強の分離、独立したリリースタイミング
- トレードオフ
- 最高コスト、多数のデプロイメントの運用が必要
- 適用場面
- 少数の大規模または規制対象顧客
プールされたデータベースの場合、分離はアプリケーションコードだけでなくデータベース自体でも適用します。PostgreSQLの行セキュリティポリシーはその一例です。テーブルで有効化されると、ポリシーが許可しない限り行は非表示になり、テナントフィルターなしのクエリは全件ではなく何も返しません。注意すべき2つの詳細があります。ポリシーはテーブルごとに有効化する必要があり、テーブルオーナー・スーパーユーザー・BYPASSRLSアトリビュートを持つロールはデフォルトでポリシーをバイパスします。したがって、アプリケーションはテーブルを所有しないロールで接続するか、テーブルに行セキュリティを強制することで、オーナーにもポリシーが適用されるようにする必要があります。
リクエストフローとテナントコンテキスト
マルチテナントプラットフォームのリクエストは、常に同じパスをたどる必要があります:
-
テナントを解決する
:サブドメイン、カスタムドメイン、または認証トークンのクレームから取得します。クライアントが自由に変更できる値からは取得しません。
-
ユーザーを認証し
、そのユーザーが当該テナントに属することを確認します。
-
テナントマップを使用して
テナントをそのデプロイメントとデータロケーションにマッピングします。
-
データベースセッションにテナントコンテキストを設定し
、行ポリシーまたはスキーマ選択が自動的に適用されるようにします。
-
コンテキストをバックグラウンドジョブ・イベント・キャッシュキー・ログ・メトリクス・AI検索呼び出しに伝播します。
-
テナントとそのテナント内のユーザーロールの両方で認可を確認します。
テナントデータの漏洩のほとんどは、どこかのステップが省略されたことに起因します。コンテキストを持たないバックグラウンドジョブ、テナントプレフィックスのないキャッシュキー、リクエスト内のテナントIDを信頼してしまう管理エンドポイントなどが典型例です。
課金・メタリングアーキテクチャ
マルチテナントSaaSの課金は、単一のインテグレーションではなくパイプラインです。
-
使用イベント
- コンポーネント
- アプリケーションがテナントと機能ごとにイベントを送出する
- 設計上の注意点
- 今日の料金設定がフラットであっても、最初のリリースから送出する
-
メタリング
- コンポーネント
- イベントをテナントと期間ごとの使用量に集計する
- 設計上の注意点
- 冪等性:再試行されたイベントが二重請求されないようにする
-
エンタイトルメント
- コンポーネント
- 各テナントが利用できる機能と上限を決定する
- 設計上の注意点
- コードはプラン名ではなくエンタイトルメントを確認する
-
レーティング
- コンポーネント
- 使用量とプランに価格を適用する
- 設計上の注意点
- 設定で管理し、価格変更にリリースが不要なようにする
-
請求と支払い
- コンポーネント
- 課金・支払いプロバイダーが請求と決済を行う
- 設計上の注意点
- カードデータはプロバイダーに保管する
-
収益レポーティング
- コンポーネント
- 収益・チャーン・支払い失敗の財務ビュー
- 設計上の注意点
- メタリングと同じデータを基に構築する
-
AI使用量
- コンポーネント
- テナントと機能ごとのモデル呼び出しとトークン数
- 設計上の注意点
- エンタイトルメントで上限設定し、1テナントがプランのマージンを消費しないようにする
-
テナントごとのフラットサブスクリプション
エンタイトルメントと課金ライフサイクルが必要。メタリングはテナントごとのコスト把握に引き続き有用
-
シートごと
テナントごとの正確なユーザー数と期中変更のルールが必要
-
使用量ベース
正確で冪等なメタリングと顧客への使用量公開が必要
-
ハイブリッド(基本料金+使用量)
上記すべてに加え、明確な上限と超過ルールが必要
AI機能:データ分離とテナントごとのモデルコスト
アシスタント・AI検索・要約は、ほとんどの画面よりも1リクエストで多くのテナントデータを読み込むため、同じ場所で同じ境界を適用する必要があります。AIガバナンスはその背後にあるポリシーを規定しています。
- プロンプトの外で検索をフィルタリングする。検索サービスはセッションコンテキストからテナントとユーザーの権限を適用します。「このお客様のデータのみを使用してください」というプロンプト指示は分離にはなりません。
- すべてのAIキャッシュをテナントでキーイングする。テナントキーのないキャッシュされた回答や埋め込みは、あるお客様のコンテンツを別のお客様に返す可能性があります。
- テナントデータを共有トレーニングから除外する。1テナントのデータで共有モデルをファインチューニングしないこと。また、リクエストをトレーニングに使用しない条件を定めたモデルプロバイダーを選択します。規制対象テナントにはリージョンまたは専用モデルデプロイメントが必要になる場合があります。
- テナントごとにモデルコストを計測する。トークンと呼び出し数はテナントによって大きく異なります。機能ごとに帰属させ、エンタイトルメントを通じて上限を適用します。
- オフボーディング時に削除する。退去テナントの埋め込み・インデックス・ログに記録されたプロンプトは、データベースの行と共に削除します。
スケーリングの選択肢
| 選択肢 | 使用するタイミング | コストと複雑さ |
|---|---|---|
| 共有デプロイメントをスケールアップ・アウト | 類似テナントでの初期成長期 | 最低。共有リソースの上限に注意 |
| テナントを複数のデータベースにシャード | 1つのデータベースが限界に達している | 中程度。テナントマップとクロスシャードレポートが必要 |
| デプロイメントスタンプを追加 | リージョンの拡張やテナント数が1スタックを超える成長 | 高め。自動化されたプロビジョニングとリリースが必要 |
| 大規模テナントを専用リソースに移行 | 1テナントが負荷を支配するか、分離を要求する | テナントごと。テスト済みの移行パスが必要 |
| ノイジーネイバー対策 | 常時 | 低。レート制限、テナントごとのクォータ、ジョブの公平スケジューリング |
テナント移行パスは早期に計画します。共有データベースから専用データベースへのデータ移動方法、トラフィックの切り替え方法、結果の検証方法を設計します。オンデマンドで考案するより、早期に設計する方がはるかに容易です。
運用:リリース・マイグレーション・リストア
- リングでリリースする。社内テナント、次に少数の顧客、最後に全員へと、テナントごとのフィーチャーフラグを使いながら順次展開します。
- フリート全体のスキーママイグレーションを自動化する。スキーマごとまたはデータベースごとのアーキテクチャでは、1回のリリースで多数のマイグレーションが発生します。どのテナントがどのバージョンにあるかを追跡します。
- プラットフォーム全体ではなく1テナントのリストアを行えるようにする。顧客は特定テナントのデータのリストアを要求します。要求が来る前にテストしておきます。
- テナントごとのコストを計測する。メタリングとクラウド請求書を組み合わせ、どのテナントとプランがコストをカバーしているかを把握します。
テスト根拠:テストすべき項目
以下は特定プロジェクトの結果ではなく、一般的なエンジニアリング実践です:
- クロステナントアクセステスト。すべてのエンドポイントとジョブについて、別テナントのデータを読み取りまたは変更しようとする自動テストを行い、必ず失敗することを確認します。
- 行ポリシーテスト。テナントコンテキストなしで実行されるクエリは、アプリケーションのデータベースロールで実行した場合も含め、行を返してはなりません。
- ノイジーネイバー負荷テスト。1つのテナントが高負荷を発生させながら、他のテナントのレスポンスタイムを計測します。
- シングルテナントリストアテスト。バックアップから1テナントをクリーンな環境にリストアし、レコードを比較します。
- メタリングテスト。再生・重複したイベントが同じ使用量合計を生成することを確認します。
- クロステナントAIテスト。アシスタントに別テナントのレコードについて質問した場合、キャッシュされた回答も含め、何も返ってこないことを確認します。
より広範なチェックはSaaSセキュリティチェックリストに記載されています。
事例:Printcart
Printcartは、Netbase JSCの5つのビジネス部門のうちの1つで、オンライン注文を印刷可能なファイルとルーティングされたフルフィルメントに変換するWeb to Printおよびプリントオンデマンドプラットフォームです。マーチャント自身のストア上、またはShopify・Wix・WooCommerceのアプリとして動作し、約7日でセットアップが完了し、2000以上のストアにサービスを提供しています。これだけ多くのマーチャントに1つの製品でサービスを提供することは、本記事が説明するマルチテナント問題そのものです。各マーチャントは、共有プラットフォーム上で独自のカタログ・注文・ストア接続を必要とします。Printcartのポートフォリオレコードでは、Netbase JSCがエンジニアリングし運用している内容を説明しており、印刷・パッケージングでセクターのコンテキストを確認できます。
自社製品以外では、Netbase JSCは2020年から、名前が公開されていない米国クライアントのマルチテナントクラウドERPのSaaSプラットフォームのオフショア開発・管理パートナーとして従事しており、中小企業向けにSaaSとして販売されています。
Netbase JSCのマルチテナント構築へのアプローチ
Netbase JSCはAWS・Google Cloud・DigitalOcean・Cloudflareと連携しています。クラウドパートナーティアやクラウド認証は主張していません。一般的な期間の目安は、SaaS MVPが8〜12週間、中規模製品が3〜6カ月、エンタープライズプラットフォームがスコープによって6〜12カ月以上です(これらは見積もりではなく目安の範囲です)。セキュリティは最初のスプリントから設計に組み込まれています。セキュアコードレビュー、転送時のTLS・保存時のAES暗号化、ロールベースアクセス制御、管理ダッシュボードへのMFA、脆弱性スキャン、ディザスタリカバリ計画が含まれます。AIモデルは製品ごとに選択し、特定ベンダーに縛られません。SaaS開発サービスが製品を構築し、SaaSプロダクトアクセラレーターはアカウント・テナント・ロール・課金の再利用可能なモジュールから開始します。
本記事の限界
- 本記事は一般的なパターンと実践を説明しています。最適な組み合わせは、テナント・データ・リージョン・顧客との契約によって異なります。
- 引用しているAWSホワイトペーパーはAWSによって歴史的参考資料として位置づけられています。分離の原則は広く使用されていますが、サービス固有の詳細については現在のAWSガイダンスを確認してください。
- PostgreSQLはデータベース強制分離の一例として使用しています。他のデータベースは異なるメカニズムを提供しています。
- 期間は一般的な目安の範囲です。Printcartは公開された製品情報をもとに説明しており、ここではパフォーマンス指標は主張していません。
次のステップ
テナントプロファイル・データの機密性・料金モデルをお知らせください。最初のリリースに最適な分離と課金設計を選択するためのソリューションレビューをご予約いただけます。関連サービスを確認するか、Netbase JSCのインサイトをご覧いただくこともできます。
関連サービスとソリューション
自社SaaSを運用するチームによるAI対応SaaS開発
Netbase JSCは、創業者やプロダクトチームがAI機能を備えたマルチテナントのサブスクリプションソフトウェアをローンチ・スケールするためのSaaS開発サービスを提供しています。自社SaaSプラットフォームであるPrintcartおよびAI搭載のCloodoワークプレイスを構築・運用しており、その経験をクライアントのプロダクトに活かしています。標準的なSaaS MVPは、スコープ・インテグレーション・レビュー速度によって異なりますが、8〜12週間が目安です。
詳しく見る
SaaSプロダクトアクセラレーター:実績あるNetbase JSCモジュールでAI対応SaaSを立ち上げる
SaaSプロダクトアクセラレーターは、アカウント・請求・ロール・インテグレーション向けの再利用可能なNetbase JSCモジュール群です。創業者やプロダクトチームがサブスクリプションソフトウェアを迅速に立ち上げられるよう支援し、初回リリースからプロダクト内AIにも対応しています。モジュールの再利用により開発期間を最大60%短縮でき、このアプローチはNetbase JSC自身のWeb to PrintサービスであるPrintcartで実証されています。
詳しく見る
プロジェクトを相談する
Netbase JSCは、デジタルプロダクトおよびAI活用ビジネスシステムの設計・構築・モダナイゼーション・運用を支援します。project@netbasejsc.com
+84 937 869 689
91 Nguyen Chi Thanh, Dong Da, Hanoi, Vietnam
ご連絡ください
構築・モダナイズ・運用したい内容をお聞かせください。