首页 > 解决方案 > Javascript:将所有 S3 项目从一个存储桶复制到另一个存储桶

问题描述

我正在尝试将所有项目(文件和文件夹)从一个复制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.");
    }
});
};

不知何故,这段代码不起作用。我想在这里实现两件事。

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

标签: javascriptnode.jsamazon-web-servicesaws-lambdaaws-sdk

解决方案


如果运行时间超过 5 分钟,aws s3 sync那么在使用 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 控制台中,但实际上它只是键值对的集合。


推荐阅读