我使用S3 Create事件来触发AWS-Lambdas。如果我的处理失败,我想做一些魔术,然后再次触发“事件”以启动我的处理更多。到目前为止,我看到的唯一选择是重新上传文件。
我可以“再次”触发事件而无需重新上传文件吗?
我使用Python和boto3。
答案 0 :(得分:14)
今天我遇到了类似的情况,我需要在文件已经进入S3后重新触发Lamda功能。我的一位同事提出了以下有效的方法:
执行类似的事情:
for ((i=1; ; i++)); do
contents=$(curl -H "Authorization: Token insertlongtokenhere" -H "Content-Type: application/json" https://api.app.secunia.com/api/tickets/?page=$i)
echo "$contents"
if [[ $contents =~ 'next":null' ]]
then break
fi
done
答案 1 :(得分:7)
如果不再次上传文件,则无法再次启用S3事件触发器。但是,对于失败的处理事件,如果您使用的是Lambda,它将按FAQ自动重试3次:
对于Amazon S3存储桶通知和自定义事件,AWS Lambda将会 尝试执行您的功能三次 代码中的错误条件或超出服务或资源的情况 限制。
如果您的处理失败并且您希望更多地控制重试,则可以使用SQS来接收S3事件。这样,您的应用程序就能够从队列中读取消息,如果处理失败/死亡,最终将达到可见性超时,并且可以再次处理SQS消息。这样,您可以无限期地重试,并控制连续重试之间的可见性超时时间。
如果您正在使用Lambda并希望组合使用SQS,则仍可以通过将Lambda函数安排为每5分钟运行一次并让Lambda函数从队列中读取消息来实现。将此与Lambda函数运行时的5分钟限制相结合,您几乎可以连续消耗SQS队列中的消息。
答案 2 :(得分:1)
此处未提及的一种方法是您可以“触摸”S3对象的元数据,它将触发事件。这样您就可以获得事件消息,而无需修改或摆弄原始对象数据。
注意:元数据字段中的数据不必更改即可触发事件。
这里有一些策略: