使用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
广告
将在 10 秒后关闭
bannerAds