日別アーカイブ: 2024年8月28日

DynamoDBのデータを楽にExport/Importする

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ファイルを出力するようにしてしまった方が楽かもしれないな、と思い始めている