いわゆるkey,value型のマネージドデータストアサービス。NoSQLデータベース。 データが3つのAZに分散されており、耐久性が高い。またデータ上限がない。 cacheやsessionの保存などに利用される。
AWSコンパネでポチポチしてテーブルを作れるが今回はcloud shellでコマンドで作る。
- Artistをパーティションキー、SongTitleをソートキーとして設定
- Artist、SongTitleの複合プライマリキーとして設定
プライマリキー。プライマリキーは 1 つの属性 (パーティションキー) または 2 つの属性で構成できます (パーティションキーとソートキー)。属性名、データタイプ、各属性のロール(パーティションキーでは HASH、ソートキーでは RANGE)を指定する必要があります。詳細については、「プライマリキー」を参照してください。
DynamoDB テーブルの基本的なオペレーション - Amazon DynamoDB
$aws dynamodb create-table \ --table-name Music \ --attribute-definitions \ AttributeName=Artist,AttributeType=S \ AttributeName=SongTitle,AttributeType=S \ --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 { "TableDescription": { "AttributeDefinitions": [ { "AttributeName": "Artist", "AttributeType": "S" }, { "AttributeName": "SongTitle", "AttributeType": "S" } ], "TableName": "Music", "KeySchema": [ { "AttributeName": "Artist", "KeyType": "HASH" }, { "AttributeName": "SongTitle", "KeyType": "RANGE" } ], "TableStatus": "CREATING", "CreationDateTime": "2022-12-22T02:30:13.273000+00:00", "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 1, "WriteCapacityUnits": 1 }, "TableSizeBytes": 0, "ItemCount": 0, "TableArn": "arn:aws:dynamodb:ap-northeast-1:568161714426:table/Music", "TableId": "bd293a64-ff57-4f57-975d-883779c383a5" } }
scan(データ一覧)する
テーブルを作成しただけなのでもちろん何も入っていない
$aws dynamodb scan --table-name Music { "Items": [], "Count": 0, "ScannedCount": 0, "ConsumedCapacity": null }
put-item(データ格納)する
$ aws dynamodb put-item --table-name Music --item '{ "Artist": {"S": "SMAP"}, "SongTitle": {"S": "ライオンハート"}, "AlbumTitle": {"S": "10周年アルバム"} }' $ aws dynamodb put-item --table-name Music --item '{ "Artist": {"S": "SMAP"}, "SongTitle": {"S": "オレンジ"}, "AlbumTitle": {"S": "10周年アルバム"} }' $ aws dynamodb put-item --table-name Music --item '{ "Artist": {"S": "GReeeeN"}, "SongTitle": {"S": "オレンジ"}, "AlbumTitle": {"S": "GReeeeNベストアルバム"} }' $aws dynamodb scan --table-name Music { "Items": [ { "AlbumTitle": { "S": "10周年アルバム" }, "Artist": { "S": "SMAP" }, "SongTitle": { "S": "オレンジ" } }, { "AlbumTitle": { "S": "10周年アルバム" }, "Artist": { "S": "SMAP" }, "SongTitle": { "S": "ライオンハート" } }, { "AlbumTitle": { "S": "GReeeeNベストアルバム" }, "Artist": { "S": "GReeeeN" }, "SongTitle": { "S": "オレンジ" } } ], "Count": 3, "ScannedCount": 3, "ConsumedCapacity": null }
この状態で以下のような重複データを入れようとするとエラーメッセージはないが、重複してるのでデータは入らない。
$ aws dynamodb put-item --table-name Music --item '{ "Artist": {"S": "SMAP"}, "SongTitle": {"S": "ライオンハート"}, "AlbumTitle": {"S": "10周年アルバム"} }'
query(データ取得)する
get-itemで取得する方法もある
aws dynamodb query --table-name Music --key-condition-expression 'Artist = :Artist' --expression-attribute-values '{ ":Artist": { "S": "SMAP" }}' { "Items": [ { "AlbumTitle": { "S": "10周年アルバム" }, "Artist": { "S": "SMAP" }, "SongTitle": { "S": "オレンジ" } }, { "AlbumTitle": { "S": "10周年アルバム" }, "Artist": { "S": "SMAP" }, "SongTitle": { "S": "ライオンハート" } } ], "Count": 2, "ScannedCount": 2, "ConsumedCapacity": null }
なお、以下のようにソートキーを条件に取得しようとすると怒られる。
パーティーションキー、またはパーティーションキーとソートキーを条件にすればいけるんじゃないかなと思う。試してないけど。
$ aws dynamodb query --table-name Music --key-condition-expression 'SongTitle = :songtitle' --expression-attribute-values '{ ":songtitle": { "S": "オレンジ" }}'