amazon-web-services - 现有 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.
解决方案
问题在于 S3 不允许事件通知具有重叠的前缀或后缀。从有关通知的 S3 文档中:
使用过滤器的通知配置不能定义前缀重叠、后缀重叠或前缀和后缀重叠的过滤规则。
这意味着您要么需要在其中一个过滤器中调整您的前缀(例如,使用assets/images/jpg
和assets/images/png
作为前缀),或者,如果您不想使用不同的前缀,那么您可以只使用一个通知配置作为前缀assets/images
,过滤器作为其中的后缀你的 Lambda 函数。这可以通过检查 S3 对象数据的键来完成。当然,后一种选择的缺点是总是调用您的 Lambda 函数,而不管后缀如何。这可能会对您的成本产生负面影响。
我建议您通读S3 文档中的各种通知示例,也许您会受到启发,如何在您的案例中处理此限制。
对于事件名称s3:ObjectCreated:Put
,如果要过滤事件,则必须使用PUT
。您可以查看S3 通知文档的概述部分,其中对其进行了解释:
新对象创建事件 — Amazon S3 支持多个 API 来创建对象。您可以在仅使用特定 API 时请求通知(例如,
s3:ObjectCreated:Put
),或者您可以使用通配符(例如,s3:ObjectCreated:*
)在创建对象时请求通知,而不管使用的 API 是什么。
推荐阅读
- android - 尝试更改另一个片段上的文本视图
- python - 遮罩多边形和精灵之间的碰撞
- python - 数据框从值中获取索引日期
- c# - 运算符“*”不能应用于“void”和“float”类型的操作数
- javascript - 未处理的拒绝(TypeError):net.isIPv4 不是 ReactJS 的函数
- python - mixins 是跨不同实体类型存储多个属性的正确选择吗?
- reactjs - 在 Typescript 中使用 createAsyncThunk 的代码出错
- recaptcha - 有没有办法从 V3 更改为 V2 ReCAPTCHA?
- django - 从 cron 运行 Django 管理命令会导致 ImportError
- android - 在旧版本的 android 中实现 Google Assistant