方案:文本文件snapshot-ids.txt
位于S3存储桶中。我正在尝试创建一个每天运行(Cron)的Lambda函数,该函数将使用AWS CLI拍摄卷的快照,然后将该快照ID保存到S3中的文本文件中。下次创建另一个快照时,新的snapshotId将保存到S3上的同一文本文件中。文本文件是快照ID的占位符,当达到阈值时,它将删除顶部的快照ID,并在末尾添加新的快照ID(FIFO管道)。
对于不使用AWS lambda的人,我的问题是将文本追加到变量并返回带有新行的新变量的最快方法是什么。
对于了解Lambda的人,这是我拥有的AWS Lambda的基本代码,我使用fs.appendFile,但如何使用从s3.getObject()获得的文件并将其最终传递给s3.putObject()?
编辑:这是我的进步:
console.log('Loading function');
var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
var fs = require('fs');
exports.handler = function(event, context) {
//console.log('Received event:', JSON.stringify(event, null, 2));
// Get the object from the event and show its content type
var bucket = event.Records[0].s3.bucket.name;
var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
var params = {
Bucket: bucket,
Key: key
};
s3.getObject(params, function(err, data) {
if (err) {
console.log(err);
var message = "Error getting object " + key + " from bucket " + bucket +
". Make sure they exist and your bucket is in the same region as this function.";
console.log(message);
context.fail(message);
} else {
// fs.appendFile('snapshot-ids.txt', 'snap-001', function (err) {
// if (err) throw err;
// console.log('The "data to append" was appended to file!');
// });
console.log(params_new);
console.log('CONTENT TYPE getObject:', data.ContentType);
// context.succeed(data.Body.toString('ascii'));
}
});
var params_new = {
Bucket: bucket,
Key: key,
Body: 'snap-002'
};
s3.putObject(params_new, function(err, data) {
console.log('put here');
if (err) {
console.log(err);
var message = "Error getting object " + key + " from bucket " + bucket +
". Make sure they exist and your bucket is in the same region as this function.";
console.log(message);
context.fail(message);
} else {
console.log('CONTENT TYPE putObject:', data.ContentType);
context.succeed(data.ContentType);
}
});
};
到目前为止,我在您的代码中注意到了几件事...
s3.putObject
直到s3.getObject
完成并且您拥有s3中的文件,您才能调用。
因为你得到了你是不是与文件系统处理data
的s3.getObject
。
考虑到这些事情,我修改了您的代码(我没有尝试过,但是应该可以使您朝正确的方向前进):
console.log('Loading function');
var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
exports.handler = function(event, context) {
//console.log('Received event:', JSON.stringify(event, null, 2));
// Get the object from the event and show its content type
var bucket = event.Records[0].s3.bucket.name;
var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
var params = {
Bucket: bucket,
Key: key
};
s3.getObject(params, function(err, data) {
if (err) {
console.log(err);
var message = "Error getting object " + key + " from bucket " + bucket +
". Make sure they exist and your bucket is in the same region as this function.";
console.log(message);
context.fail(message);
} else {
console.log(params_new);
console.log('CONTENT TYPE getObject:', data.ContentType);
// convert body(file contents) to a string so we can append
var body = data.Body.toString('utf-8');
// append data
body += 'snap-001\n';
var params_new = {
Bucket: bucket,
Key: key,
Body: body
};
//NOTE this call is now nested in the s3.getObject call so it doesn't happen until the response comes back
s3.putObject(params_new, function(err, data) {
console.log('put here');
if (err) {
console.log(err);
var message = "Error getting object " + key + " from bucket " + bucket +
". Make sure they exist and your bucket is in the same region as this function.";
console.log(message);
context.fail(message);
} else {
console.log('CONTENT TYPE putObject:', data.ContentType);
context.succeed(data.ContentType);
}
});
}
});
};
还有一点要记住的是,如果您同时运行多个Lambda,则它们很可能会互相on脚。听起来您每天只计划安排一次,所以这没什么大不了的,但是值得注意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句