AWS s3 -trigger on object created,函数被连续调用

时间:2018-03-28 15:48:34

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

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

2 个答案:

答案 0 :(得分:5)

这是你的错:)

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

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

答案 1 :(得分:5)

正如@chris指出的那样,你已经通过S3 PUT事件触发事件触发了一个递归循环,而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:*"
            ]
        }
    ]
}