javascript - 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.");
}
});
};
不知何故,这段代码不起作用。我想在这里实现两件事。
- 将所有数据从一个存储桶复制到另一个存储桶
- 一旦我实现了复制操作,我将每天定期运行这段代码,创建一个新文件夹到“目标存储桶”,并每天复制新创建的文件夹中的所有数据。
如果有人可以帮助我,我将不胜感激。
解决方案
如果运行时间超过 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.listObjectsV2
(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjectsV2-property)列出存储桶中的所有对象。
一旦你有一个对象数组,你需要遍历并复制它们中的每一个s3.copyObject
(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property)
您的代码现在正尝试使用/
不存在的键从源存储桶中获取单个对象。S3 存储桶并不是真正的目录。它们有一些类似目录的行为,尤其是在在线 Web 控制台中,但实际上它只是键值对的集合。
推荐阅读
- python - 如何使用 docker-py 向 docker 容器添加参数
- html - 即使有显示也难以隐藏导航子菜单:无;
- go - 同时使用 Go 模块和供应商部署 Google Cloud Function
- php - Laravel 5.8 检索关注者信息
- apache-kafka - 如何在 Kafka Consumer Group 中将偏移量重置为任意值?
- sql - 将 TIMESTAMP 列从 NULL 更改为 NOT NULL
- asp.net-mvc-4 - 如何修复网格视图
- html - IE 11 中 flex unset 和 flex none 之间的区别
- c++ - 在非空 std::list 上使用 std::list.back() 时出现“分段错误”
- sql - 如何加入三个不同的表