Cloud Service
Azure Table Storage
キーバリュー型のスキーマレスNoSQLテーブル。大量データを安価に保存でき、AWS の DynamoDB の簡易版に相当する。
- 1.パーティションキーと行キーで引くスキーマレスな NoSQL テーブル。
- 2.ギガ・テラ級の半構造化データを低コストで保存するのに向く。
- 3.高機能やグローバル分散が要るなら Cosmos DB へ移行を検討する。
解決する課題
スキーマ設計やインデックス管理に手間をかけずに、大量の半構造化データをとにかく安く保存したい、というニーズに応えます。リレーショナルな結合や複雑なクエリは不要で、「キーを指定して引く」アクセスが中心のワークロードに向きます。
- ログ、IoT のテレメトリ、ユーザープロファイルなど、項目数が膨大になるデータを置きたい
- スキーマが頻繁に変わる、または項目ごとに列が違う半構造化データを扱いたい
- RDB ほどの機能は要らず、できるだけ低コストでストレージを確保したい
- キーで素早く引ければよく、複雑な検索や結合は不要
AWS で言えば DynamoDB の最小機能セットに近く、ストレージ課金が中心の簡易版という位置づけです。
主要概念と用語
- ストレージアカウント: テーブルを束ねる入れ物。Blob やキューと同じアカウント上に同居する
- テーブル: 項目(エンティティ)の集合。スキーマ定義は不要で、行ごとに異なるプロパティを持てる
- エンティティ(Entity): 1件のレコードに相当。最大プロパティ数や1件あたりサイズに上限がある
- パーティションキー(PartitionKey): データの物理分散を決めるキー。同じ値の項目は同一パーティションにまとまる(DynamoDB のパーティションキーに相当)
- 行キー(RowKey): パーティション内で項目を一意に識別するキー(DynamoDB のソートキーに近い役割)
- 主キー: パーティションキーと行キーの組み合わせ。この2つで1件を一意に特定する
- タイムスタンプ(Timestamp): 各エンティティに自動付与される更新時刻。サーバー側で管理される
- プロパティ: 列に相当。文字列、数値、真偽値、日時、バイナリなどの型を持てる
仕様・制限・クォータ
- スキーマレス: 同じテーブル内でもエンティティごとにプロパティ構成を変えられる
- インデックスはキーのみ: パーティションキーと行キーにのみインデックスがあり、それ以外のプロパティでの検索はテーブルスキャンになる
- 1エンティティあたりのプロパティ数とサイズに上限があり、1件は数百キロバイト程度までに収まる(大きな本文は Blob に逃がす)
- クエリ言語は SQL ではなく、プロパティに対するフィルター式で行う。結合や集計、グループ化はサポートしない
- トランザクションはエンティティグループトランザクションに限定され、同一パーティションキー内の複数操作をまとめて1回で実行できる(パーティションをまたぐ原子的更新はできない)
- 厳密な数値は変動しうるため公式ドキュメントで確認すること
内部の仕組み
Table Storage はパーティションキーを使ってデータを内部のパーティションに振り分け、負荷に応じて自動でスケールします。同じパーティションキーを持つ項目は同じパーティションに集まり、その範囲内では行キー順に並びます。したがってパーティションキーの設計が性能を左右します。
- パーティションキーと行キーの両方を指定する「ポイントクエリ」が最も高速で安価
- パーティションキーを固定して行キーの範囲を絞る「レンジクエリ」も効率がよい
- キーを指定しない検索は全パーティションを走査するテーブルスキャンとなり、遅く高コストになる
- 1つのパーティションへアクセスが集中するとホットパーティションとなり、スループットの上限に当たりやすい
最も頻繁に使うアクセスパターンを先に決め、それがポイントクエリかレンジクエリで完結するようにパーティションキーと行キーを設計する。キー以外でしか絞れない検索を多用する設計は、スキャンが増えて遅くなる。
設計パターン / ベストプラクティス
- アクセスパターンを列挙し、読み取りがキーで完結するようパーティションキーと行キーを決める
- 1つのキーに偏らないよう、カーディナリティが高く負荷が分散するパーティションキーを選ぶ
- 時系列ログでは、行キーに逆順のタイムスタンプを入れて新しい順に取りやすくするなどの工夫をする
- 同じデータを別のキー設計で**重複保存(デノーマライズ)**し、複数のアクセスパターンに備える
- 大きなバイナリや本文は Table に入れず Blob Storage に置き、Table にはキーやメタデータだけを持たせる
- 同一パーティション内のまとめ更新にはエンティティグループトランザクションを使う
運用・監視
- Azure Monitor / ストレージメトリクスでトランザクション数、レイテンシ、エラー率を監視する
- スロットリングを示すステータス(要求が多すぎる旨のレスポンス)が出たら、ホットパーティションやアクセス集中を疑う
- 診断ログを Log Analytics に送り、遅いクエリや高頻度のスキャンを特定する
- バックアップ用途では、データのコピーやエクスポートの仕組みを別途用意する(テーブルのポイントインタイム復元のような高度な機能は前提にしない)
コスト
Table Storage の最大の魅力は安さです。課金は基本的に保存データ量とトランザクション数で決まり、スループットを事前に確保して支払う方式ではありません。同じキーバリュー用途でも、機能が豊富な Cosmos DB に比べて単純なストレージ課金で済むため、低トラフィックや大量保存のケースでコストを抑えられます。
| コスト要素 | 課金の考え方 | 抑えるコツ |
|---|---|---|
| ストレージ | 保存したデータ量に応じて課金 | 不要データは削除しサイズを小さく保つ |
| トランザクション | 読み書きなどの操作回数に応じて課金 | スキャンを避けキー指定で操作回数を減らす |
| データ転送 | リージョン外への送信で課金 | アプリと同一リージョンに配置する |
セキュリティ
- 保存時暗号化はデフォルトで有効(ストレージサービスの暗号化)。通信は TLS で暗号化される
- アクセス制御はアカウントキー、SAS(Shared Access Signature)、Microsoft Entra ID(RBAC) から選べる。キーのハードコードを避け、可能なら Entra ID とマネージド ID を使う
- SAS を使えば、有効期限や権限を絞った一時的なアクセスを発行できる
- プライベートエンドポイント(Private Link) で VNet 内からの到達に限定し、パブリックアクセスを最小化する
アカウントキーはアカウント全体への強い権限を持つ。アプリに直接埋め込むと漏えい時の影響が大きいため、Entra ID とマネージド ID による認証を優先し、外部共有には権限と期限を絞った SAS を使う。
Well-Architected の観点
- コスト最適化: スループットを確保して払う方式ではなく保存量とトランザクション課金が中心のため、大量データの保管や低トラフィック用途で費用を大きく抑えられる
- パフォーマンス効率: ポイントクエリとレンジクエリに最適化されており、キー設計が適切なら大規模でも安定して高速に引ける。一方でキー以外の検索や集計は不得意なので、要件が合うかを見極める
グローバル分散、SLA で保証された一桁ミリ秒応答、複数の整合性レベル、変更フィードといった高度な機能が必要なら、Table Storage では力不足。Cosmos DB(Table API を含む)への移行を検討する。
試験で問われるポイント
- パーティションキーと行キーの組み合わせが主キーであり、この2つでエンティティを一意に特定する点
- 検索はキーで引くのが基本で、キー以外のプロパティでの検索はテーブルスキャンになり遅い点
- スキーマレスで、同一テーブル内でもエンティティごとにプロパティ構成を変えられる点
- 機能はシンプルだが低コストであり、高機能・グローバル分散が要る場合は Cosmos DB を選ぶという棲み分け
- AWS の DynamoDB の簡易版に相当し、Cosmos DB の Table API でほぼ互換の高機能版へ移行できる点
関連サービス・比較
同じキーバリューの世界でも、シンプルで安い Table Storage と、高機能でグローバル分散できる Cosmos DB のどちらを選ぶかが論点になります。AWS の対応サービスとあわせて整理します。
| 観点 | Azure Table Storage | Azure Cosmos DB(Table API) |
|---|---|---|
| 位置づけ | 安価でシンプルな NoSQL テーブル | 高機能なグローバル分散 NoSQL |
| 課金 | ストレージとトランザクション中心 | 確保した RU とストレージ |
| レイテンシ保証 | 明示的な保証はなし | SLA で一桁ミリ秒を保証 |
| グローバル分散 | 単一リージョン中心 | 複数リージョンへ無停止で拡張 |
| インデックス | キーのみ | 全プロパティを自動インデックス |
| AWS の相当 | DynamoDB の簡易版に近い | DynamoDB に相当 |
ハンズオン / CLI例
# リソースグループを作成
az group create --name demo-rg --location japaneast
# ストレージアカウントを作成(Table はこのアカウント上に作る)
az storage account create \
--name demotablestg0614 \
--resource-group demo-rg \
--location japaneast \
--sku Standard_LRS
# アカウントキーを取得して環境変数に入れる
az storage account keys list \
--account-name demotablestg0614 \
--resource-group demo-rg \
--query "[0].value" -o tsv
# テーブルを作成
az storage table create \
--name Orders \
--account-name demotablestg0614
# エンティティを1件挿入(PartitionKey と RowKey が主キー)
az storage entity insert \
--account-name demotablestg0614 \
--table-name Orders \
--entity PartitionKey=user001 RowKey=order100 Amount=1500 Status=paid
# パーティションキーと行キーを指定してポイントクエリで取得
az storage entity show \
--account-name demotablestg0614 \
--table-name Orders \
--partition-key user001 \
--row-key order100
Azure Service
Azure Table Storageを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
データベース
比較で見る軸
クラウド: Azure / カテゴリ: データベース / 難易度: basic
導入後に効く点
ギガ・テラ級の半構造化データを低コストで保存するのに向く。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Azure
- カテゴリ
- データベース
- 難易度
- basic
- 関連資格
- —
- 設計柱
- cost / performance
判断チェックリスト
- 自社の用途が「データベース / cost」に近いか確認する。
- 強みである「パーティションキーと行キーで引くスキーマレスな NoSQL テーブル。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。