将字符串附加到AWS Lambda中的文本文件Nodejs

时间:2015-12-03 01:08:59

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

方案:文本文件snapshot-ids.txt位于S3存储桶中。我正在尝试创建一个每天运行的Lambda函数(Cron),它将使用AWS CLI获取卷的快照,然后将该snapshotId保存到S3中的文本文件中。在下次创建另一个快照时,新的snapshotId将保存到S3上的同一文本文件中。文本文件是snapshotIds的占位符,当它达到阈值时,它将删除顶部的snapshotIds并在末尾添加新的snapshotIds(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);
                }
    });
};

1 个答案:

答案 0 :(得分:2)

到目前为止我注意到你的代码中的一些事情......

  1. s3.putObject完成之前,您无法致电s3.getObject,并且您拥有s3中的文件。

  2. 由于您从data获得s3.getObject,因此您无法处理文件系统。

  3. 考虑到这些事情,我修改了你的代码(我还没试过这个,但它应该让你朝着正确的方向前进):

    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中有多个Lambda,它们很可能会踩到彼此的更改。听起来你每天只会安排一次,所以它不应该是一个大问题,但值得注意。