【问题标题】:AWS s3 -trigger on object created, function gets invoked continuouslyAWS s3 - 在创建对象时触发,函数被连续调用
【发布时间】:2018-03-29 08:13:37
【问题描述】:

我创建了一个 lambda 函数来从 s3 存储桶中读取一个文件 (input.csv) 并对它进行一些更改并将该文件 (output.csv) 保存在同一个存储桶中。 注意:我没有删除存储桶中的 input.csv 文件。 lambda 函数由 object-created(All) 事件触发。但是当输入文件存在于存储桶中时,该函数会被无限次地连续调用。 应该是这样吗?还是有错?

【问题讨论】:

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


    【解决方案1】:

    这是你的错:)

    您已经设置了递归触发器 - 每次更新文件时,您实际上是在编写它的新副本,从而触发事件等。

    这是 Lambda 发布时初始演示中的一个关键警告(图像上传到 S3,触发 lambda 以创建缩略图 - 如果该缩略图写入同一个存储桶,它将再次触发,等等)

    【讨论】:

      【解决方案2】:

      正如@chris 所指出的,您已经通过由 S3 PUT 事件触发的事件触发了递归循环,该事件又执行另一个 PUT,一次又一次地调用触发器。

      为避免此问题,最简单的方法是使用两个 S3 存储桶 - 一个用于在处理之前放置文件,另一个用于在处理后放置文件。

      如果您不想使用两个 S3 存储桶,可以修改触发条件以包含 FilterRules (docs)。这使您可以控制触发器,使其仅在将对象放置在 S3 中的某个“文件夹”中时才会执行(当然文件夹在 S3 中并不真正存在,它们只是键前缀)。

      这是一个例子:

      {
          "LambdaFunctionConfigurations": [
              {
                  "Filter": {
                      "Key": {
                          "FilterRules": [
                              {
                                  "Name": "Prefix", 
                                  "Value": "queue/"
                              }
                          ]
                      }
                  }, 
                  "LambdaFunctionArn": <lambda_func_arn>, 
                  "Id": "<lambda_func_name>:app.lambda_handler", 
                  "Events": [
                      "s3:ObjectCreated:*"
                  ]
              }
          ]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多