尝试使用 node.js 和 exec + aws cli 将所有文件从一个 S3 存储桶移动到另一个存储桶
Trying to move all files from one S3 bucket to another using node.js and exec + aws cli
我不是一个强大的编码员,但尝试使用 node.js 创建一个 Lambda 函数,其中 运行s 通过 Lambda cron 每天一次将 S3 存储桶中的文件移动到 "archive" 存储桶。
尝试了各种方法
sudo nodejs -e "console.log(require('./index').handler({}));"
我在本地机器上的输出是:
Running MyApp
Source mybucket
Target mybucket-archive
Account test
undefined
这是我的代码:
var aws = require('./node_modules/aws-sdk');
var s3 = new aws.S3();
console.log('Running myapp');
console.log(JSON.stringify(context.invokedFunctionArn).split(':')[4]);
var AccountNumber = (JSON.stringify(context.invokedFunctionArn).split(':')[4]);
if(AccountNumber == '123456789000') { SourceBucket = 'mybucket-test'; } //test account
if(AccountNumber == '198765432101') { SourceBucket = 'mybucket-prod'; } //prod account
var targetBucket = SourceBucket+"-archive"
//Debug?
console.log("Source", SourceBucket);
console.log("Target", targetBucket);
console.log("Account", AccountNumber);
exports.handler = function () {
// var exec = require('child_process').exec;
const exec = require('child_process').exec;
exec("aws s3 mv s3://", +SourceBucket+ "/incoming/test/ s3://" +targetBucket+ "/incoming/test/ --recursive"), (err, stdout, stderr) => {
//exec(echo 'hello world'), (err, stdout, stderr) => {
if (err) {
// node couldn't execute the command
console.log(err);
return;
}
// the *entire* stdout and stderr (buffered)
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
}
};
我期望的是调用 aws cli 并将文件从主存储桶移动到存档存储桶。
我们预计每天只上传 10-20 个 1kb 的小 txt 文件,因此我们预计这应该 运行 在 Lambda 要求之内。这必须通过 Lambda cron 运行,因为 s3 事件用于其他 lambda。
要将文件从一个 s3 存储桶移动到另一个存储桶,我们可以使用 aws-sdk
,它是 Javascript 的一个 SDK。
参考:
https://aws.amazon.com/sdk-for-node-js/
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html
const AWS = require('aws-sdk');
const s3 = new AWS.S3({
// Input the region that you are using here.
region: 'eu-west-1',
});
exports.handler = async (event, context) {
const sourceBucket = 'bucket-1';
const destinationBucket = 'bucket-2';
const files = await s3
.listObjects({
Bucket: sourceBucket,
})
.promise();
return Promise.all(
files.Contents.map(async content => {
await s3
.copyObject({
Bucket: destinationBucket,
CopySource: `/${sourceBucket}/${content.Key}`,
Key: content.Key,
})
.promise();
return s3
.deleteObject({
Bucket: sourceBucket,
Key: content.Key,
})
.promise();
})
);
}
您也可以使用 aws cli 和子进程来完成。
您的代码中的错误是,当您尝试附加命令时,在 SourceBucket 之前有一个“,”。 :-) 所以命令从未执行过。
async function handler(event, context) {
const SourceBucket = 'bucket-1';
const targetBucket = 'bucket-2';
const exec = require('child_process').exec;
console.log(
'aws s3 mv s3://'
+SourceBucket +
'/ s3://' +
targetBucket +
'/ --recursive'
);
exec(
'aws s3 mv s3://'
+SourceBucket +
'/ s3://' +
targetBucket +
'/ --recursive'
),
(err, stdout, stderr) => {
//exec(echo 'hello world'), (err, stdout, stderr) => {
if (err) {
// node couldn't execute the command
console.log(err);
return;
}
// the *entire* stdout and stderr (buffered)
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
};
}
我不是一个强大的编码员,但尝试使用 node.js 创建一个 Lambda 函数,其中 运行s 通过 Lambda cron 每天一次将 S3 存储桶中的文件移动到 "archive" 存储桶。
尝试了各种方法
sudo nodejs -e "console.log(require('./index').handler({}));"
我在本地机器上的输出是:
Running MyApp
Source mybucket
Target mybucket-archive
Account test
undefined
这是我的代码:
var aws = require('./node_modules/aws-sdk');
var s3 = new aws.S3();
console.log('Running myapp');
console.log(JSON.stringify(context.invokedFunctionArn).split(':')[4]);
var AccountNumber = (JSON.stringify(context.invokedFunctionArn).split(':')[4]);
if(AccountNumber == '123456789000') { SourceBucket = 'mybucket-test'; } //test account
if(AccountNumber == '198765432101') { SourceBucket = 'mybucket-prod'; } //prod account
var targetBucket = SourceBucket+"-archive"
//Debug?
console.log("Source", SourceBucket);
console.log("Target", targetBucket);
console.log("Account", AccountNumber);
exports.handler = function () {
// var exec = require('child_process').exec;
const exec = require('child_process').exec;
exec("aws s3 mv s3://", +SourceBucket+ "/incoming/test/ s3://" +targetBucket+ "/incoming/test/ --recursive"), (err, stdout, stderr) => {
//exec(echo 'hello world'), (err, stdout, stderr) => {
if (err) {
// node couldn't execute the command
console.log(err);
return;
}
// the *entire* stdout and stderr (buffered)
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
}
};
我期望的是调用 aws cli 并将文件从主存储桶移动到存档存储桶。
我们预计每天只上传 10-20 个 1kb 的小 txt 文件,因此我们预计这应该 运行 在 Lambda 要求之内。这必须通过 Lambda cron 运行,因为 s3 事件用于其他 lambda。
要将文件从一个 s3 存储桶移动到另一个存储桶,我们可以使用 aws-sdk
,它是 Javascript 的一个 SDK。
参考:
https://aws.amazon.com/sdk-for-node-js/
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html
const AWS = require('aws-sdk');
const s3 = new AWS.S3({
// Input the region that you are using here.
region: 'eu-west-1',
});
exports.handler = async (event, context) {
const sourceBucket = 'bucket-1';
const destinationBucket = 'bucket-2';
const files = await s3
.listObjects({
Bucket: sourceBucket,
})
.promise();
return Promise.all(
files.Contents.map(async content => {
await s3
.copyObject({
Bucket: destinationBucket,
CopySource: `/${sourceBucket}/${content.Key}`,
Key: content.Key,
})
.promise();
return s3
.deleteObject({
Bucket: sourceBucket,
Key: content.Key,
})
.promise();
})
);
}
您也可以使用 aws cli 和子进程来完成。 您的代码中的错误是,当您尝试附加命令时,在 SourceBucket 之前有一个“,”。 :-) 所以命令从未执行过。
async function handler(event, context) {
const SourceBucket = 'bucket-1';
const targetBucket = 'bucket-2';
const exec = require('child_process').exec;
console.log(
'aws s3 mv s3://'
+SourceBucket +
'/ s3://' +
targetBucket +
'/ --recursive'
);
exec(
'aws s3 mv s3://'
+SourceBucket +
'/ s3://' +
targetBucket +
'/ --recursive'
),
(err, stdout, stderr) => {
//exec(echo 'hello world'), (err, stdout, stderr) => {
if (err) {
// node couldn't execute the command
console.log(err);
return;
}
// the *entire* stdout and stderr (buffered)
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
};
}