【问题标题】: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】:

    你有几个选择:

    1. 您可以将文件放到s3中的不同位置并删除原始文件
    2. 您可以在更新 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 触发器,因此它只检查原始文件夹中的文件

          【讨论】:

            【解决方案5】:

            根据对象是否放置/发布/复制/完成多部分上传在 S3 中触发事件 - 所有这些操作都对应于 AWS 文档中的 ObjectCreate

            https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html

            最好的解决方案是将您的 S3 对象创建事件限制在特定的存储桶位置。这样该存储桶位置的任何更改都会触发 lambda 函数。

            您可以在其他未配置为在该位置创建对象时触发 lambda 函数的存储桶位置进行修改。

            希望对你有帮助!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-09-18
              • 2021-09-19
              • 1970-01-01
              • 2021-08-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-09-29
              相关资源
              最近更新 更多