【问题标题】:AWS Lambda function getting called repeatedlyAWS Lambda 函数被重复调用
【发布时间】:2018-09-24 14:08:43
【问题描述】:
我编写了一个 Lambda 函数,当文件进入我的 S3 存储桶时会自动调用该函数。
我对此文件执行某些验证,修改特定文件并将文件放在同一位置。
由于这个“放置”,我的 lambda 被再次调用,这个过程一直持续到我的 lambda 执行超时。
有没有办法只触发一次这个 lambda?
- 我找到了一种方法,可以将文件名存储在 DynamoDB 中,并且可以在 lambda 函数中应用检查,但是否还有其他方法可以避免使用 DynamoDB?
【问题讨论】:
标签:
amazon-web-services
aws-lambda
【解决方案1】:
你有几个选择:
- 您可以将文件放到s3中的不同位置并删除原始文件
- 您可以在更新 s3 对象时添加元数据字段。然后检查 s3 中是否存在该字段,以便知道您是否已经处理过它。现在这可能无法完美运行,因为 s3 并不总是提供更新后读取的最新数据。
【解决方案2】:
AWS 允许不同类型的 s3 事件触发器。你可以试试玩 s3:ObjectCreated:Put vs s3:ObjectCreated:Post。
【解决方案3】:
您可以将文件上传到文件夹中,比如说
s3://bucket-name/未验证
并将验证的存储在另一个文件夹中,比如
s3://bucket-name/已验证。
更新您的 S3 事件通知,以便在 /notvalidated 前缀中存在 ObjectCreate(All) 事件时调用您的 lambda 函数。
【解决方案4】:
第二个答案似乎不正确(put vs post) - 在 POST 或 PUT 方面,S3 中并没有真正的更新概念。更新对象的请求将与对象的初始 POST 相同。有关可用 S3 事件的详细信息,请参阅 here。
去年我遇到了这个确切的问题 - 我正在 PUT 上调整图像大小,每次文件被覆盖时,它都会再次触发。我推荐的解决方案是在您的 s3 存储桶中有两个文件夹 - 一个用于原始文件,一个用于最终文件。然后,您可以使用 lambda 前缀创建 lambda 触发器,因此它只检查原始文件夹中的文件