ある SaaS 企業が複数テナントのデータを Azure Cosmos DB for NoSQL の単一コンテナで管理している。テナントごとにデータを論理的に分離しながら、クエリコストとスループットを最適化するために取るべき設計上の正しいアプローチを 2 つ選択してください。
- A. コンテナ全体の整合性レベルを「最終的」に設定することでマルチテナントのスループットを向上させる
- B. テナントごとに別々のコンテナを作成して、物理的にデータを分離する(ただしコンテナ数が増えるためコストに注意する)
- C. すべてのクエリにテナント ID をフィルター条件として含め、意図しない他テナントデータへのアクセスをアプリケーション層で制御する
- D. テナント ID をパーティションキーとして使用し、同一テナントのデータを同一パーティションに集約してクロスパーティションクエリを回避する
- E. Cosmos DB の組み込みロールベースアクセス制御(RBAC)のみでテナント間分離を完全に保証できる
解答と解説を見る
正解: C, D
マルチテナント Cosmos DB の標準設計パターンにおいて、テナント ID をパーティションキーにすることで同一テナントのデータが同一物理パーティションに集まり、テナント単位のクエリがクロスパーティション不要で効率的に実行できる。これはスループットコストの最適化にも直結する。また、アプリケーション層でクエリに必ずテナント ID フィルターを付加することで、バグや設定ミスによる他テナントデータへの意図しないアクセスを防ぐ多層防御が実現できる。選択肢 B のテナントごとの別コンテナは確実な分離を提供するが、コンテナ数が増えると最低スループット課金(400 RU/s × コンテナ数)が積み重なりコストが大幅に増加するため、テナント数が多い SaaS では単一コンテナのマルチテナント設計が推奨される。選択肢 A の整合性レベルはスループットと一貫性のトレードオフであり、マルチテナント固有の最適化ではなく全テナントに一律適用される。選択肢 E の RBAC は管理操作の権限制御には有効だが、データ行レベルでのテナント分離(行レベルセキュリティ)を Cosmos DB の RBAC のみで完全に保証することはできない。アプリケーション層のフィルタリングとの組み合わせが必要である。