aws lambda函数为单个事件触发多次

时间:2015-08-18 05:15:51

标签: amazon-web-services amazon-s3 aws-lambda

我正在使用aws lambda函数将存储桶中上传的wav文件转换为mp3格式,然后将文件移动到另一个存储桶。它工作正常。但是触发有问题。当我上传小wav文件时,lambda函数被调用一次。但是当我上传一个大尺寸的wav文件时,会多次触发此功能。

我已经搜索了这个问题并发现它是无状态的,因此会被多次调用(不确定此触发器是针对多次上传还是同一次上传)。

https://aws.amazon.com/lambda/faqs/

是否有任何方法可以为一次上传调用此功能一次?

4 个答案:

答案 0 :(得分:18)

简短版本 尝试在lambda函数配置中增加超时设置。

长版:

我猜你正在遇到lambda函数在这里超时。

S3事件本质上是异步的,并且在该事件被拒绝之前,至少会重试3次侦听S3事件的lambda函数。您提到在执行转换和重新上载的较小尺寸上传期间,您的lambda函数只执行一次(没有错误)。从您的代码转换和重新上传所需的时间可能大于lambda函数的超时设置。

因此,您可能希望尝试增加lambda函数配置中的超时设置。

顺便提一下,确认你的lambda函数被多次调用的一种方法是查看cloudwatch日志中的事件id( 67fe6073-e19c-11e5-1111-6bqw43hkbea3 )发生 - < / p>

START RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3 Version: $LATEST

此事件id表示调用lambda的特定事件,对于负责同一S3事件的所有lambda执行应该相同。

此外,您可以在以下日志行中查找执行时间(持续时间),该日志行标记一个lambda执行结束 -

REPORT RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3  Duration: 244.10 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 20 MB

如果不是解决方案,它至少会给你一些调整正确方向的空间。让我知道它是怎么回事。

答案 1 :(得分:2)

context对象包含您当前正在处理的请求ID的信息。即使同一事件多次触发,此ID也不会发生变化。您可以在每次事件触发时保存此ID,然后检查您处理的最后一个ID是否与当前ID相同。

这是解决此问题的最终代码(使用MongooseJS数据库处理程序的NodeJS):

exports.handler = function(event, context, lambdaCallback) {        
    Events.findOneAndUpdate(
        { name: 'some-event-name' }, 
        { lastRequestId: context.awsRequestId }).then(function(event) {

        // Without specifying the option "new: true" the old document is returned
        // after the update, so we check the ID against the old value 

        if(event.lastRequestId == context.awsRequestId) {
            return;
        }

        /* Run the actual job */
        ...
    });
}

希望这有帮助!

答案 2 :(得分:2)

任何事件执行Lambda几次都是由于AWS document中指定的Lambda重试行为。

您的代码可能会引发异常,超时或内存不足。执行代码的运行时可能会遇到错误并停止。您可能会用完并发并受到限制。

Lambda中可能存在一些错误,导致客户端或服务调用Lambda函数重试。

使用CloudWatch日志查找错误并解决该错误可以解决问题。

我也遇到了同样的问题,就我而言,这是因为应用程序错误,解决它对我有帮助。

答案 3 :(得分:1)

在Lambda配置中查找“异步调用”,其中有一个“重试次数”选项,该选项是函数返回错误时可重试的最大次数。

您还可以在此处配置死信队列服务