
DynamoDBで作成済みのテーブルにソートキーを追加してみた
やること
テーブル作成後にソートキーの追加はできないので、テーブルをコピーしてその際にソートキーを追加する。
実践
1.パーティションキーのみのテーブル作成
1-1.CloudShellで下記を実行
$ aws dynamodb create-table \ --table-name Orders \ --attribute-definitions \ AttributeName=CustomerId,AttributeType=S \ --key-schema \ AttributeName=CustomerId,KeyType=HASH \ --billing-mode PAY_PER_REQUEST
2.サンプルデータ追加
2-1.CloudShellで下記を実行
$ aws dynamodb put-item \ --table-name Orders \ --item '{"CustomerId": {"S": "001"}, "OrderDate": {"S": "2023-12-01"}, "Amount": {"N": "150"}, "Category": {"S": "Electronics"}}'
3.テーブルをバックアップ
3-1.CloudShellで下記を実行
aws dynamodb scan \ --table-name Orders \ --output json > backup.json
4.ソートキーを追加した新しいテーブルを作成
4-1.CloudShellで下記を実行
$ aws dynamodb create-table \ --table-name NewOrders \ --attribute-definitions \ AttributeName=CustomerId,AttributeType=S \ AttributeName=OrderDate,AttributeType=S \ --key-schema \ AttributeName=CustomerId,KeyType=HASH \ AttributeName=OrderDate,KeyType=RANGE \ --billing-mode PAY_PER_REQUEST
5.データ移行スクリプト作成
5-1.CloudShellで下記を実行
$ vi migrate.sh
#!/bin/bash # 新しいテーブル名 NEW_TABLE_NAME="NewOrders" # バックアップデータを1件ずつ処理 cat backup.json | jq -c '.Items[]' | while read item; do # データを新しいテーブルに追加 aws dynamodb put-item \ --table-name "$NEW_TABLE_NAME" \ --item "$item" done
6.データ移行スクリプト実行
6-1.CloudShellで下記を実行
$ bash migrate.sh
7.データ移行確認
7-1.CloudShellで下記を実行。新しいテーブルに対しパーティションキーのみで検索。
$ aws dynamodb query \ --table-name NewOrders \ --key-condition-expression "CustomerId = :customer_id" \ --expression-attribute-values '{":customer_id": {"S": "001"}}' \ --no-cli-pager
{ "Items": [ { "Amount": { "N": "150" }, "CustomerId": { "S": "001" }, "Category": { "S": "Electronics" }, "OrderDate": { "S": "2023-12-01" } } ], "Count": 1, "ScannedCount": 1, "ConsumedCapacity": null }
7-2.CloudShellで下記を実行。新しいテーブルに対しパーティションキーとソートキーで検索。
$ aws dynamodb query \ --table-name NewOrders \ --key-condition-expression "CustomerId = :customer_id AND OrderDate >= :start_date" \ --expression-attribute-values '{ ":customer_id": {"S": "001"}, ":start_date": {"S": "2023-12-01"} }'\ --no-cli-pager
{ "Items": [ { "Amount": { "N": "150" }, "CustomerId": { "S": "001" }, "Category": { "S": "Electronics" }, "OrderDate": { "S": "2023-12-01" } } ], "Count": 1, "ScannedCount": 1, "ConsumedCapacity": null }
8.古いテーブルを削除
8-1.CloudShellで下記を実行。
$ aws dynamodb delete-table --table-name Orders
9.後片付け。新しいテーブルを削除
9-1.CloudShellで下記を実行。
$ aws dynamodb delete-table --table-name NewOrders
感想
2025年もいいことないねぇー(´Д`)