あめがえるのITブログ

頑張りすぎない。ほどほどに頑張るブログ。

【AWS】DynamoDBで作成済みのテーブルにソートキーを追加してみた


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年もいいことないねぇー(´Д`)