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

问题描述 投票:0回答:2

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

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

谢谢!

amazon-web-services amazon-s3 aws-lambda
2个回答
2
投票

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

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

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

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

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

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

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


0
投票

我之前没有尝试过,但您可以使用CloudWatch Logs和CloudWatch Events进行设计。

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

Log S3 Event Data to CloudWatch

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

© www.soinside.com 2019 - 2024. All rights reserved.