DynamoDB

DynamoDB は、フルマネージド型の NoSQL データベース(キーと値/ドキュメント型)であり、ミリ秒単位の低レイテンシを実現します。

PK(パーティションキー)SK(ソートキー)設計 が性能の要であり、適切な パーティション 設計によって大規模データでも安定したスループットを維持できます。

スケーリング面では、トラフィックに応じて自動で拡張できる オンデマンド容量モード と、事前にスループットを指定する プロビジョンド容量モード の 2 種類を選択できます。プロビジョンドモードでは、読み書きスループットを Read/Write Capacity Units(キャパシティユニット) で管理します。

DynamoDB では、Global Tables(グローバルテーブル) によりマルチリージョンでのデータ複製を自動的に行い、世界中のユーザーに低遅延でアクセスできるようにします。また、GSI/LSI(二次インデックス) を利用することで、プライマリキー以外の属性に基づいた柔軟な検索が可能です。

DAX(DynamoDB Accelerator) を活用することで、インメモリキャッシュによるマイクロ秒単位の応答速度を実現できます。加えて、TTL(Time To Live) 機能による自動削除や、Streams 機能による変更イベントの通知・他サービスとの連携(例:Lambda トリガー)も可能です。

DynamoDB はサーバーレスであり、運用負担がなく、高可用性とスケーラビリティを兼ね備えています。課金はリクエスト数とストレージ使用量に基づいて行われ、コスト効率にも優れています。

重要用語

関連サービス

ユースケース

大規模トラフィック対応のキーバリューストアログインセッション情報やユーープロファイルなどをNoSQLテーブルに保存し、高トラフィックでも安定した低レイテンシアクセスを実現する。
サーバーレスアプリケーションの永続データストアLambdaやAPI Gatewayと組み合わせて、サーバーを持たない完全サーバーレス構成のバックエンドデータベースとして利用する。
IoT・ゲームなどの高頻度書き込みセンサー情報、ゲーム状態、ランキング情報など、更新頻度の高いデータをスケーラブルに蓄積するNoSQLストアとして利用する。

ベストプラクティス

アクセスパターン駆動設計テーブル設計はあらかじめアクセスパターンを洗い出してから行う。
オンデマンドまたはAuto Scaling利用ワークロードに応じてオンデマンドやキャパシティオートスケーリングを選択する。
パーティションキーの分散ホットパーティションを避けるためにキーを均等に分散させる。

高可用性・バックアップ・リトライ

高可用性・バックアップ・リトライ設計のポイント
【デフォルト】AWS内部で冗長化
 ・インフラストラクチャ(サーバー、ネットワーク機器などのハードウェアが冗長構成)
 ・ストレージレベルの冗長化(各AZ内でSSDストレージが冗長構成で保持される)
 ・AZ間の冗長化(同一リージョン内の3つの異なるAZに自動的にデータがレプリケートされる)
 ・データの同期レプリケーション(書き込み操作は複数のAZに同期的にレプリケートされてから完了)
【パーティションキー】設計による負荷分散(アクセスパターンの均等化)
【グローバルテーブル】(ディザスタリカバリ要件がある場合、書き込みはどのリージョンでも可能)
【自動バックアップ】バックアップ保持期間 35 日固定(PITR 有効時)
 デフォルト 無効(PITR は明示的に有効化が必要)
 テーブルデータを継続的にS3にバックアップ
 PITR:継続的バックアップにより、直近 35 日間の任意時点に復元可能
【オンデマンドバックアップ】任意のタイミングで手動スナップショットを取得可能
 保持期限は無制限(ユーザーが削除するまで保持)
 テーブル全体を S3 ベースの永続ストレージに保存
 スナップショットからいつでもテーブルを復元可能(スナップショット時点での復元)

セキュリティ

関連サービス設定内容
KMS(データの暗号化と鍵の安全管理)【AWS管理キーによる暗号化を実施】
独自KMSキーを使うことを推奨(鍵操作、監査)
Secrets Manager(機密情報の安全管理)-
SSM Parameter Store(設定情報の一元管理)-
CloudTrail(操作履歴の記録・監査・追跡)【自動記録】
作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI)

【記録限定し有効化を推奨】
データ操作(PutItem / GetItem / DeleteItem)をすべて記録するとコスト増加やログ肥大化の懸念があるため、重要なテーブル(監査対象や機密データを含むテーブル)に限定してデータイベント(データプレーンAPI)を有効化する。
Config(リソースの構成状態・設定変更を記録)【Configが有効な場合】
テーブル設定変更履歴・暗号化/ポイントインタイムリカバリ(PITR)等の準拠評価
GuardDuty(脅威を自動検出)【GuardDutyが有効な場合】
テーブル操作のAPI異常検知

ログ・監視

