DynamoDBのデータをAWS CLI で取得する
Posted on
はじめに
DynamoDBに保存されているデータをAWSCLIで取得する基本的な方法について、学習したのでこちらにまとめておきます。
コマンドとしては、 get-item, scan, query の結果について記載しています。
テーブルの準備
和田アキコさんの曲名と、収録アルバムを記録したテーブルを作成して、データを取得します。
DynamoDBの定義としては、Music テーブルを作成して、Artist, SongTitle, AlbumTitle にそれぞれのデータを格納しています。
また今回は、パーティションキーは Artist、 ソートキーは SongTitle としています。
1) テーブルを作成する。
Musicテーブルを作成する。
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
2) テーブルにデータを格納する。(1曲目)
1曲目は、アルバム[アッコがおまかせ ~和田アキ子50周年記念トリビュート・アルバム~]に収録されている[もう一度ふたりで歌いたい]をテーブルに入れる。
aws dynamodb put-item \
--table-name Music \
--item '{ "Artist": {"S": "和田アキ子"}, "SongTitle": {"S": "もう一度ふたりで歌いたい"}, "AlbumTitle": {"S": "アッコがおまかせ ~和田アキ子50周年記念トリビュート・アルバム~"} }' \
--return-consumed-capacity TOTAL
3) テーブルにデータを格納する。(2曲目)
2曲目は、アルバム[WADASOUL]に収録されている[Baby]をテーブルに入れる。
aws dynamodb put-item \
--table-name Music \
--item '{ "Artist": {"S": "和田アキ子"}, "SongTitle": {"S": "Baby"}, "AlbumTitle": {"S": "WADASOUL"} }' \
--return-consumed-capacity TOTAL
データの取得
1) scan
scanでは、特にキーの指定はしなくても取得できた。
aws dynamodb scan \
--table-name Music \
--return-consumed-capacity TOTAL
{
"Items": [
{
"AlbumTitle": {
"S": "WADASOUL"
},
"Artist": {
"S": "和田アキ子"
},
"SongTitle": {
"S": "Baby"
}
},
{
"AlbumTitle": {
"S": "アッコがおまかせ ~和田アキ子50周年記念トリビュート・アルバム~"
},
"Artist": {
"S": "和田アキ子"
},
"SongTitle": {
"S": "もう一度ふたりで歌いたい"
}
}
],
"Count": 2,
"ScannedCount": 2,
"ConsumedCapacity": {
"TableName": "Music",
"CapacityUnits": 0.5
}
}
2) get-item
get-itemでデータを取得するには、パーティションキー(Artist)とソートキー(SongTitle)の両方の指定が必要だった。
aws dynamodb get-item \
--key '{"Artist": {"S": "和田アキ子"},"SongTitle": {"S": "もう一度ふたりで歌いたい"}}' \
--table-name Music
{
"Item": {
"AlbumTitle": {
"S": "アッコがおまかせ ~和田アキ子50周年記念トリビュート・アルバム~"
},
"Artist": {
"S": "和田アキ子"
},
"SongTitle": {
"S": "もう一度ふたりで歌いたい"
}
}
}
3) query
queryでは、パーティションキー(Artist)のみを指定すればでデータが取得できた。
aws dynamodb query \
--table-name Music \
--key-condition-expression "Artist = :artist" \
--expression-attribute-values '{":artist":{"S":"和田アキ子"}}' \
--return-consumed-capacity TOTAL
{
"Items": [
{
"AlbumTitle": {
"S": "WADASOUL"
},
"Artist": {
"S": "和田アキ子"
},
"SongTitle": {
"S": "Baby"
}
},
{
"AlbumTitle": {
"S": "アッコがおまかせ ~和田アキ子50周年記念トリビュート・アルバム~"
},
"Artist": {
"S": "和田アキ子"
},
"SongTitle": {
"S": "もう一度ふたりで歌いたい"
}
}
],
"Count": 2,
"ScannedCount": 2,
"ConsumedCapacity": {
"TableName": "Music",
"CapacityUnits": 0.5
}
}
失敗例
1) get-item
パーティションキー(Artist)だけでデータを取ろうとしても失敗する。
ソートキーを指定しないとダメだった。
aws dynamodb get-item \
--key '{"Artist": {"S": "和田アキ子"}}' \
--table-name Music
An error occurred (ValidationException) when calling the GetItem operation: The provided key element does not match the schema
2) query
ソートキー(SongTitle)だけでデータを取ろうとしても失敗する。
パーティションキーが必要であった。
aws dynamodb query \
--table-name Music \
--key-condition-expression "SongTitle = :songtitle" \
--expression-attribute-values '{":songtitle":{"S":"Baby"}}' \
--return-consumed-capacity TOTAL
An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element: Artist
まとめ
DynamoDBのデータ取得には、どの属性にキーが設定されているかを意識してコマンドを作成する必要があることがわかりました。