AWSに戻る

Amazon DynamoDB

Amazon DynamoDBとは

Amazon DynamoDBは、AWSが提供するフルマネージドのNoSQLデータベースサービスです。あらゆる規模で一貫した1桁ミリ秒のパフォーマンスを提供し、インターネット規模のアプリケーションに対応するシームレスなスケーラビリティを備えています。DynamoDBはサーバーレスで、プロビジョニング、パッチ適用、ハードウェアプロビジョニング、セットアップ、構成、レプリケーション、ソフトウェアパッチ適用、クラスタースケーリングなどの管理タスクを自動化します。また、組み込みのセキュリティ、継続的バックアップ、マルチリージョンレプリケーション、インメモリキャッシュなどの機能を提供します。

Amazon DynamoDBの主な特徴

Amazon DynamoDBの基本概念

DynamoDBの基本的な概念は以下の通りです:

概念 説明
テーブル 項目(行)のコレクション。DynamoDBのデータは全てテーブルに保存される
項目(Item) テーブル内の1つのデータエントリ。リレーショナルデータベースの「行」に相当
属性 項目内の基本的なデータ要素。リレーショナルデータベースの「列」に相当
プライマリキー テーブル内の各項目を一意に識別するキー。パーティションキーのみ、またはパーティションキーとソートキーの組み合わせ
パーティションキー 項目のデータをどのパーティションに保存するかを決定するプライマリキーの一部
ソートキー 同じパーティションキーを持つ項目をソートするために使用される、プライマリキーのオプション部分
セカンダリインデックス 代替キーを使用してテーブルのデータにアクセスするための追加のデータ構造
読み取り/書き込み容量 テーブルが処理できる読み取りと書き込みの量を定義するスループット設定

DynamoDBのデータモデル

DynamoDBはスキーマレスなデータベースですが、各項目には以下のデータ型を持つ属性を含めることができます:

各項目のサイズは最大400KBまでです。

Amazon DynamoDBのキャパシティモード

DynamoDBには2つのキャパシティモードがあり、読み取りと書き込みのスループットの課金方法と管理方法が異なります:

キャパシティモード 説明 ユースケース
プロビジョンドモード テーブルの読み取りと書き込みのキャパシティユニットを事前に指定。Auto Scalingを使用して自動的に調整可能 予測可能なトラフィックパターン、コスト管理が重要なアプリケーション
オンデマンドモード 使用した分だけ支払う従量課金制。キャパシティの計画が不要 予測不可能なトラフィックパターン、変動の激しいワークロード、新しいアプリケーション

Amazon DynamoDBの使用方法

DynamoDBは、AWS Management Console、AWS CLI、AWS SDKs、またはNoSQLワークベンチを使用して利用できます。

テーブルの作成と管理

AWS CLIを使用したテーブルの作成

aws dynamodb create-table \
    --table-name Users \
    --attribute-definitions \
        AttributeName=UserId,AttributeType=S \
    --key-schema \
        AttributeName=UserId,KeyType=HASH \
    --provisioned-throughput \
        ReadCapacityUnits=5,WriteCapacityUnits=5

複合プライマリキーを持つテーブルの作成

aws dynamodb create-table \
    --table-name UserPosts \
    --attribute-definitions \
        AttributeName=UserId,AttributeType=S \
        AttributeName=PostId,AttributeType=S \
    --key-schema \
        AttributeName=UserId,KeyType=HASH \
        AttributeName=PostId,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=5,WriteCapacityUnits=5

グローバルセカンダリインデックスの追加

aws dynamodb update-table \
    --table-name UserPosts \
    --attribute-definitions \
        AttributeName=PostType,AttributeType=S \
        AttributeName=PostDate,AttributeType=S \
    --global-secondary-index-updates \
        "[
            {
                \"Create\": {
                    \"IndexName\": \"PostTypeIndex\",
                    \"KeySchema\": [
                        {\"AttributeName\":\"PostType\",\"KeyType\":\"HASH\"},
                        {\"AttributeName\":\"PostDate\",\"KeyType\":\"RANGE\"}
                    ],
                    \"Projection\": {
                        \"ProjectionType\":\"ALL\"
                    },
                    \"ProvisionedThroughput\": {
                        \"ReadCapacityUnits\": 5,
                        \"WriteCapacityUnits\": 5
                    }
                }
            }
        ]"

データの操作

項目の追加

aws dynamodb put-item \
    --table-name Users \
    --item \
        '{"UserId": {"S": "user123"}, "Name": {"S": "John Doe"}, "Email": {"S": "john@example.com"}, "Age": {"N": "30"}}'

項目の取得

