我希望在用户下载某个对象(例如,他们通过我的应用上传的照片)以及更新DynamoDB条目时向用户发送通知。为此,我想在我的S3存储桶上创建一个事件触发器,当执行getObject时将触发该事件触发器,调用将执行该工作的Lambda。不幸的是,没有这样的触发器可用 - 只有putObject(以及其他一些东西)的触发器。我不确定为什么。
无论如何,有没有人知道如何做到这一点(除了依靠应用程序发送通知)?我希望这一切都尽可能地设计在后端。
谢谢!
答案 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
如果这种方法适合您,请告诉我。