
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異常検知 |
ログ・監視
| ログ出力先 | ログの種類 |
|---|---|
| S3 | CloudTrailイベント |
標準メトリクス
| メトリクス名 | 説明 |
|---|---|
| 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の容量 |
| データ転送 | リージョン間のデータ転送 |
| Streams | DynamoDB Streamsの読み取りリクエスト |