aws dynamodb get-item \
    --table-name Users \
    --key '{"UserId": {"S": "user123"}}'

項目の更新

aws dynamodb update-item \
    --table-name Users \
    --key '{"UserId": {"S": "user123"}}' \
    --update-expression "SET Age = :newage, UpdatedAt = :time" \
    --expression-attribute-values '{":newage": {"N": "31"}, ":time": {"S": "2023-01-15T00:00:00Z"}}' \
    --return-values ALL_NEW

項目の削除

aws dynamodb delete-item \
    --table-name Users \
    --key '{"UserId": {"S": "user123"}}'

クエリとスキャン

テーブルのクエリ

aws dynamodb query \
    --table-name UserPosts \
    --key-condition-expression "UserId = :uid" \
    --expression-attribute-values '{":uid": {"S": "user123"}}'

フィルター式を使用したクエリ

aws dynamodb query \
    --table-name UserPosts \
    --key-condition-expression "UserId = :uid" \
    --filter-expression "PostStatus = :status" \
    --expression-attribute-values '{":uid": {"S": "user123"}, ":status": {"S": "published"}}'

インデックスのクエリ

aws dynamodb query \
    --table-name UserPosts \
    --index-name PostTypeIndex \
    --key-condition-expression "PostType = :type AND PostDate > :date" \
    --expression-attribute-values '{":type": {"S": "blog"}, ":date": {"S": "2023-01-01"}}'

テーブルのスキャン

aws dynamodb scan \
    --table-name Users \
    --filter-expression "Age > :age" \
    --expression-attribute-values '{":age": {"N": "30"}}'

バッチ操作

バッチ書き込み

aws dynamodb batch-write-item \
    --request-items '{
        "Users": [
            {
                "PutRequest": {
                    "Item": {
                        "UserId": {"S": "user124"},
                        "Name": {"S": "Jane Smith"},
                        "Email": {"S": "jane@example.com"},
                        "Age": {"N": "28"}
                    }
                }
            },
            {
                "PutRequest": {
                    "Item": {
                        "UserId": {"S": "user125"},
                        "Name": {"S": "Bob Johnson"},
                        "Email": {"S": "bob@example.com"},
                        "Age": {"N": "35"}
                    }
                }
            }
        ]
    }'

バッチ取得

aws dynamodb batch-get-item \
    --request-items '{
        "Users": {
            "Keys": [
                {"UserId": {"S": "user123"}},
                {"UserId": {"S": "user124"}},
                {"UserId": {"S": "user125"}}
            ]
        }
    }'

トランザクション操作

トランザクション書き込み

aws dynamodb transact-write-items \
    --transact-items '[
        {
            "Put": {
                "TableName": "Users",
                "Item": {
                    "UserId": {"S": "user126"},
                    "Name": {"S": "Alice Brown"},
                    "Email": {"S": "alice@example.com"},
                    "Age": {"N": "29"}
                }
            }
        },
        {
            "Update": {
                "TableName": "UserStats",
                "Key": {"StatId": {"S": "total_users"}},
                "UpdateExpression": "SET UserCount = UserCount + :inc",
                "ExpressionAttributeValues": {":inc": {"N": "1"}}
            }
        }
    ]'

トランザクション取得

aws dynamodb transact-get-items \
    --transact-items '[
        {
            "Get": {
                "TableName": "Users",
                "Key": {"UserId": {"S": "user126"}}
            }
        },
        {
            "Get": {
                "TableName": "UserStats",
                "Key": {"StatId": {"S": "total_users"}}
            }
        }
    ]'

Amazon DynamoDBのセキュリティ

DynamoDBは、データを保護するための多層防御アプローチを提供します:

アクセス管理

IAMポリシーの例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:Query"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/Users",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": ["${aws:userid}"]
                }
            }
        }
    ]
}

暗号化

暗号化されたテーブルの作成

aws dynamodb create-table \
    --table-name EncryptedUsers \
    --attribute-definitions \
        AttributeName=UserId,AttributeType=S \
    --key-schema \
        AttributeName=UserId,KeyType=HASH \
    --provisioned-throughput \
        ReadCapacityUnits=5,WriteCapacityUnits=5 \
    --sse-specification \
        Enabled=true,SSEType=KMS,KMSMasterKeyId=alias/aws/dynamodb

Amazon DynamoDBの高度な機能

DynamoDB Streams

DynamoDB Streamsは、DynamoDBテーブルのデータ変更をリアルタイムでキャプチャし、これらの変更を時系列で保存します。これにより、イベント駆動型アーキテクチャの構築、データの同期、監査ログの作成などが可能になります。

DynamoDB Streamsの有効化

