首页 > 解决方案 > 导出 Mongo 集合的 AWS Lambda 函数

问题描述

我想编写一个 AWS Lambda 函数:

  1. 从我的 MongoDB 数据库中导出某些集合(我使用的是 Mongo Atlas)
  2. 从 json 文件中删除$oidand 。$date

对于数字 2,我编写了一个 Python 函数来执行此操作。对于数字 1,我写道:

'use strict';

const AWS = require('aws-sdk');
const fs = require('fs');
const url = require('url');
const dayjs = require('dayjs');
const ZipFolder = require('zip-a-folder');
const exec = require('child_process').exec;

// ENVIRONMENT VARIABLES
// Mongo
const dbName = process.env.MONGO_DB_NAME;
const username = process.env.MONGO_USER;
const password = process.env.MONGO_PW;
const authDB = process.env.MONGO_AUTH_DB || 'admin';
//const port = process.env.MONGO_PORT || '27017';
const replicaSet = process.env.MONGO_REPLICA_SET;
const clusterShard = process.env.MONGO_CLUSTER_SHARD;
// S3
const bucketName = process.env.S3_BUCKET;
const storageClass = process.env.S3_STORAGE_CLASS || "STANDARD";
const s3bucket = new AWS.S3({ params: { Bucket: bucketName, StorageClass: storageClass } });

const dateFormat = process.env.DATE_FORMAT || 'YYYYMMDD_HHmmss';

module.exports.handler = function(event, context, cb) {

  console.log(`Backup of database '${dbName}' to S3 bucket '${bucketName}' is starting`);
  process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'];
  let fileName = dbName + '_' + dayjs().format(dateFormat);
  let folderName = `/tmp/${fileName}/`;
  let filePath = `/tmp/${fileName}.zip`;

  exec(`mongodump -d ${dbName} -u ${username} -p ${password} -o ${folderName} --authenticationDatabase ${authDB} --ssl --host "${replicaSet}/${clusterShard}"`, (error, stdout, stderr) => {

      if (error) {
        console.log('Mongodump failed: ' + error);
        process.exit(1)
      }

      ZipFolder.zipFolder(folderName, filePath, function(err) {
        if (err) {
          console.log('ZIP failed: ', err);
          process.exit(1)
        } else {
          fs.readFile(filePath, function(err, data) {
            s3bucket.upload({ Key: fileName + '.zip', Body: data, ContentType: 'application/zip' }, function(err, data) {
              fs.unlink(filePath, function(err) {
                if (err) {
                  console.log('Could not delete temp file: ' + err);
                  process.exit(1)
                }
              });
              if (err) {
                console.log('Upload to S3 failed: ' + err);
                process.exit(1)
              } else {
                console.log('Backup completed successfully');
              }
            });
          });
        }
      });

    });

};

但它在里面mongodump,我需要使用mongoexport它(因为我稍后将需要它用于 BigQuery),并且我还需要添加我上面提到的 Python 函数。我怎么能这样做?

标签: mongodbamazon-s3aws-lambda

解决方案


推荐阅读