ITと創作でねこを飼いたい

プログラミングやITで勉強したこと、疑問をまとめます。

DynamoDBからエクスポートしたCSVファイルをインポートしたい

既存で用意されているDynamoDBのテーブルと、同じ定義のテーブルを作る機会があった。で、開発時に使っていたテストデータを新しいテーブルに移したいなぁ、と思ったのが事の発端。

既存のtableのデータのエクスポート

エクスポートは簡単。
1、AWSコンソールのサービスDynamoDBを開く。
2、左メニューから「テーブル」を選択し、項目タブを開く。
3、エクスポートしたいデータを選択する。
4、AWSコンソールの「アクション」から「CSVへエクスポート」を選択。

テーブル名でCSVファイルがダウンロードされる。

インポートの正攻法

コンソール画面を見てもらったら分かると思うが、
残念なことにアクションの中に「CSVファイルのインポート」はない。

あっても良くない? と思わなくもないが「CSVファイルのインポート」の機能はNoSQLの思想に反するのかも、、しれない。

で、データを一気に入れたいときどうするんだよって話だが、
正攻法は以下っぽい。

dev.classmethod.jp

データを整形してS3にupするとか、なんかめんどうそう・・・

面倒そうなので非正攻法の手段を作ってみた

AWS CLIaws dynamodb put-item ~コマンドを使えば、DynamoDBにデータを入れることができる。
コマンドってのはこんな感じのやつ

aws dynamodb put-item --table-name 「テーブル名」 --item '{ "項目名": { "定義 (NとかSとか)": "値" }, "項目名": { "定義 (NとかSとか)": "値" }, ~~  "項目名": { "定義 (NとかSとか)": "値" } }'

上記コマンドの仕組みを利用して
DynamoDBのコンソール画面からエクスポートしたCSVファイルからAWS CLIのコマンドをshellファイルとして作成するプログラム
を作ってみました。

github.com

前提条件
AWS CLIの設定が完了している。
Python 3系が入っていてPandasが利用できる(動作確認は3.7.2でやっている)

使い方
1、ソースをクローンしてきて、同じフォルダ内にエクスポートしてきたCSVファイルを入れる。
(数行のソースなので、コピーして使ってもらっても大丈夫だと思う)
2、コマンドを叩く。

python create_insert_command.py [元のテーブル名] [新しいテーブル名]

元のテーブル名とは、正確にいうとエクスポートしたcsvファイルの[ここの部分].csv(test.csvならtest)

シェルファイルは、「新しいテーブル名」_import_「日付情報」.shの名称で同じフォルダ内に作成される。

第二引数は省略可能。省略した場合は、エクスポートを実施したテーブルと同じ名前でコマンドが生成される。つまり、シェルを実行すると、エクスポート先と同じテーブルにデータが書き込まれる。
(引数がない場合はリポジトリ内のimporttest.csvをコマンドに変換する)
3、シェルファイルを実行すれば、エクスポートしたデータがDynamoDBにimportされるという寸法

注意点
・Pandasを使用したので、データが多い場合はコマンド生成に時間がかかる可能性がある。
・大量の書き込みだと、結構お金がかかるかも?
・値にダブルクォーテーションなんかがあると、コマンドでエラーがでる可能性が高い。(今のところはテキストエディタでうまく置換してもらうしか回避方法なし)

あまり、大量のデータの場合は向かないかもしれませんが、
ちょっとしたデータだったら使えるんじゃないかと思いますー。