aws dynamodb update-table \
    --table-name Users \
    --stream-specification \
        StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES

グローバルテーブル

DynamoDBグローバルテーブルは、複数のAWSリージョンにまたがるマルチリージョンのレプリケーションを提供します。これにより、グローバルに分散したユーザーに低レイテンシーのデータアクセスを提供し、リージョン障害に対する耐性を高めることができます。

グローバルテーブルの作成

# 最初のリージョンでテーブルを作成
aws dynamodb create-table \
    --table-name GlobalUsers \
    --attribute-definitions \
        AttributeName=UserId,AttributeType=S \
    --key-schema \
        AttributeName=UserId,KeyType=HASH \
    --billing-mode PAY_PER_REQUEST \
    --stream-specification \
        StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES

# グローバルテーブルとしてレプリケーションを設定
aws dynamodb create-global-table \
    --global-table-name GlobalUsers \
    --replication-group \
        RegionName=us-east-1 \
        RegionName=us-west-2 \
        RegionName=eu-west-1

Time to Live (TTL)

TTLを使用すると、項目の有効期限を定義し、期限切れになった項目を自動的に削除できます。これは、セッションデータ、ログデータ、一時的なデータなどに役立ちます。

TTLの有効化

aws dynamodb update-time-to-live \
    --table-name Sessions \
    --time-to-live-specification \
        Enabled=true,AttributeName=ExpirationTime

DynamoDB Accelerator (DAX)

DAXは、DynamoDB用のフルマネージドのインメモリキャッシュです。読み取り集約型のワークロードのパフォーマンスを最大10倍に向上させ、マイクロ秒単位のレイテンシーを実現します。

PartiQL

PartiQLは、SQLと互換性のあるクエリ言語で、DynamoDBを含む複数のデータストアに対して一貫したクエリを実行できます。

PartiQLクエリの実行

aws dynamodb execute-statement \
    --statement "SELECT * FROM Users WHERE UserId = 'user123'"

Amazon DynamoDBのパフォーマンス最適化

DynamoDBのパフォーマンスを最適化するためのベストプラクティス:

効率的なパーティションキーの特性

効果的なパーティションキーは以下の特性を持ちます:

例えば、ユーザーIDは通常良いパーティションキーですが、性別や国などの低カーディナリティの属性は避けるべきです。

Amazon DynamoDBのコスト最適化

DynamoDBのコストを最適化するための戦略:

Amazon DynamoDBのユースケース

DynamoDBは以下のようなユースケースに適しています:

Amazon DynamoDBとの統合サービス

DynamoDBは他のAWSサービスと統合して、より強力なソリューションを構築できます:

サービス 統合の利点
AWS Lambda DynamoDB Streamsのイベントに応じてコードを実行、サーバーレスアプリケーションの構築
Amazon S3 大きなオブジェクトの保存、DynamoDBエクスポートの保存先
Amazon EMR DynamoDBデータの大規模な分析処理
AWS Glue DynamoDBデータのETL処理、データカタログ化
Amazon Kinesis DynamoDB Streamsとの統合によるリアルタイムデータ処理
AWS AppSync DynamoDBをバックエンドとするGraphQL APIの構築
Amazon Cognito ユーザー認証と、DynamoDBへのきめ細かなアクセス制御

Lambda関数との統合例

DynamoDB Streamsをトリガーとするラムダ関数の設定

aws lambda create-event-source-mapping \
    --function-name ProcessUserUpdates \
    --event-source-arn arn:aws:dynamodb:us-east-1:123456789012:table/Users/stream/2023-01-15T00:00:00.000 \
    --batch-size 100 \
    --starting-position LATEST

Amazon DynamoDBのベストプラクティス

単一テーブルデザイン

DynamoDBでは、複数のエンティティタイプを単一のテーブルに保存する「単一テーブルデザイン」が一般的です。このアプローチの利点:

このパターンを実装するには、通常、エンティティタイプを示すプレフィックスをパーティションキーやソートキーに含めます。

まとめ

Amazon DynamoDBは、あらゆる規模で一貫した1桁ミリ秒のパフォーマンスを提供するフルマネージドのNoSQLデータベースサービスです。スケーラビリティ、高可用性、セキュリティを備え、様々なユースケースに対応します。

Amazon DynamoDBの主な利点は以下の通りです:

DynamoDBを効果的に活用するには、アクセスパターンに基づいたデータモデリング、適切なパーティションキーの選択、セカンダリインデックスの最適化、キャパシティ管理の最適化が重要です。また、他のAWSサービスと組み合わせることで、より強力で柔軟なクラウドソリューションを構築することができます。