DynamoDB — マネージド NoSQL
概要
Amazon DynamoDB は AWS のフルマネージド NoSQL データベース。 キーバリュー / ドキュメントの両モデルをサポートし、自動スケーリング・無停止運用・SLA 99.999% という非常に強い可用性を提供します。 サーバを意識せずに使えるため、Lambda + DynamoDB のサーバレス構成で「コードだけで動くアプリ」が組めるのが特徴です。
RDB と違ってスキーマ定義はありません。ただし「クエリパターンを先に決めて、それに最適化したキー設計をする」という発想の転換が必要で、そこで詰まる人が多いサービスでもあります。
主な機能
- PK (Partition Key) — 必須。ハッシュ値で物理シャードを決める。
- SK (Sort Key) — 任意。同じ PK 内でソート / 範囲クエリができる。PK + SK の複合主キーが定番。
- GSI (Global Secondary Index) — 別の PK/SK でクエリできる二次インデックス。最大 20 個。
- LSI (Local Secondary Index) — 同じ PK 内で別の SK を使う。テーブル作成時にしか作れない。
- On-Demand 課金 — リクエスト数ベース。プロビジョニングが要らない。
- Provisioned 課金 — RCU/WCU を予約して定額化。安定したワークロードで安い。
- PITR (Point-in-Time Recovery) — 過去 35 日間の任意時点に復旧できるバックアップ。誤削除復旧の最後の砦。
- TTL — 属性の UNIX タイムスタンプを過ぎた item を自動削除。セッション管理に便利。
- DynamoDB Stream — テーブル変更を順次配信。Lambda トリガで cross-table 整合性や監査ログに利用。
- Transactions — 100 件まで ACID 保証で書き込める。複数テーブル横断も可。
- Conditional Write — condition-expression で楽観的ロックが可能。
使うべきパターン
- サーバレス API のバックエンド — Lambda + API Gateway + DynamoDB の三種の神器。月数百円スタートでスケール無限。
- セッション / キャッシュ的なストア — TTL で自動削除、低レイテンシ (1 桁 ms)、可用性高。
- イベントソーシング / 監査ログ — Stream + Lambda で変更を別テーブルに伝搬する設計。
- 突発的なアクセス スパイクが起きるサービス — On-Demand なら自動でスケール、人手介入なし。
使わない方が良いパターン
- JOIN や複雑な集計 — DynamoDB は単純な key lookup と範囲クエリが基本。集計は別途 Athena や Aurora Serverless v2 を検討。
- クエリパターンが事前に決まらない — 後からインデックスを足すのは可能だが、設計の見直しが頻発するなら RDS / Aurora が楽。
- スキーマがリレーショナル — 外部キー制約や複雑な正規化が要るなら RDB。
- 大量の Scan を毎回叩くワークロード — 全件走査はコスト・速度ともに不利。Query 一択になるよう PK/GSI を設計する。
Terraform 最小サンプル(PK + SK + GSI 付き On-Demand)
resource "aws_dynamodb_table" "orders" {
name = "orders"
billing_mode = "PAY_PER_REQUEST" # On-Demand
hash_key = "user_id"
range_key = "order_id"
attribute { name = "user_id"; type = "S" }
attribute { name = "order_id"; type = "S" }
attribute { name = "order_date"; type = "S" }
# GSI: 日付順で検索したい時用
global_secondary_index {
name = "user-date-index"
hash_key = "user_id"
range_key = "order_date"
projection_type = "ALL"
}
# PITR (誤削除復旧)
point_in_time_recovery { enabled = true }
# TTL (任意)
ttl {
attribute_name = "expires_at"
enabled = true
}
# Stream (Lambda トリガで使う場合)
stream_enabled = true
stream_view_type = "NEW_AND_OLD_IMAGES"
}
用語集
- PK / SK
- Partition Key / Sort Key。複合主キーで item を一意化する。
- GSI
- Global Secondary Index。テーブル作成後でも追加可能、別の PK/SK でクエリできる。
- LSI
- Local Secondary Index。同じ PK の中で別の SK を使う。テーブル作成時しか作れない。
- RCU / WCU
- Read Capacity Unit / Write Capacity Unit。Provisioned モードでの課金単位。
- On-Demand / PAY_PER_REQUEST
- リクエスト数ベースの従量課金。プロビジョニング不要。
- PITR (Point-in-Time Recovery)
- 過去 35 日間の任意時点に復旧可能なバックアップ機能。
- TTL
- UNIX タイムスタンプ属性が過去になると item を自動削除する仕組み。
- Stream
- テーブル変更を順次配信するイベントソース。Lambda トリガで連携可能。
- Transactions
- 最大 100 件 ACID 保証で書き込める仕組み。複数テーブル横断も可。
- Conditional Write
- 「ある条件を満たす時だけ書き込む」操作。楽観的ロック実装の基本。