【问题标题】:AWS Lambda function firing twiceAWS Lambda 函数触发两次
【发布时间】:2016-04-19 13:25:09
【问题描述】:

每当将对象上传到预设的 S3 存储桶时,我都会使用 AWS Lambda 函数(用 python 编写)发送电子邮件。该对象通过 AWS PHP 开发工具包上传到 S3 存储桶并使用分段上传。每当我测试我的代码时(在 Lambda 代码编辑器页面中),它似乎工作正常,我只收到一封电子邮件。

但是当对象通过 PHP 开发工具包上传时,Lambda 函数会运行两次并发送两封电子邮件,这两封电子邮件都具有不同的消息 ID。我尝试了不同的电子邮件地址,但每个地址都收到两封重复的电子邮件。

谁能指导我哪里出错了?我正在使用通过示例 python 代码导入的 boto3 库来发送电子邮件。

【问题讨论】:

  • 首先你可以检查你没有上传两次。 PutObject 是否触发了 lambda?重复邮件之间的时差是多少?
  • @helloV 对象确实上传了一次到 S3 存储桶。在正确发送和接收电子邮件时,PutObject 会触发 lambda。这两封电子邮件的接收时间正好相隔两秒。

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


【解决方案1】:

是的,我们也有这个,它没有链接到电子邮件,它链接到 S3 为一次上传触发多个事件。与许多消息传递系统一样,Amazon 不保证从 S3 发送事件通知“一次”,因此您的 Lambda 函数需要自己处理。

不是最好的,但可行。

某种形式的缓存,其中包含前几个请求的详细信息,因此您可以查看您是否已经处理了特定的事件消息。

【讨论】:

  • 如何在 Lambda 函数中进行缓存?
  • 也许使用 Redis 或 DynamoDB 之类的东西。缓存需要在 Lambda 调用之间存在,因此它需要位于 Lambda 函数之外。
【解决方案2】:

我也面临同样的问题,在我的情况下,对于 S3 存储桶中的每个 PUT 事件,一个 lambda 都应该触发,它使用相同的 aws_request_idaws_lambda_arn 触发两次。

要修复它,请在某处跟踪aws_request_id(对于每个 lambda 事件,此 id 将是唯一的)并检查处理程序。如果存在相同的aws_request_id,则什么也不做,否则照常处理。

【讨论】:

  • 如何存储 x-amz-request-id 的值以防止多次触发,第二个触发器触发一个新的 lambda,它没有可比较的变量。除非您建议请求 ID 必须存储在 RDS 实例中。
  • @Shek 要么将 ID 持久化到 Redis 等缓存中,将其存储在具有合理 TTL 的 DynamoDB 中,要么构建一个幂等进程(例如写入数据库,这取决于重复身份不存在)。
猜你喜欢
  • 1970-01-01
  • 2019-06-12
  • 2020-04-24
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2020-02-15
相关资源
最近更新 更多