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