如何在长时间执行时忽略AWS Lambda超时限制300秒?

abd*_*rik 2 amazon-s3 amazon-web-services node.js aws-lambda

我在使用Node.js的AWS Lambda中遇到超时问题,默认超时时间为300秒.

我想zip size>300MB从S3存储桶下载并解压缩后,上传到同一个存储桶中的临时文件夹.

但由于数据繁重,我无法在时间间隔内完成此操作.

我可以使用EBS,但希望得到任何可以使用Lambda函数的最近解决方案.

如果我能得到相关的建议来完成这项任务,那就太棒了.

这是我用Lambda函数编写的东西.

exports.handler = (event, context, callback) => {
    console.log('Received event for big file:', JSON.stringify(event, null, 2));

    // Get the object from the event and show its content type
    const bucket = event.Records[0].s3.bucket.name;
    const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    const params = {
        Bucket: bucket,
        Key: key,
    };
    s3.getObject(params, (err, data) => {
        if (err) {
            console.log('Error', err);
            const 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);
            callback(message);
        } else {
            console.log('Started to save buffers....');
            JSZip.loadAsync(data.Body).then(function(zip) {
                console.log('Started to extract files.....');
                async.eachSeries(zip.files, function(item, cbk1) {
                    if (!item.dir) {
                        async.waterfall([function(cbk) {
                            zip.file(item.name).async("text").then(function(content) {
                                cbk(null, content)
                            })
                        }], function(err, content) {
                            s3.putObject({
                                Bucket: bucket,
                                Key: 'bigtemp/' + item.name.replace(/^.*[\\\/]/, ''),
                                Body: content
                            }, function(err, result) {
                                if(result && result.ETag){
                                console.log('uploaded file: ', result.ETag);
                                }
                                console.log('Error ', err);
                                cbk1();
                            });
                        })
                    } else {
                        cbk1();
                    }
                });
            });
            callback(null, data.ContentType);
        }
    });
}; 
Run Code Online (Sandbox Code Playgroud)

Ant*_*ace 11

超时由AWS强制执行,虽然它可能会在未来发生变化(这已经发生了两次 - 从写作开始是15分钟.以前是300秒,从原始值60秒更新)赢得了'今天帮助你.单独使用Lambda不适合长时间运行的进程.

选项1:通过在Docker中模拟AWS Lambda迁移到ECS

存在将lambda函数移植到ECS的解决方案,而不必通过在docker容器中模拟lambda来重写函数.您可以使用docker-lambdanode-docker- lambda在docker中模拟lambda,然后只需通过runTask传递事件.

如果你最终改变想要维护lambda函数的想法,另一个例子使用lambda作为事件接收器并将大部分工作转移到ECS中.

一些示例实现:

选项2:AWS步骤功能

如果超时在单个特定操作上没有瓶颈,您可以将其拆分为AWS Step Functions,从而有效地将一个lambda转换为多个lambda.因此,一个函数将调用S3 getObject,另一个函数将调用zip,另一个函数调用S3 putObject,依此类推,以便绕过超时.我怀疑情况并非如此,但值得一提.