node.js - 将字符串附加到 AWS Lambda 中的文本文件 Nodejs

标签 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. s3.getObject 完成并且您获得 s3 中的文件之前,您无法调用 s3.putObject

  2. 自从您从 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);
                        }
            });

        }
    });

};

还需要记住的是,如果您同时运行超过 1 个 Lambda,它们很可能会破坏彼此的更改。听起来您每天只会安排一次,所以这不是什么大问题,但值得注意。

关于node.js - 将字符串附加到 AWS Lambda 中的文本文件 Nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34056133/

相关文章:

amazon-web-services - AWS S3 - 如何阻止图像强制下载而不是显示。

node.js - swagger 上传后处理 csv 文件 - 没有这样的文件或目录

node.js - 如何读取大文件并将其上传到 s3?

javascript - 如何使用正则表达式检查字符串是否包含日期?

node.js - Mongoose 对象 id 约束

javascript - node.js 部署在静态 IP 上?

javascript - 如何使用 Node.js 实现 youtube.search.list

javascript - webshot 不会在 html 中渲染本地镜像

amazon-web-services - 调用 AssumeRole 操作时发生错误 (InvalidClientTokenId) : The security token included in the request is invalid

amazon-web-services - 具有非 ASCII Content-Disposition header 的 S3 PutObjectRequest 会引发异常