DynamoDBからバックアップしたCSVをインポートするCLIを作った
はじめに
AWS DynamoDBには、マネジメントコンソール上でデータをCSV形式で保存する機能があります。
バックアップする際に便利だな、と思っていたのですが、このCSVを再度データベースに投入する際に一工夫必要でした。
詳細はAmazon Web Services ブログ Amazon DynamoDB への CSV 一括取り込みの実装に詳しく書いてあるのですが、
- AWS Data Pipelineの構築
- S3イベントトリガーによる取り込みLambda関数の実行
といった手法が提案されています。
定期的に行うものであればこれらシステムを構築する価値があると思うのですが、アドホックな作業の際は不便ですね。
せっかくエクスポートできるなら取り込みも簡単にできるようになってほしいですが...
というわけでCSVをDynamoDBに流し込むツールをGoで作りました。
csv2dynamo
インストール
Goがインストールされている環境であれば、下記コマンドでインストール可能です。
go get github.com/maito1201/csv2dynamo/cmd/csv2dynamo
使い方
ファイル名とターゲットとなるテーブル名を指定してください。
CSVの内容を基にaws cliのコマンドを生成します。
csv2dynamo --table-name sample-table --file ./testdata/sample.csv
read and compile csv
progress: 2/2
complete!
aws dynamodb put-item --table-name sample-table --item {"s_value":{"S":"sample1"},"n_value":{"N":"1"},"bool_value":{"B":true}}
aws dynamodb put-item --table-name sample-table --item {"s_value":{"S":"sample2"},"n_value":{"N":"2"},"bool_value":{"B":false}}
--execute
オプションを使うと、生成したコマンドがそのまま実行されます。
csv2dynamo --execute --table-name sample-table --file ./testdata/sample.csv
--output
オプションでコマンドをファイルに保存することが可能です。
csv2dynamo --output ./out.txt --table-name sample-table --file ./testdata/sample.csv
aws cliのオプションである--endpoint
, --profile
を指定することも可能です。
csv2dynamo --endpoint http://localhost:4566 --profile local --table-name sample-table --file ./testdata/sample.csv
雑記
goでCLIツールを作る際にはgithub.com/urfave/cliを使うと良い、という知見を同僚のツールから教わりました、コマンドライン引数の処理をこれに任せることで、ツールで実現したいことそのものに集中できるようになるのでとても良いです。
仕組みとしては公式からエクスポートしたCSVを愚直に読み込んで頑張ってコマンドの文字列に落とし込んでいます。
単純なデータの場合問題ないと思うのですが、業務で使っているテーブルはデータが多重配列になっていたり、同じカラムに微妙にデータ形式の異なるデータが入っていたりと、ケースによっては正常に動くコマンドを吐き出すことがとても難しいパターンがありました。
その場合はテキストとして吐き出してから手作業で微調整をせざるを得ないかなというのが現状です。
会社の先輩がdynamoDBの中身をCSVに吐き出すdynamo2csv
を作っていたので、合体して取り込みとエクスポート両方に対応したcsv4dynamo
を作れそうです。
ひとまず合体させましたが、エクスポートするCSVのフォーマットを公式と細部まで統一する必要があるため、実用段階まで進むにはもう少し時間がかかる見込みです。
Discussion
これは便利すぎる。
使わせていただきました。
とても嬉しいです、コメントありがとうございます