マルチテナンシー
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 でメインコンテナの起動前に初期化処理を実行する特殊なコンテナ
Docker
アプリケーションをコンテナとしてパッケージ化し、どの環境でも同じように実行できるプラットフォーム
関連する記事
技術書の読む順番戦略 - 複数冊を組み合わせて理解を加速させる
技術書を 1 冊ずつ読むのではなく、複数冊を戦略的に組み合わせることで理解の深さと速度を飛躍的に高める方法を解説します。
データベース本ガイド - SQL から設計まで学べる技術書の選び方
データベースの基礎から設計、パフォーマンスチューニングまで学べる技術書の選び方と学習順序を紹介します。
機械学習・AI 本ガイド - エンジニアが読むべき技術書の選び方
機械学習の基礎から実践まで学べる技術書の選び方を紹介。「Python ではじめる機械学習」などのハンズオン本を軸に、数学が苦手な人向けの学習ルートと ML 本の賞味期限の見極め方を解説します。