首页 > 解决方案 > 现有 S3 的无服务器触发器因后缀重叠而失败

问题描述

按照S3 简单事件定义,我创建了无服务器部署

functions:
  convert:
    handler: handler.convert
    events:
      - s3:
          bucket: dev.domain.com
          event: s3:ObjectCreated:*
          rules:
            - prefix: assets/images/
            - suffix: .jpg
          existing: true
      - s3:
          bucket: dev.domain.com
          event: s3:ObjectCreated:*
          rules:
            - prefix: assets/images/
            - suffix: .png
          existing: true

但是在部署时我收到以下错误

An error occurred: ConvertCustomS31 - Failed to create resource. Configuration is ambiguously defined. Cannot have overlapping suffixes in two rules if the prefixes are overlapping for the same event type. See details in CloudWatch Log: 2020/08/25/[$LATEST]47c58153b46f4aaf9ec08eacabbac2b2.

知道我在这里缺少什么吗?

event: s3:ObjectCreated:*如果我只想触发 S3 PUT 事件,我还应该在这里使用什么。我试过event: s3:ObjectCreatedByPut:*了,这给了我

An error occurred: ConvertCustomS31 - Failed to create resource. The event is not supported for notifications See details in CloudWatch Log: 2020/08/25/[$LATEST]f50070907c60405085c3b03ab0183514.

标签: amazon-web-servicesamazon-s3aws-lambdaserverless-frameworkaws-serverless

解决方案


问题在于 S3 不允许事件通知具有重叠的前缀或后缀。从有关通知的 S3 文档中

使用过滤器的通知配置不能定义前缀重叠、后缀重叠或前缀和后缀重叠的过滤规则。

这意味着您要么需要在其中一个过滤器中调整您的前缀(例如,使用assets/images/jpgassets/images/png作为前缀),或者,如果您不想使用不同的前缀,那么您可以只使用一个通知配置作为前缀assets/images,过滤器作为其中的后缀你的 Lambda 函数。这可以通过检查 S3 对象数据的键来完成。当然,后一种选择的缺点是总是调用您的 Lambda 函数,而不管后缀如何。这可能会对您的成本产生负面影响。

我建议您通读S3 文档中的各种通知示例,也许您会受到启发,如何在您的案例中处理此限制。

对于事件名称s3:ObjectCreated:Put,如果要过滤事件,则必须使用PUT。您可以查看S3 通知文档的概述部分,其中对其进行了解释:

新对象创建事件 — Amazon S3 支持多个 API 来创建对象。您可以在仅使用特定 API 时请求通知(例如,s3:ObjectCreated:Put),或者您可以使用通配符(例如,s3:ObjectCreated:*)在创建对象时请求通知,而不管使用的 API 是什么。


推荐阅读