【问题标题】:How to get recently uploaded zip file from s3 bucket when we trigger the lambda using node js当我们使用节点 js 触发 lambda 时,如何从 s3 存储桶获取最近上传的 zip 文件
【发布时间】:2017-09-14 00:29:14
【问题描述】:

我正在将 zip 文件上传到 s3 存储桶,一旦我上传了 zip 文件,我的 lambda 函数将被触发。

在 Lambda 函数块中,我需要获取最近上传的 zip 文件名 来自 S3 存储桶的 zip 文件的最后修改日期或来自 Lambda 的对象创建日期 记录事件

不过可能是这样,但我需要从 s3 存储桶中获取最近上传的 zip 文件名。**

这是我的代码

s3.listObjects(params, function (err, data) {
    if (err)
        console.log(err, err.stack); // an error occurred


    var lastZipfile = null;
    var lastModified = null;
    data.Contents.forEach(function (c) {
        if (c.Key.endsWith('tar.gz')) {
            if (lastModified === null) {
                lastZipfile = c.Key;
                lastModified = c.LastModified;
            } else {
                // Compare the last modified dates
                if (lastModified <= c.LastModified) {
                    // Track the new latest file
                    lastZipfile = c.Key;
                    lastModified = c.LastModified;
                    //extractData(lastZipfile);
                }
            }
        }

    });
});

【问题讨论】:

    标签: node.js amazon-s3 aws-lambda


    【解决方案1】:

    我将向您展示解决此问题的两个选项。


    1º 选项(自动):

    我看到的最好的选择是让 lambda 函数准备好自动运行 每次将文件放入存储桶 S3 时。当 lambda 函数被调用时,带有来自创建文件的信息的事件将被发送到 lambda 函数。

    下面是一个如何触发的例子:

    下一个:

    下面是一个例子:

    exports.handler = (event, context, callback) => {
    
      var lastCreatedFile = event.Records[0].s3.object.key;
      //extractData(lastCreatedFile);
    
    };
    


    2º 选项(手动):

    但是,您可以在想要获取有关新文件的信息时手动调用 lambda 函数。 使用您的代码,您将始终获得最后修改/创建的文件。

    我已经调整了你提交的 lambda 函数:

    s3.listObjects(params, function (err, data) {
    if (err)
        console.log(err, err.stack); // an error occurred
    
    var sortArray;
    
    data.Contents.sort(function(a,b) {
        return (b.LastModified > a.LastModified) ? 1 :
        ((a.LastModified > b.LastModified) ? -1 : 0);
    });
    
    for(var file of data.Contents){
        if (file.Key.endsWith('tar.gz')) {
            //extractData(file.Key);
            break;
        }
    }
    

    但是我们可能会遇到这样的问题,如果没有创建新文件,就会碰巧多次提取同一个文件。我建议稍后使用文件删除或寻找其他方式来识别该文件已被使用。


    希望对你有所帮助!

    【讨论】:

    • 非常感谢吉安德!!!。实际上在我的场景中,多个 zip 文件正在推送到 S3 存储桶,如何在 Lambda 中一次处理所有 zip 文件。请建议我
    • 在这种情况下,我推荐上面的“第二个选项”。您需要从代码中删除“break”语句,从而处理多个 zip 文件。
    猜你喜欢
    • 2017-03-30
    • 2017-09-05
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2015-02-02
    相关资源
    最近更新 更多