🛠️

DynamoDBからバックアップしたCSVをインポートするCLIを作った

2021/03/30に公開2

はじめに

AWS DynamoDBには、マネジメントコンソール上でデータをCSV形式で保存する機能があります。

バックアップする際に便利だな、と思っていたのですが、このCSVを再度データベースに投入する際に一工夫必要でした。
詳細はAmazon Web Services ブログ Amazon DynamoDB への CSV 一括取り込みの実装に詳しく書いてあるのですが、

  • AWS Data Pipelineの構築
  • S3イベントトリガーによる取り込みLambda関数の実行

といった手法が提案されています。

定期的に行うものであればこれらシステムを構築する価値があると思うのですが、アドホックな作業の際は不便ですね。
せっかくエクスポートできるなら取り込みも簡単にできるようになってほしいですが...

というわけでCSVをDynamoDBに流し込むツールをGoで作りました。

https://github.com/maito1201/csv2dynamo

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のフォーマットを公式と細部まで統一する必要があるため、実用段階まで進むにはもう少し時間がかかる見込みです。

https://github.com/maito1201/csv4dynamo

Discussion

m氏m氏

これは便利すぎる。
使わせていただきました。

itoito

とても嬉しいです、コメントありがとうございます