ログ出力先ログの種類
S3CloudTrailイベント
CloudWatch Logs優先の原則
標準メトリクス
メトリクス名説明
SuccessfulRequestLatency成功リクエストレイテンシ
AccountProvisionedReadCapacityUtilizationアカウント読み取り容量使用率
AccountProvisionedWriteCapacityUtilizationアカウント書き込み容量使用率
ConsumedReadCapacityUnits消費読み取りキャパシティユニット
ConsumedWriteCapacityUnits消費書き込みキャパシティユニット
MaxProvisionedTableReadCapacityUtilizationテーブル最大読み取り容量使用率
MaxProvisionedTableWriteCapacityUtilizationテーブル最大書き込み容量使用率
OnlineIndexConsumedWriteCapacityオンラインインデックス消費書き込み容量
ProvisionedReadCapacityUnitsプロビジョン済み読み取りキャパシティ
ProvisionedWriteCapacityUnitsプロビジョン済み書き込みキャパシティ
ConditionalCheckFailedRequests条件チェック失敗リクエスト数
SystemErrorsシステムエラー数
ThrottledRequestsスロットルされたリクエスト数
UserErrorsユーザーエラー数

制限値(固定値/ハードリミット/ソフトリミット)

固定値制限値
テーブルサイズ無制限

ハードリミット制限値
アイテムサイズ最大400 KB
ローカルセカンダリインデックス数/テーブル5
パーティションキーの長さ最大2,048 Bytes
ソートキーの長さ最大1,024 Bytes
ストリームの保持期間24時間
トランザクションあたりのアイテム数100

ソフトリミット制限値
グローバルセカンダリインデックス数/テーブル20
アカウントレベル読み取りスループット80,000 RCU(初期)
アカウントレベル書き込みスループット80,000 WCU(初期)
テーブルレベル読み取りスループット40,000 RCU(初期)
テーブルレベル書き込みスループット40,000 WCU(初期)
同時インポートジョブ数50(合計15 TB)
同時エクスポートジョブ数300(合計100 TB)
同時リストアジョブ数50(合計50 TB)

AWS CLIのサンプルコード

DynamoDBテーブルを作成する
aws dynamodb create-table \
  --table-name MyTable \
  --attribute-definitions \
    AttributeName=UserId,AttributeType=S \
  --key-schema \
    AttributeName=UserId,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST
DynamoDBテーブルの一覧を表示する
aws dynamodb list-tables
DynamoDBテーブルを表示する(テーブル名 指定)
aws dynamodb describe-table \
  --table-name MyTable
DynamoDBテーブルを削除する(テーブル名 指定)
aws dynamodb delete-table \
  --table-name MyTable

オンデマンドバックアップの作成(テーブル名 指定)
aws dynamodb create-backup \
  --table-name MyTable \
  --backup-name MyTable-backup-20241206
バックアップ一覧の表示(テーブル名 指定)
aws dynamodb list-backups \
  --table-name MyTable
バックアップから復元(テーブル名、バックアップARN 指定)
aws dynamodb restore-table-from-backup \
  --target-table-name MyTable-restored \
  --backup-arn arn:aws:dynamodb:ap-northeast-1:123456789012:table/MyTable/backup/01234567890123-abcdefgh

項目の追加(Put)(テーブル名 指定)
aws dynamodb put-item \
  --table-name MyTable \
  --item '{"UserId": {"S": "user123"}, "Name": {"S": "田中太郎"}, "Age": {"N": "30"}}'
項目の取得(Get)(テーブル名 指定)
aws dynamodb get-item \
  --table-name MyTable \
  --key '{"UserId": {"S": "user123"}}'
項目の更新(Update)(テーブル名 指定)
aws dynamodb update-item \
  --table-name MyTable \
  --key '{"UserId": {"S": "user123"}}' \
  --update-expression "SET Age = :age" \
  --expression-attribute-values '{":age": {"N": "31"}}'
項目の削除(Delete)(テーブル名 指定)
aws dynamodb delete-item \
  --table-name MyTable \
  --key '{"UserId": {"S": "user123"}}'
項目の検索(Query)(テーブル名 指定)
aws dynamodb query \
  --table-name Orders \
  --key-condition-expression "UserId = :uid" \
  --expression-attribute-values '{":uid": {"S": "user001"}}'

CloudFormationのサンプルコード

Terraformのサンプルコード

料金計算

課金項目説明
オンデマンド読み取り/書き込みリクエスト単位
(RRU/WRU)
プロビジョニング済み読み取り/書き込みキャパシティユニット
(RCU/WCU)
ストレージ保存されるデータ容量
グローバルテーブルレプリケーションの書き込みリクエスト
バックアップオンデマンドバックアップとPITRの容量
データ転送リージョン間のデータ転送
StreamsDynamoDB Streamsの読み取りリクエスト
料金計算ツール

公式ページ

AWSドキュメント DynamoDB