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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在我的S3存储桶上执行getObject操作时,如何触发Lambda函数?相关的知识,希望对你有一定的参考价值。

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

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

谢谢!

答案

不幸的是,没有这样的触发器可用 - 只有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函数中指定需要调用执行实际工作的函数的区域。

另一答案

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

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

Log S3 Event Data to CloudWatch

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

以上是关于在我的S3存储桶上执行getObject操作时,如何触发Lambda函数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CORS 在 AWS S3 存储桶上获取

S3:调用GetObject操作时发生错误(AccessDenied):Access Denied

从托管在 S3 存储桶上的站点访问 AWS API 时出现 CORS 问题 [关闭]

尽管政策允许我的站点引荐来源网址,但 S3 存储桶上的 copyObject 访问被拒绝

S3:AJAX POST 没有“访问控制允许来源”

Amazon S3 - 尽管有 GetObject 限制,但返回 403 错误而不是 404