【发布时间】:2018-03-13 06:07:00
【问题描述】:
我使用 S3 创建事件来触发 AWS-Lambda。如果我的处理失败,我想做一些魔术,然后再次触发“事件”以开始我的处理。到目前为止,我看到的唯一选择是重新上传文件。
我可以在不重新上传文件的情况下“再次”触发事件吗?
我使用 Python 和 boto3。
【问题讨论】:
我使用 S3 创建事件来触发 AWS-Lambda。如果我的处理失败,我想做一些魔术,然后再次触发“事件”以开始我的处理。到目前为止,我看到的唯一选择是重新上传文件。
我可以在不重新上传文件的情况下“再次”触发事件吗?
我使用 Python 和 boto3。
【问题讨论】:
我今天遇到了类似的情况,在文件已经在 S3 中之后,我需要重新触发 Lamda 函数。我的一位同事想出了以下对我们有用的方法:
执行如下操作:
aws lambda invoke
--function-name <lambda function name>
--payload '{
"Records":[{
"s3":{
"bucket":{
"name":"<bucket name>"
},
"object":{
"key": "<key name>"
}
}
}]
}' outfile
【讨论】:
如果不重新上传文件,就不可能再次触发 S3 事件。但是,对于失败的处理事件,如果您使用的是 Lambda,它将根据 FAQ 自动重试 3 次:
对于 Amazon S3 存储桶通知和自定义事件,AWS Lambda 将 在发生以下情况时尝试执行您的函数三次 代码中的错误情况或超出服务或资源 限制。
如果您的处理失败并且您希望对重试有更多控制权,您可以改为使用 SQS 来接收 S3 事件。这样,您的应用程序就能够从队列中读取消息,并且如果处理失败/终止,最终将达到可见性超时,并且可以再次处理 SQS 消息。这样您就可以无限期地重试,还可以控制连续重试之间的可见性超时时间。
如果您正在使用 Lambda 并希望组合使用 SQS,这仍然可以通过安排 Lambda 函数每 5 分钟运行一次并让该 Lambda 函数从队列中读取消息来实现。将此与 Lambda 函数运行时间的 5 分钟限制相结合,您几乎可以连续使用 SQS 队列中的消息。
【讨论】:
这里没有提到的一种方法是您可以“触摸” S3 对象的元数据,它会触发一个事件。这样您就可以获取事件消息,而无需修改或摆弄原始对象数据。
注意:元数据字段中的数据不必更改即可触发事件。
这里有一些策略:
【讨论】: