はじめに
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'
const AWS = require('aws-sdk')
const DynamoDB = new AWS.DynamoDB({region: 'ap-northeast-1'})
async function main(){
let tables = await getAllTableLists()
tables.forEach((v) => {
exportToS3(v)
})
}
// 実行
main()
// Get all table names from DynamoDB
async function getAllTableLists() {
let params = {}
let tables = []
while(true) {
let response = await DynamoDB.listTables(params).promise()
tables = tables.concat(response.TableNames)
if (!response.LastEvaluatedTableName) {
break
} else {
params.ExclusiveStartTableName = response.LastEvaluatedTableName
}
}
return tables
}
// Function to perform backup
function exportToS3(tableName){
const Backup = require('dynamodb-backup-restore').Backup
let config = {
S3Bucket: 'backups', // 必須 - バケット名
S3Prefix: tableName, // 任意 - 保存するS3のサブフォルダ名
S3Encryption: 'AES256', // 任意 - 暗号化
S3Region: 'ap-northeast-1', // 必須 - リージョン
DbTable: tableName // 必須 - エクスポートするテーブル名
}
let backup = new Backup(config)
backup.full()
}
以下でエクスポートを実行出来ます。
$ node export.js
restore.js
restore.js
もそのままですが、export.jsでS3にエクスポートしたデータを今度はDynamoDBの指定のテーブルにインポートします。
リストアを行う前に事前にインポートするテーブルを作成しておく必要があります。
今回はnewTest1
というテーブルを作ったとして進めます。
この時に注意が必要なのが、データ量によっては無料枠ではキャパシティーレベルが超えてしまうため、データサイズに応じてオンデマンドに変更してください。
以下のコードでは、execRestore
関数の第一引数にS3にバックアップをとったtest1
というサブフォルダを指定し、インポート用に作成したnewTest1
というテーブル名を第二引数に設定します。
'use strict'
function execRestore(bucketName, tableName){
const Restore = require('dynamodb-backup-restore').Restore
let config = {
S3Bucket: 'backups', // 必須
S3Prefix: bucketName, // 任意
S3Region: 'ap-northeast-1', // 必須
DbTable: tableName, // 必須
DbRegion: 'ap-northeast-1', // 必須
}
Restore(config)
}
// 実行
execRestore('test1', 'newTest1')
以下でリストアを実行出来ます。
$ node restore.js