マルチテナンシー
1 つのシステムで複数のテナント (顧客) のデータを安全に分離して提供するアーキテクチャ
アーキテクチャクラウド
マルチテナンシーとは
マルチテナンシーは、1 つのシステムで複数のテナント (顧客) のデータを安全に分離して提供するアーキテクチャである。SaaS の基本設計。テナント間のデータ漏洩を防ぎつつ、インフラコストを共有する。
分離モデル
分離モデルを以下にまとめる。
| モデル | 分離レベル | コスト | 例 |
|---|---|---|---|
| サイロ | テナントごとに独立リソース | 高 | テナントごとに DynamoDB テーブル |
| プール | 全テナントが共有リソース | 低 | 1 つの DynamoDB テーブルに全テナント |
| ブリッジ | 一部共有、一部分離 | 中 | 共有 Lambda + テナント別テーブル |
DynamoDB でのテナント分離 (プールモデル)
DynamoDB でのテナント分離 (プールモデル) のコード例を示す。
// パーティションキーにテナント ID を含める
await db.put({
TableName: 'items',
Item: {
PK: `TENANT#${tenantId}`,
SK: `ITEM#${itemId}`,
data: { ... },
},
});
// テナントのデータのみ取得
const items = await db.query({
TableName: 'items',
KeyConditionExpression: 'PK = :pk',
ExpressionAttributeValues: { ':pk': `TENANT#${tenantId}` },
});
IAM ポリシーの Condition で、テナントが自分のデータにしかアクセスできないよう制限する。
ノイジーネイバー問題
ノイジーネイバー問題を図で示す。
テナント A: 大量のリクエスト → DynamoDB のスロットリング
テナント B: 通常のリクエスト → テナント A の影響で遅延
| 対策 | 説明 |
|---|---|
| テナントごとのレート制限 | API Gateway の Usage Plan |
| DynamoDB のパーティション設計 | テナント ID をパーティションキーに |
| Lambda の同時実行制限 | テナントごとに上限を設定 |
テナント識別
テナントの識別には、JWT のクレームに tenant_id を含める方法、tenant-a.example.com のようなサブドメイン方式、/api/tenants/{tenantId}/ のようなパスプレフィックス方式、テナントごとに API キーを発行する方法がある。
詳しくは関連書籍を参照。
この記事は役に立ちましたか?
関連用語
DynamoDB
AWS のフルマネージド NoSQL データベースで、ミリ秒単位のレイテンシとシームレスなスケーリングを提供する
IAM (概念)
Identity and Access Management の一般概念で、認証と認可を管理する仕組み
VPC
AWS 上に論理的に隔離されたプライベートネットワークを構築するサービス
Init コンテナ
Kubernetes でメインコンテナの起動前に初期化処理を実行する特殊なコンテナ
コンテナ
アプリケーションとその依存関係をパッケージ化し、環境に依存しない一貫した実行環境を提供する仮想化技術
コンテナオーケストレーション
コンテナのデプロイ、スケーリング、ネットワーキングを自動管理するプラットフォーム