Cloud Service
Azure Cosmos DB
フルマネージドのサーバーレス分散NoSQL。一桁ミリ秒の応答と、複数リージョンへの無停止スケールを実現する。AWS の DynamoDB に相当。
- 1.一桁ミリ秒で応答するグローバル分散のマネージド NoSQL。
- 2.RU/s でスループットを確保し、多リージョンへ無停止拡張。
- 3.成否はパーティションキー設計次第。偏ると 429 で詰まる。
解決する課題
世界中のユーザーへ、容量計画やシャーディングの手間なしに、安定したミリ秒応答を届けます。
- アクセスが急増しても落ちない/遅くならないDBが欲しい
- DBの容量計画・シャーディングを自分でやりたくない
- ミリ秒の応答を安定して出したい(SLA で保証されたレイテンシ)
- 単一リージョンでは足りず、世界中に低遅延で配信したい
主要概念と用語
- API の選択: 作成時に API を選ぶ。
API for NoSQL(ネイティブ・最も機能が豊富)/MongoDB/Apache Cassandra/Apache Gremlin(グラフ)/Table(DynamoDB の Table API 相当) - アカウント → データベース → コンテナー → 項目(Item): 階層構造。コンテナーが DynamoDB のテーブルに相当
- パーティションキー: データの物理分散を決める最重要キー(DynamoDB の PK に相当)
- RU/s(Request Unit per second): スループットの統一通貨。読み書きやクエリのコストを RU で表し、毎秒の RU を確保する
- スループットモード: プロビジョンド(手動/自動スケール)/ サーバーレス
- 整合性レベル: 強固 / 有界整合性制約 / セッション(既定)/ 整合性プレフィックス / 結果整合性 の5段階
- 変更フィード(Change Feed): 変更をイベント順に流す(DynamoDB Streams に相当。Azure Functions と連携)
- TTL / 統合キャッシュ: 項目の自動失効 / 専用ゲートウェイ上のキャッシュ(DAX に近い役割)
仕様・制限・クォータ
- 1項目(ドキュメント)の最大サイズは 2MB(DynamoDB の 400KB より大きい)
- 論理パーティション1つあたりのデータ上限は 20GB、スループット上限は 10,000 RU/s
- 5段階の整合性レベルを選べる(DynamoDB は「結果整合性 / 強い整合性」の2択)
- ターンキーのグローバル分散: ポータルから数クリックでリージョンを追加し、読み取り/書き込みを多リージョン化できる
- **マルチリージョン書き込み(マルチマスター)**に対応し、各リージョンでローカルに書き込める
- 可用性・スループット・レイテンシ(読み書き P99 で一桁ミリ秒)・整合性に 金銭的裏付けのある SLA
内部の仕組み
Cosmos DB はパーティションキーを ハッシュして「論理パーティション」へ振り分け、それを内部の「物理パーティション」に配置します。データ量やスループットが増えると、物理パーティションを自動で分割・再配置してスケールします。ゆえに パーティションキー設計=性能設計 で、特定キーへ偏るとホットパーティションとなり、RU を使い切ってスロットル(HTTP 429)が発生します。
- データは各リージョン内で4レプリカに保持され、書き込みは局所多数へ複製される
- すべての項目フィールドが既定で自動インデックスされる(スキーマ/インデックス定義が原則不要)。不要なパスを除外して RU を節約できる
RDB の正規化ではなくアクセスパターン駆動設計。「どう問い合わせるか」を先に決めて、カーディナリティが高く読み書きが均等に分散するパーティションキーを選ぶ。クエリにキーを含めれば単一パーティションで完結し、RU を最小化できる。
設計パターン / ベストプラクティス
- アクセスパターンを列挙し、分散が均等になるパーティションキーを選ぶ(合成キーも有効)
- スパイクが読めない/間欠的なら サーバーレス、定常負荷なら 自動スケール(Autoscale) か手動プロビジョンド
- 変更駆動の処理は 変更フィード → Azure Functions(Cosmos DB トリガー)
- 読み取りが激しく同一クエリが多いなら 専用ゲートウェイ + 統合キャッシュ でRUを削減
- クロスパーティションの全件スキャンを避け、パーティションキーを指定して絞る
運用・監視
- Azure Monitor / Metrics でメトリクスを監視。
Total Request Units、Total Requests、ステータス429(スロットル)の発生率を確認 - スロットル(429)が出たら、ホットパーティション or RU 不足を疑う。自動スケールで上限を引き上げるか、パーティションキーを見直す
- 診断ログ(Diagnostic Settings) を Log Analytics へ送り、
DataPlaneRequestsで高 RU クエリを特定 - クエリ実行時に返る RU チャージを計測し、コストの高いクエリを最適化する
コスト
スループットモードの使い分けがコスト最適化の肝です。課金は RU/s + ストレージ(保存データ量) で決まります。
| スループットモード | 課金 | 向いている用途 |
|---|---|---|
| プロビジョンド(手動) | 確保した RU/s に対して固定 | 負荷が読める定常的な本番 |
| 自動スケール(Autoscale) | 上限内で使った RU に応じ自動増減 | 変動はあるがピークが読める負荷 |
| サーバーレス | 消費した RU 分のみ(ピーク課金なし) | 間欠的・低トラフィック・開発検証 |
| 予約容量(Reserved Capacity) | 1〜3年コミットで最大〜65%割引 | 長期的に動かす大規模ワークロード |
セキュリティ
- 保存時暗号化はデフォルト(Microsoft 管理キー。Key Vault のカスタマーマネージドキーも選択可)。通信は常に TLS で暗号化
- マネージド ID + Microsoft Entra ID(RBAC) でデータプレーン/コントロールプレーンの権限を制御し、キーのハードコードを避ける(AWS の IAM ロール相当)
- プライベートエンドポイント(Private Link) で VNet 内から到達させ、パブリックアクセスやファイアウォールで IP を最小化
プライマリキー(マスターキー)をアプリにハードコードして配るのは NG。漏れれば全データを操作されます。マネージド ID + Entra ID の RBAC か、最低でも権限を絞ったリソーストークンを使う。
関連サービス・比較(AWS との対応)
| 観点 | Azure Cosmos DB | Amazon DynamoDB |
|---|---|---|
| 位置づけ | グローバル分散NoSQL(マルチモデル) | サーバーレスNoSQL(キーバリュー/ドキュメント) |
| スループット単位 | RU/s(読み書き共通の通貨) | RCU/WCU(読み/書きで別) |
| 容量モード | プロビジョンド/自動スケール/サーバーレス | プロビジョンド/オンデマンド |
| 整合性 | 5段階(強固〜結果整合性) | 結果整合性 / 強い整合性 の2択 |
| 多リージョン書き込み | マルチリージョン書き込み | グローバルテーブル |
| 変更ストリーム | 変更フィード → Functions | DynamoDB Streams → Lambda |
| キャッシュ | 統合キャッシュ(専用ゲートウェイ) | DAX |
| 権限付与 | マネージド ID + Entra ID/RBAC | IAM |
ハンズオン / CLI例
# リソースグループを作成
az group create --name demo-rg --location japaneast
# Cosmos DB アカウントを作成(API for NoSQL)
az cosmosdb create \
--name demo-cosmos-acct \
--resource-group demo-rg \
--locations regionName=japaneast failoverPriority=0 isZoneRedundant=False \
--default-consistency-level Session
# データベースを作成
az cosmosdb sql database create \
--account-name demo-cosmos-acct \
--resource-group demo-rg \
--name AppDb
# コンテナーを作成(パーティションキー=/userId, 自動スケール上限 4000 RU/s)
az cosmosdb sql container create \
--account-name demo-cosmos-acct \
--resource-group demo-rg \
--database-name AppDb \
--name Orders \
--partition-key-path "/userId" \
--max-throughput 4000
# 別リージョンを追加して多リージョン化(読み取りを近くで)
az cosmosdb update \
--name demo-cosmos-acct \
--resource-group demo-rg \
--locations regionName=japaneast failoverPriority=0 isZoneRedundant=False \
--locations regionName=koreacentral failoverPriority=1 isZoneRedundant=False
Azure Service
Azure Cosmos DBを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
データベース
比較で見る軸
クラウド: Azure / カテゴリ: データベース / 難易度: intermediate
導入後に効く点
RU/s でスループットを確保し、多リージョンへ無停止拡張。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Azure
- カテゴリ
- データベース
- 難易度
- intermediate
- 関連資格
- —
- 設計柱
- performance / reliability / cost / security
判断チェックリスト
- 自社の用途が「データベース / performance」に近いか確認する。
- 強みである「一桁ミリ秒で応答するグローバル分散のマネージド NoSQL。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。
他クラウドの同等サービス
役割が近いサービスです。設計の置き換えや比較検討の参考に。