在我的S3存储桶上执行getObject操作时,如何触发Lambda函数?

时间:2018-02-28 12:01:48

标签: amazon-web-services amazon-s3 aws-lambda

我希望在用户下载某个对象(例如,他们通过我的应用上传的照片)以及更新DynamoDB条目时向用户发送通知。为此,我想在我的S3存储桶上创建一个事件触发器,当执行getObject时将触发该事件触发器,调用将执行该工作的Lambda。不幸的是,没有这样的触发器可用 - 只有putObject(以及其他一些东西)的触发器。我不确定为什么。

无论如何,有没有人知道如何做到这一点(除了依靠应用程序发送通知)?我希望这一切都尽可能地设计在后端。

谢谢!

2 个答案:

答案 0 :(得分:2)

  

不幸的是,没有这样的触发器可用 - 只有putObject(以及其他一些东西)的触发器。我不确定为什么。

S3事件旨在捕获更改存储桶内容的请求,以便您可以立即对更改做出反应。当然,GET请求不会更改存储桶。

触发GET的事件可能意味着要做很多工作。

潜在地,实现这一目标的一个好方法是使用CloudFront访问S3中的内容(无论如何通常都是个好主意),然后创建Lambda @ Edge Viewer响应触发器。

触发器将调用一个新的Lambda函数,这个新函数将执行的操作是检查原始请求的路径(以查找对象键)并验证响应的状态代码是否确实200 ,并向Lambda服务发送请求,以异步调用您的其他Lambda函数来执行实际的跟踪和通知工作。

为什么两个Lambda功能? Lambda @ Edge函数将阻止响应直到其工作完成,并且您在边缘的查看器端具有有限的资源 - 这些触发的函数被设计用于快速且相对不显眼的钩子。在这里使用一个相对简单的函数来调用执行实际工作的函数,并异步调用第二个函数,允许“实际工作”函数花费所需的时间,而不会将响应暂停回查看器。如果该函数失败,您仍然希望查看器看到图像,因此异步调用是有意义的。

请注意,Lambda @ Edge函数是在us-east-1中构建和测试的,但它们在距离查看器最近的AWS区域的上下文中运行 - 因此您始终需要在实例上设置区域边缘函数中的AWS SDK,用于指定需要调用执行实际工作的函数的区域。

答案 1 :(得分:0)

我以前没试过这个,但你可以用CloudWatch Logs& amp; CloudWatch Events。

您可以记录S3事件,并可以使用Amazon Lambda中的上述两个选项监控该日志组,以触发您的功能。

Log S3 Event Data to CloudWatch

如果这种方法适合您,请告诉我。