仕事でDynamoDBの既存テーブルを複製する必要があり、一つずつ手作業で作成するのは大変だし、設定が漏れてしまう可能性もあるため、2コマンドで複製できるようにしてみました。
テーブル情報作成用シェルスクリプト
第一引数に指定したテーブルの情報をコピーしてXXXX_copy
というテーブル名で出力するシェルスクリプトを作成します
create-table-description.sh
#!/bin/sh
# テーブル名
TABLE_NAME=$1
TABLE_NAME_COPY=$1_copy
# 指定テーブルの定義を取得
DESCRIPTION=`aws dynamodb describe-table --table-name $TABLE_NAME`
# 必要な項目以外は削除
CONTENTS=`echo $DESCRIPTION |
jq '.Table' |
jq 'del(.ProvisionedThroughput.NumberOfDecreasesToday)' |
jq 'del(.ProvisionedThroughput.LastIncreaseDateTime)' |
jq 'del(.ProvisionedThroughput.LastDecreaseDateTime)' |
jq 'del(.TableSizeBytes)' |
jq 'del(.TableStatus)' |
jq 'del(.ItemCount)' |
jq 'del(.CreationDateTime)' |
jq 'del(.TableArn)' |
jq 'del(.TableId)' |
jq 'del(.LatestStreamLabel)' |
jq 'del(.LatestStreamArn)' |
# テーブル名を変換して出力
jq --arg table "$TABLE_NAME_COPY" '.TableName = $table'
`
# グローバルセカンダリインデックスがある場合
if test `echo $CONTENTS | jq 'has("GlobalSecondaryIndexes")'` = true; then
echo has GlobalSecondaryIndexes
CONTENTS=`echo $CONTENTS |
jq 'del(.GlobalSecondaryIndexes[].IndexArn)' |
jq 'del(.GlobalSecondaryIndexes[].ItemCount)' |
jq 'del(.GlobalSecondaryIndexes[].IndexStatus)' |
jq 'del(.GlobalSecondaryIndexes[].IndexSizeBytes)' |
jq 'del(.GlobalSecondaryIndexes[].ProvisionedThroughput.NumberOfDecreasesToday)' |
jq 'del(.GlobalSecondaryIndexes[].ProvisionedThroughput.LastIncreaseDateTime)' |
jq 'del(.GlobalSecondaryIndexes[].ProvisionedThroughput.LastDecreaseDateTime)'
`
fi
# ローカルセカンダリインデックスがある場合
if test `echo $CONTENTS | jq 'has("LocalSecondaryIndexes")'` = true; then
echo has LocalSecondaryIndexes
CONTENTS=`echo $CONTENTS |
jq 'del(.LocalSecondaryIndexes[].IndexArn)' |
jq 'del(.LocalSecondaryIndexes[].IndexStatus)' |
jq 'del(.LocalSecondaryIndexes[].ItemCount)' |
jq 'del(.LocalSecondaryIndexes[].IndexSizeBytes)' |
jq 'del(.LocalSecondaryIndexes[].ProvisionedThroughput.NumberOfDecreasesToday)' |
jq 'del(.LocalSecondaryIndexes[].ProvisionedThroughput.LastIncreaseDateTime)' |
jq 'del(.LocalSecondaryIndexes[].ProvisionedThroughput.LastDecreaseDateTime)'
`
fi
# jsonファイル出力
echo $CONTENTS > $TABLE_NAME_COPY.json
DynamoDBにテーブルを作成
前提
- aws-cliインストール済み
-
aws configure
でDynamoDBの読み書き可能なアカウントの認証情報を設定していること
-
- jqインストール済み
実行
# テーブル情報作成
./create-table-description.sh Test
# コピーテーブルを作成
aws dynamodb create-table --cli-input-json file://Test_copy.json
補足
データのコピーについてはDataPipelineでExport/Importする必要があるようです
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBPipeline.html
参考
https://www.hands-lab.com/tech/t188/
https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html