マルチテナンシー

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 キーを発行する方法がある。

詳しくは関連書籍を参照。

関連用語