Amazon DynamoDBは、AWSが提供するフルマネージドのNoSQLデータベースサービスです。あらゆる規模で一貫した1桁ミリ秒のパフォーマンスを提供し、インターネット規模のアプリケーションに対応するシームレスなスケーラビリティを備えています。DynamoDBはサーバーレスで、プロビジョニング、パッチ適用、ハードウェアプロビジョニング、セットアップ、構成、レプリケーション、ソフトウェアパッチ適用、クラスタースケーリングなどの管理タスクを自動化します。また、組み込みのセキュリティ、継続的バックアップ、マルチリージョンレプリケーション、インメモリキャッシュなどの機能を提供します。
DynamoDBの基本的な概念は以下の通りです:
概念 | 説明 |
---|---|
テーブル | 項目(行)のコレクション。DynamoDBのデータは全てテーブルに保存される |
項目(Item) | テーブル内の1つのデータエントリ。リレーショナルデータベースの「行」に相当 |
属性 | 項目内の基本的なデータ要素。リレーショナルデータベースの「列」に相当 |
プライマリキー | テーブル内の各項目を一意に識別するキー。パーティションキーのみ、またはパーティションキーとソートキーの組み合わせ |
パーティションキー | 項目のデータをどのパーティションに保存するかを決定するプライマリキーの一部 |
ソートキー | 同じパーティションキーを持つ項目をソートするために使用される、プライマリキーのオプション部分 |
セカンダリインデックス | 代替キーを使用してテーブルのデータにアクセスするための追加のデータ構造 |
読み取り/書き込み容量 | テーブルが処理できる読み取りと書き込みの量を定義するスループット設定 |
DynamoDBはスキーマレスなデータベースですが、各項目には以下のデータ型を持つ属性を含めることができます:
各項目のサイズは最大400KBまでです。
DynamoDBには2つのキャパシティモードがあり、読み取りと書き込みのスループットの課金方法と管理方法が異なります:
キャパシティモード | 説明 | ユースケース |
---|---|---|
プロビジョンドモード | テーブルの読み取りと書き込みのキャパシティユニットを事前に指定。Auto Scalingを使用して自動的に調整可能 | 予測可能なトラフィックパターン、コスト管理が重要なアプリケーション |
オンデマンドモード | 使用した分だけ支払う従量課金制。キャパシティの計画が不要 | 予測不可能なトラフィックパターン、変動の激しいワークロード、新しいアプリケーション |
DynamoDBは、AWS Management Console、AWS CLI、AWS SDKs、またはNoSQLワークベンチを使用して利用できます。
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"}}
}
}
]'
DynamoDBは、データを保護するための多層防御アプローチを提供します:
{
"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
DynamoDB Streamsは、DynamoDBテーブルのデータ変更をリアルタイムでキャプチャし、これらの変更を時系列で保存します。これにより、イベント駆動型アーキテクチャの構築、データの同期、監査ログの作成などが可能になります。
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
TTLを使用すると、項目の有効期限を定義し、期限切れになった項目を自動的に削除できます。これは、セッションデータ、ログデータ、一時的なデータなどに役立ちます。
aws dynamodb update-time-to-live \
--table-name Sessions \
--time-to-live-specification \
Enabled=true,AttributeName=ExpirationTime
DAXは、DynamoDB用のフルマネージドのインメモリキャッシュです。読み取り集約型のワークロードのパフォーマンスを最大10倍に向上させ、マイクロ秒単位のレイテンシーを実現します。
PartiQLは、SQLと互換性のあるクエリ言語で、DynamoDBを含む複数のデータストアに対して一貫したクエリを実行できます。
aws dynamodb execute-statement \
--statement "SELECT * FROM Users WHERE UserId = 'user123'"
DynamoDBのパフォーマンスを最適化するためのベストプラクティス:
効果的なパーティションキーは以下の特性を持ちます:
例えば、ユーザーIDは通常良いパーティションキーですが、性別や国などの低カーディナリティの属性は避けるべきです。
DynamoDBのコストを最適化するための戦略:
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へのきめ細かなアクセス制御 |
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
DynamoDBでは、複数のエンティティタイプを単一のテーブルに保存する「単一テーブルデザイン」が一般的です。このアプローチの利点:
このパターンを実装するには、通常、エンティティタイプを示すプレフィックスをパーティションキーやソートキーに含めます。
Amazon DynamoDBは、あらゆる規模で一貫した1桁ミリ秒のパフォーマンスを提供するフルマネージドのNoSQLデータベースサービスです。スケーラビリティ、高可用性、セキュリティを備え、様々なユースケースに対応します。
Amazon DynamoDBの主な利点は以下の通りです:
DynamoDBを効果的に活用するには、アクセスパターンに基づいたデータモデリング、適切なパーティションキーの選択、セカンダリインデックスの最適化、キャパシティ管理の最適化が重要です。また、他のAWSサービスと組み合わせることで、より強力で柔軟なクラウドソリューションを構築することができます。