使用Node.js备份DynamoDB表数据到S3
首先
由于有一个希望批量将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
导出.js
export.js是一个文件,它按照其名称从DynamoDB备份所有表格。
'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
还原.js
在export.js中,我们将之前从S3导出的数据导入到指定的DynamoDB表中,而restore.js保持不变。
在进行恢复前,需要事先创建并导入表。我们假设创建了一个名为newTest1的表进行下一步操作。需要注意的是,根据数据量的不同,可能会超出免费容量限制,因此请根据数据大小进行按需变更。
在以下代码中,我们将在execRestore函数的第一个参数中指定一个名为test1的子文件夹,该文件夹是在S3上备份的,并将新建的表名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