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

Ija*_*d N 27 amazon-s3 amazon-web-services aws-lambda

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

我已经google了这个问题,发现它是无状态的,所以它会被多次调用(不确定这个触发器是多次上传还是同一次上传).

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

是否有任何方法可以为单个上传调用此函数一次?

rk2*_*rk2 23

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

长版:

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

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

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

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

START RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3 Version: $LATEST
Run Code Online (Sandbox Code Playgroud)

此事件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
Run Code Online (Sandbox Code Playgroud)

如果不是解决方案,它至少会给你一些调整正确方向的空间.让我知道事情的后续.

  • +1 不特定于 S3,对我来说,CloudWatch Lambda 触发器也会发生这种情况。除了增加超时之外,是否还有其他选项可以防止这种情况发生。 (3认同)
  • 我的每次都被精确地发射了 3 次。它从 dynamoDB 读取并存储在另一个表中。每次 3 个不同的请求 ID (3认同)

Tar*_*ala 8

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

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

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

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

我也遇到了同样的问题,在我的情况下是因为应用程序错误,解决它对我有帮助。

最近 AWS Lambda 有新的属性来更改默认的重试性质。在异步调用设置下将重试次数设置为 0(默认为 2)。


max*_*paj 5

为了深入了解这个问题,您应该研究消息传递保证。然后,您可以使用幂等消费者模式实现解决方案。

context对象包含有关您当前正在处理的请求 ID 的信息。即使同一事件触发多次,该 ID 也不会更改。您可以在每次事件触发时保存此 ID,然后在处理消息之前检查该 ID 是否已被处理。