開発環境で作ったDynamoDBのテーブルと全く同じテーブルを本番環境で作ったり、
既存のテーブルのインデックス定義をちょっと変えて作り直したい、そんなケースがあると思います。
マネージメントコンソールで作ってもよいのですが、インデックス名を間違ったり、インデックスが不足したりすると思わぬトラブルになります。(実際ありました)
きちんと、テーブル定義をjsonファイルで管理しておけばよいのですが、そうでない場合は、既存のテーブルからテーブル定義となるjsonを吐き出して、それを読みこませて作成したいと考えると思います。
ただ、aws dynamodb describe-table で吐き出すjsonには、create-table に不要な項目が多数含まれていて、そのままでは実行できません。
「ああjson手で直すのめんどくさいなー」 と弊社今井の周りでつぶやいていたところ、
つ 「出来た」
と下記のようなスクリプトが送られてきました。仕事早っ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/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 を使って、下記のように作成すればまったく同じ定義のテーブルが作れました。
1 2 |
$ aws dynamodb create-table --cli-input-json file://TABLE_NAME.json |
まとめるとこんな感じです。
最初からテーブル定義をjsonで管理する
上記のような事態にならないように、最初からjsonで管理しておけばよかったな、と思ってます。
具体的には、下記のような手順でしょうか。
1)テーブル定義のスケルトンを作成
1 2 |
$ aws dynamodb create-table --generate-cli-skeleton > TABLE_NAME.json |
2)スケルトンをベースに編集する
不要な定義消したり、インデックス名をきめたりとか。
1 2 |
$ vim TABLE_NAME.json |
3)テーブル作る
1 2 |
$ aws dynamodb create-table --cli-input-json file://TABLE_NAME.json |
describe-table とかできちんと出来ているか確認する。
4)git に登録
問題なければ、git などに入れておく。
1 2 |
$ git add TABLE_NAME.json |
おわりに
もっとこうしたほうがいいよとか、CloudFormation使うとこんな感じでできるとか、追加情報ありましたら教えていただけると嬉しいです。
あと、プロビジョニングツールとかないのでしょうか。(後から追加できるのがGSIくらいだから需要ない?)