LoginSignup
0
0

More than 1 year has passed since last update.

DynamoDBに作成済みのテーブルを複製したい!(手作業ではやりたくない)

Posted at

仕事で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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0