DynamoDBのお手軽バックアップ

アプリの状態だけ保持しているようなあまり大きくないDynamoDBのテーブルを
バックアップするのにDataPipeline使うのもどうかと思うのでツール作ろうかと考えていたら
既にあった。

github.com

使ってみたら結構便利だったので使い方をまとめます。

AmazonLinuxへインストール

このツールAWSpython向けSDKであるbotoを利用しますが、
AmazonLinuxにはpython + botoが初めから入っています。
dynamodumpをgitからチェックアウトするだけで使う準備は完了です。

$ yum -y install git
$ git clone https://github.com/bchew/dynamodump.git
$ cd dynamodump

バックアップ

バックアップ対象のDynamoDBテーブルへの読み込み権限があれば、
以下の3つのオプションのみでバックアップが取得できます。

パラメータ名
-m (Mode) backup
-r (Region) ap-northeast-1
-s (SrcTable) 対象のテーブル名
$ python dynamodump.py -m backup -r ap-northeast-1 -s my-table
INFO:root:Starting backup for my-table..
INFO:root:Dumping table schema for my-table
INFO:root:Dumping table items for my-table
INFO:root:Backup for my-table table completed. Time taken: 0:00:00

$ tree
.
|-- LICENSE
|-- README.md
|-- dump
|   `-- my-table
|       |-- data
|       |   `-- 0001.json
|       `-- schema.json
|-- dynamodump.py
`-- requirements.txt

リストア

リストアはバックアップ時と同じパラメータでも実行可能です。
しかしそのまま実行すると前処理でテーブルを削除してしまうので、
データだけを戻したい場合は--dataOnlyオプションを指定します。

パラメータ名
-m (Mode) restore
-r (Region) ap-northeast-1
-s (SrcTable) 対象のテーブル名
--dataOnly スキーマの作成/削除を行わない
$ python dynamodump.py -m restore -r ap-northeast-1 -s my-table
INFO:root:my-table table is being deleted..
INFO:root:my-table table deleted!
INFO:root:Starting restore for my-table to my-table..
INFO:root:Creating my-table table with temp write capacity of 25
INFO:root:Waiting for my-table table to be created.. [CREATING]
INFO:root:my-table created.
INFO:root:Restoring data for my-table table..
INFO:root:Processing 0001.json of my-table
INFO:root:Updating my-table table read capacity to: 1, write capacity to: 1
INFO:root:Restore for my-table to my-table table completed. Time taken: 0:00:21
$ python dynamodump.py -m restore -r ap-northeast-1 -s my-table --dataOnly
INFO:root:Starting restore for my-table to my-table..
INFO:root:Restoring data for my-table table..
INFO:root:Processing 0001.json of my-table
INFO:root:Restore for my-table to my-table table completed. Time taken: 0:00:01

S3へ定期バックアップするように設定する

cronでも良いと思いますが今回はJenkinsを使用してジョブを定義しました。
Git:RepositoryURLhttps://github.com/bchew/dynamodump.gitを指定して、
シェルの実行で以下のように定義するのがオススメです。
対象のバケット名やテーブルはお好みで変更してください。

BUCKET_NAME=yustam-dynamo-backup
ARCHIVE_NAME=dump_`date +%Y%m%d%H%M`.tgz

python dynamodump.py -m backup -r ap-northeast-1 -s my-table

tar czf $ARCHIVE_NAME ./dump
rm -rf ./dump

aws s3 cp $ARCHIVE_NAME s3://$BUCKET_NAME/dynamo/$ARCHIVE_NAME
rm -f $ARCHIVE_NAME

exit 0;

ビルドトリガ定期的に実行にして好きな時間に動かしたらいいと思います。