マルチテナンシー
1 つのシステムで複数のテナント (顧客) のデータを安全に分離して提供するアーキテクチャ
アーキテクチャクラウド
マルチテナンシーとは
マルチテナンシーは、1 つのシステムで複数のテナント (顧客) のデータを安全に分離して提供するアーキテクチャである。SaaS の基本設計。テナント間のデータ漏洩を防ぎつつ、インフラコストを共有する。
分離モデル
| モデル | 分離レベル | コスト | 例 |
|---|---|---|---|
| サイロ | テナントごとに独立リソース | 高 | テナントごとに DynamoDB テーブル |
| プール | 全テナントが共有リソース | 低 | 1 つの DynamoDB テーブルに全テナント |
| ブリッジ | 一部共有、一部分離 | 中 | 共有 Lambda + テナント別テーブル |
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 キーを発行する方法がある。
詳しくは関連書籍を参照。