【问题标题】:Serverless/Lambda + S3: Is it possible to catch a 'GetObject' event and select a different resource?无服务器/Lambda + S3:是否可以捕获“GetObject”事件并选择不同的资源?
【发布时间】:2017-04-11 05:57:57
【问题描述】:

我要做的是捕获任何图像文件请求并检查该图像是否不存在,返回不同的图像。

我正在研究 Lambda 和无服务器框架,但我找不到太多关于此的信息。有没有可能?

【问题讨论】:

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


    【解决方案1】:

    没有 GetObject 事件。请关注此link 以获取支持的事件列表。 S3 只会在对象因冗余减少而被创建、删除或丢失时通知您(或触发 Lambda 函数)。

    因此,不可能完全按照您的意愿行事,但您有几个选择。

    替代品

    1. 使用 Lambda@Edge 拦截您对使用 S3 作为源的 CloudFront 分配的调用。如果请求的文件丢失,此拦截器可以发送另一个文件。这不是一个好的解决方案,因为您会增加操作的延迟和成本。

    2. 不要向您的客户端提供 S3 端点,而是提供 API 网关端点。在这种情况下,所有图像请求都将由 Lambda 函数处理,如果请求的文件丢失,则可以提供另一个文件。这不是一个好的解决方案,因为您会增加操作的延迟和成本。

    3. 最佳选项,可能有效,但我没有尝试过,是配置 S3 存储桶重定向规则。这是静态网站托管的常见用例,其中找不到页面(状态代码 404)重定向到另一个页面(如 page-not-found.html)。在您的情况下,您可以尝试重定向到默认图像的地址。此解决方案不会使用 Lambda 函数。

    【讨论】:

    • “您确实可以创建一个 S3 事件来触发 GetObjects 上的 Lambda 函数” 事件用于创建和删除对象。 S3 中没有GetObject 事件。
    • @Michael-sqlbot,感谢您的纠正!我已经更新了我的答案。我以为你可以为任何类型的 S3 操作创建 S3 通知,但实际上事件类型列表非常有限。
    • S3 事件允许您挂钩任何更改存储桶的内容。这就是他们的目的。此外,您还可以使用 Lambda@Edge 测试您的理论。我在预览的早期进行了测试,发现源错误不会触发 Lambda 响应函数。我使用 L@E plus 解决了这个问题,使用了 S3 重定向规则,然后从 S3 重写了 Location: 标头,在 Lambda 中使用正则表达式逻辑以允许比 S3 允许的更灵活的重写......但是 L@ E 只能做有限的内容替换——L@E 环境比普通 Lambda 更严格——没有网络访问、没有临时空间或 AWS SDK。
    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2019-04-08
    相关资源
    最近更新 更多