DynamoDBを仕事で使っていますが、テストデータのインポートや本番データの移行とかを考えたときに、CSVなどで管理してやりたいな、と思いました。
調べてみると、dyneinというものがあるそうで使ってみた
GitHub – awslabs/dynein: DynamoDB CLI written in Rust.
Install & Settings
Download binaries
ツール自体はRustで書かれている単独のファイル。
それぞれの環境で必要となるバイナリをダウンロードします
GitHub – awslabs/dynein: DynamoDB CLI written in Rust.
Setup AWS CLI
各環境にあったAWS CLI をダウンロード、インストールします
AWS コマンドラインインターフェイス(CLI: AWSサービスを管理する統合ツール)| AWS (amazon.com)
インストール後、CLIを実行するためのIAMユーザの設定を行います。
このあたりはこちらを参照
AWS CLI バージョン 2 を使用するための前提条件 – AWS Command Line Interface (amazon.com)
ここまでaws-cliの設定ができていれば、基本的には動くはず
> dy --version
dynein 0.3.0
問題なく動いていることが確認できた。
lsコマンドを打ってみると
> dy ls --all-regions
DynamoDB tables in region: ap-northeast-1
xxxxx
yyyyy
zzzzz
DynamoDB tables in region: ap-northeast-1
No table in this region.
DynamoDB tables in region: ap-northeast-1
No table in this region.
DynamoDB tables in region: ap-northeast-1
No table in this region.
DynamoDB tables in region: ap-northeast-1
No table in this region.
...
全リージョンのDynamoDBテーブルが出てくる・・・というはずなんだけど、なぜかリージョン名が全部同じ表記になっている。
バグっているのだろうか?
–all-regions オプションを外せば、デフォルト設定しているリージョンのテーブル一覧が取得できる
Export
テーブルデータのExportコマンドは基本的に単純。
データをCSV形式で取得するためにはformatオプションをつければ良い
> dy export -t テーブル名 -f csv -o 出力ファイル名
As neither --keys-only nor --attributes options are given, fetching an item to understand attributes to export...
Found following attributes in the first item in the table:
- id (Number)
- name (String)
- locationY (Number)
- locationX (Number)
Are you OK to export items in CSV with columns(attributes) above? yes
51 items processed (61911.99 items/sec)%
出力されたファイルをみると、カラム名付きで値としては文字列がダブルクォートで括られた形式となっている。(カラム名はダブルクォートなし)
Import
インポートするCSVファイルは、Exportした形式と同じ形に揃える必要があるので注意。
> dy import -t テーブル名 -f csv -i ファイル名.csv
1 items processed (6024096.39 items/sec)%
aws cliが提供している取り込みと異なって、既存データがある場合はアップデートをしてくれる。
なければ新規のレコードを作ってくれるので便利。
データの入れ替えという意味では、CSVにないデータを削除してくれるわけではないので注意が必要。
総入れ替えを実施するのであれば、一度データを削除するかする必要があるがいっそのことテーブルを作り直した方が早いかもしれない
問題点
唯一の問題は、エクセルをCSV出力した際には自動的にダブルクォートで括ってくれたりするわけではないということ。
もちろん、数値だとか文字だとかでの判別もない。
いっそのこと、エクセル上でVBAマクロを使ってCSVファイルを出力するようにしてしまった方が楽かもしれないな、と思い始めている