はじめに
DynamoDBに大量にあるテーブルのデータを一括でS3にバックアップしたい。。みたいな状況があったので、メモとして書いておきます。
ちなみにテーブルが少量であれば、Data Pipelineを使って簡単に出来ます!!aws-sdk
ではData Pipelineの細かいオプションは設定出来なかったようなので、nodejsでData Pipelineを操作することはしていません。
環境
- Nodejs v11.1.0
- DynamoDB
事前準備
バックアップを行うためにS3に専用のバケットを作成しておいてください。
この記事ではbackups
というバケットを作成したという例で進めます。
プロジェクトを作成
適当ですが、dynamodb-backuper
みたいなディレクトリを作成して進めていきます。
$ mkdir dynamodb-backuper
$ cd dynamodb-backuper
$ npm init
$ npm install aws-sdk dynamodb-backup-restore --save$ touch export.js restore.js
export.js
export.js
はその名通りDynamoDBから全テーブルのbackupを行うファイルです。
'use strict'constAWS=require('aws-sdk')constDynamoDB=newAWS.DynamoDB({region:'ap-northeast-1'})asyncfunctionmain(){lettables=awaitgetAllTableLists()tables.forEach((v)=>{exportToS3(v)})}// 実行main()// Get all table names from DynamoDBasyncfunctiongetAllTableLists(){letparams={}lettables=[]while(true){letresponse=awaitDynamoDB.listTables(params).promise()tables=tables.concat(response.TableNames)if(!response.LastEvaluatedTableName){break}else{params.ExclusiveStartTableName=response.LastEvaluatedTableName}}returntables}// Function to perform backupfunctionexportToS3(tableName){constBackup=require('dynamodb-backup-restore').Backupletconfig={S3Bucket:'backups',// 必須 - バケット名 S3Prefix:tableName,// 任意 - 保存するS3のサブフォルダ名S3Encryption:'AES256',// 任意 - 暗号化S3Region:'ap-northeast-1',// 必須 - リージョンDbTable:tableName// 必須 - エクスポートするテーブル名}letbackup=newBackup(config)backup.full()}
以下でエクスポートを実行出来ます。
$ node export.js
restore.js
restore.js
もそのままですが、export.jsでS3にエクスポートしたデータを今度はDynamoDBの指定のテーブルにインポートします。
リストアを行う前に事前にインポートするテーブルを作成しておく必要があります。
今回はnewTest1
というテーブルを作ったとして進めます。
この時に注意が必要なのが、データ量によっては無料枠ではキャパシティーレベルが超えてしまうため、データサイズに応じてオンデマンドに変更してください。
以下のコードでは、execRestore
関数の第一引数にS3にバックアップをとったtest1
というサブフォルダを指定し、インポート用に作成したnewTest1
というテーブル名を第二引数に設定します。
'use strict'functionexecRestore(bucketName,tableName){constRestore=require('dynamodb-backup-restore').Restoreletconfig={S3Bucket:'backups',// 必須S3Prefix:bucketName,// 任意S3Region:'ap-northeast-1',// 必須DbTable:tableName,// 必須DbRegion:'ap-northeast-1',// 必須}Restore(config)}// 実行execRestore('test1','newTest1')
以下でリストアを実行出来ます。
$ node restore.js