当前位置: 首页 > 知识库问答 >
问题:

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

华萧迟
2023-03-14

场景:文本文件快照ID。txt位于S3存储桶中。我正在尝试创建一个每天运行的Lambda函数(Cron),该函数将使用AWS CLI拍摄卷的快照,然后将该快照ID保存到S3中的文本文件中。下次创建另一个快照时,新的快照ID将保存到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);
                }
    });
};

共有1个答案

阎元徽
2023-03-14

到目前为止,我注意到了您的代码中的一些事情。。。

>

  • 在s3.getObject完成并且您拥有s3中的文件之前,您不能调用s3.putObject。

    您没有处理文件系统,因为您从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同时运行,它们很可能会相互践踏。听起来你只需要每天安排一次,所以这没什么大不了的,但值得一提。

  •  类似资料:
    • 问题内容: 在Linux中将文本附加到文件的最简单方法是什么? 我看了这个问题,但是可接受的答案使用了一个附加程序(),我相信应该有一个更简单的方法或类似方法。 问题答案: cat >> filename This is text, perhaps pasted in from some other source. Or else entered at the keyboard, doesn’t

    • 问题内容: 我正在使用Python打开文本文档: 我想将字符串变量的值替换为文本文档。有人可以让我知道怎么做吗? 问题答案: 如果使用上下文管理器,则将自动为你关闭文件 如果你使用的是Python2.6或更高版本,则最好使用 对于python2.7及更高版本,你可以使用代替 在Python3中,该函数有一个可选参数 Python3.6引入了f字符串作为另一种选择

    • 问题内容: 我将日志保存到sdcard上的.txt文件中,但是一旦保存了两行,它就会覆盖它并重新开始? 这是我的代码: 在恢复中挂载/ data后,/ sdcard和/ data / media / 0中的日志文件会显示完整的日志历史记录,但在设备开机时不会显示完整的日志历史记录 问题答案: 这是完成的方式。以下示例代码在单击提交按钮后将详细信息保存到文件中: 希望这可以帮助 :)

    • 问题内容: 如何附加这个HTML字符串 到具有DOM中ID的DIV ? (顺便说一句是不可接受的。) 问题答案: 使用(如果可用),否则使用某种后备。当前所有浏览器均支持 insertAdjacentHTML 。

    • 本文向大家介绍iOS 在Swift中附加属性字符串和粗体文本,包括了iOS 在Swift中附加属性字符串和粗体文本的使用技巧和注意事项,需要的朋友参考一下 示例 结果看起来像: 值是:用户输入的内容

    • 我有一个程序,它总是将相同的文件附加到GMAIL(撰写 它所做的是: 在Android 6.0之前,它一直工作良好。现在,我在尝试使用它时收到以下错误: 无法附加空文件 Astro文件共享给我同样的错误(可能是旧版本)。 但是,我安装了ES File Explorer,当我执行相同的例程并选择该文件时,我会收到一个对话框,其中显示: 将文件作为 普通Android方式(适用于彩信、Gmail等)