エンジニア

2015.02.23

既存のDynamoDBテーブルからテーブル定義を作成する

開発環境で作ったDynamoDBのテーブルと全く同じテーブルを本番環境で作ったり、
既存のテーブルのインデックス定義をちょっと変えて作り直したい、そんなケースがあると思います。
マネージメントコンソールで作ってもよいのですが、インデックス名を間違ったり、インデックスが不足したりすると思わぬトラブルになります。(実際ありました)
きちんと、テーブル定義をjsonファイルで管理しておけばよいのですが、そうでない場合は、既存のテーブルからテーブル定義となるjsonを吐き出して、それを読みこませて作成したいと考えると思います。
ただ、aws dynamodb describe-table で吐き出すjsonには、create-table に不要な項目が多数含まれていて、そのままでは実行できません。
「ああjson手で直すのめんどくさいなー」 と弊社今井の周りでつぶやいていたところ、

つ 「出来た」

と下記のようなスクリプトが送られてきました。仕事早っ。

#!/bin/sh
# テーブル名指定
$ table_name=TABLE_NAME
# テーブル定義抽出
$ aws dynamodb describe-table --table-name ${table_name} |
jq '.Table' |
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)' |
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)' |
jq 'del(.ProvisionedThroughput.NumberOfDecreasesToday)' |
jq 'del(.ProvisionedThroughput.LastIncreaseDateTime)' |
jq 'del(.ProvisionedThroughput.LastDecreaseDateTime)' |
jq 'del(.TableSizeBytes)' |
jq 'del(.TableStatus)' |
jq 'del(.ItemCount)' |
jq 'del(.CreationDateTime)' > ${table_name}.json

jq でjsonの要素簡単に消せるんですね。
これで出力された json を使って、下記のように作成すればまったく同じ定義のテーブルが作れました。

$ aws dynamodb create-table --cli-input-json file://TABLE_NAME.json

まとめるとこんな感じです。
既存のテーブルと同じ定義のテーブルを作成する

最初からテーブル定義をjsonで管理する

上記のような事態にならないように、最初からjsonで管理しておけばよかったな、と思ってます。
具体的には、下記のような手順でしょうか。

1)テーブル定義のスケルトンを作成

$ aws dynamodb create-table --generate-cli-skeleton > TABLE_NAME.json

2)スケルトンをベースに編集する

不要な定義消したり、インデックス名をきめたりとか。

$ vim TABLE_NAME.json

3)テーブル作る

$ aws dynamodb create-table --cli-input-json file://TABLE_NAME.json

describe-table とかできちんと出来ているか確認する。

4)git に登録

問題なければ、git などに入れておく。

$ git add TABLE_NAME.json

 おわりに

もっとこうしたほうがいいよとか、CloudFormation使うとこんな感じでできるとか、追加情報ありましたら教えていただけると嬉しいです。
あと、プロビジョニングツールとかないのでしょうか。(後から追加できるのがGSIくらいだから需要ない?)

一覧に戻る