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

Nir*_*raj 2 amazon-s3 amazon-web-services aws-lambda

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

chr*_*ris 6

这是你的错 :)

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

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


Mat*_*aly 6

正如@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:*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)