如何通过EventBridge配置S3事件触发器?嵌套目录PNG触发问题
我的文件夹结构如下:
root - folder A - folder B a.png - folder C b.png
需要配置EventBridge规则,当内部子文件夹中上传.png文件时触发Lambda函数,针对以下疑问给出解答和方案:
疑问解答
1. EventBridge是否支持通配符?
EventBridge的事件模式支持有限的通配符,但不是传统文件路径的*/*.png写法。它基于JSON模式匹配,支持*(匹配任意不含分隔符的字符序列)、?(匹配单个字符),还有前缀、后缀匹配,但必须遵循EventBridge的语法规则,不能直接用文件路径式的通配符。
2. 为什么*/*.png模式无法生效?
因为这个写法是文件路径的通配符逻辑,不符合EventBridge的事件模式语法。EventBridge是针对S3事件中的detail.object.key字段(值为类似folder A/folder B/a.png的字符串)做匹配,你需要用EventBridge支持的匹配语法来操作这个字段,而不是直接写路径通配符。
3. 使用后缀是否能解决此问题?
可以,结合后缀匹配和其他条件(比如前缀、排除根目录文件),就能精准实现需求。
具体配置方案
针对S3事件的detail.object.key字段,设置正确的EventBridge事件模式即可:
方案1:匹配所有子文件夹下的.png文件(任意嵌套层级)
如果要匹配root下所有子文件夹(不管嵌套几层)的.png文件,同时排除根目录直接上传的.png,事件模式如下:
{ "source": ["aws.s3"], "detail-type": ["Object Created"], "detail": { "bucket": { "name": ["你的Bucket名称"] }, "object": { "key": [{ "suffix": ".png", "not": [{ "equals": "a.png" }] }] } } }
这里通过suffix: ".png"匹配所有png后缀的文件,再用not.equals排除根目录下的直接上传文件,确保只有子文件夹中的文件触发规则。
方案2:匹配指定父文件夹下的子文件夹(比如folder A下的所有层级)
如果只需要匹配folder A下所有子文件夹里的.png文件,用前缀+后缀组合匹配:
{ "source": ["aws.s3"], "detail-type": ["Object Created"], "detail": { "bucket": { "name": ["你的Bucket名称"] }, "object": { "key": [{ "prefix": "folder A/", "suffix": ".png" }] } } }
这个模式会匹配所有以folder A/开头且以.png结尾的对象key,也就是folder A下所有子文件夹中的png文件。
关键注意事项
- 必须确保你的S3 Bucket已经开启了EventBridge事件通知(不是旧版的S3事件通知),只有开启后,S3才会将事件发送到EventBridge。
- 配置完成后,可以用EventBridge的“测试事件”功能,模拟S3上传事件来验证规则是否能正确匹配。
内容的提问来源于stack exchange,提问作者karthik subramanian

