Javascript:将所有S3项目从一个存储桶复制到另一个存储桶

时间:2018-07-31 17:42:27

标签: javascript node.js amazon-web-services aws-lambda aws-sdk

我正在尝试将所有项目(文件和文件夹)从一个s3 bucket复制到另一个。我正在AWS Lambda上运行此命令,因此,同步对我来说不是一个好选择,因为执行同步命令可能需要5分钟以上的时间。这是我的JS代码:

var AWS = require("aws-sdk");

exports.handler = (event, context, callback) => {
    var s3 = new AWS.S3();
    var sourceBucket = "source-bucket";
    var destinationBucket = "destination-bucket";
    var objectKey = "/";
    var copySource = encodeURI(sourceBucket + objectKey);
    var copyParams = { Bucket: destinationBucket, CopySource: copySource, Key: objectKey
};

s3.copyObject(copyParams, function(err, data) {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log("S3 object copy successful.");
    }
});
};

不知何故,此代码无法正常工作。我想在这里实现两件事。

  • 将所有数据从一个存储桶复制到另一个存储桶
  • 执行复制操作后,我将每天定期运行此代码,将一个新文件夹创建到“目标存储桶”,然后每天将所有数据复制到新创建的文件夹中。

如果有人可以帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果运行aws s3 sync的时间超过5分钟,则在使用Node.js的Lambda中仍然可能失败。使用适用于AWS的Node.js API没有万灵丹。如果您确实需要运行5分钟以上,则可以使用一些策略来检测您的功能是否即将用完。在此处查看“ context.getRemainingTimeInMillis”:https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html

但是要回答您的问题,您需要首先使用s3.listObjectsV2https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjectsV2-property)列出存储桶中的所有对象。

一旦有了对象数组,就需要遍历并使用s3.copyObjecthttps://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property)复制每个对象

您的代码现在正尝试使用键/从源存储桶中获取单个对象,该键不存在。 S3存储桶不是真正的目录。它们具有类似目录的行为,尤其是在在线Web控制台中,但实际上它只是键值对的集合。