【问题标题】: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:*"
]
}
]
}