↗️

DynamoDBで既存テーブルへExport/ImportするならDynein

2023/02/04に公開

AWS標準のExport/Import方式の課題

既存のDynamoDBからデータをDumpするには公式のこの機能を使えばよい。

https://aws.amazon.com/jp/blogs/aws/new-export-amazon-dynamodb-table-data-to-data-lake-amazon-s3/

で、問題はimportである。

https://aws.amazon.com/jp/blogs/news/amazon-dynamodb-can-now-import-amazon-s3-data-into-a-new-table-jp/

を一読すると見逃してしまうが、これは「新規テーブルへimportする機能」なので、既存テーブルには導入できない。

具体的には以下のようなシナリオが困る。

  1. 既存のテーブルと同じ設定のCFnテンプレートでテーブルを作成
  2. import機能でデータ投入を行う

この場合は、import機能で作ったテーブルをCloudFormation管理下に入れなおしたりするなどの対応が必要になる(Terraformでも同様の事態が起こると思われる)

AWS Database Migration Serviceを利用すれば、既存テーブルへのimportはできそうに思えるが、若干大仰に感じたので調べたところdyneinが良さそうなことがわかった。

Dynein

DyneinはRustで記述されたAmazon DynamoDB CLIとのこと。

https://github.com/awslabs/dynein

使ってみるとわかるが、とにかく動作が早いので実装の差を感じる。かなり良い。

DyneinでのExport/Import

今回はCloudShellに導入する

curl -O -L https://github.com/awslabs/dynein/releases/latest/download/dynein-linux.tar.gz
tar xzvf dynein-linux.tar.gz
sudo mv dy /usr/local/bin/
rm -f dynein-linux.tar.gz 
dy --help

こういったエラーが出てしまうので

[cloudshell-user@ip-10-2-55-201 ~]$ dy --help
dy: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

OpenSSLの開発パッケージを導入すると動くようになる

sudo yum install -y openssl11 openssl11-devel

Export/Import

後は下のような使い方でExport/Importが実現できる。簡単。

dy export -t <from-table> -o a.csv
dy import -t <to-table> -i a.csv

どちらの操作もCapacity Unitを消費するためy/n確認する実装になっているので、ツールに組み込む時は気を付けましょう。

Discussion