我正在使用aws lambda函数将存储桶中上传的wav文件转换为mp3格式,然后将文件移动到另一个存储桶。它工作正常。但是触发有问题。当我上传小wav文件时,lambda函数被调用一次。但是当我上传一个大尺寸的wav文件时,会多次触发此功能。
我已经搜索了这个问题并发现它是无状态的,因此会被多次调用(不确定此触发器是针对多次上传还是同一次上传)。
https://aws.amazon.com/lambda/faqs/
是否有任何方法可以为一次上传调用此功能一次?
答案 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配置中查找“异步调用”,其中有一个“重试次数”选项,该选项是函数返回错误时可重试的最大次数。
您还可以在此处配置死信队列服务