如何在S3生成对象创建事件时获取并传递对象路径或URI
S3对象创建事件获取完整URI实现方案
S3触发的事件通知本身就携带了构造完整对象URI的全部必填字段,不需要额外调用S3 API遍历查找,很多示例没展示完整路径是因为演示时只截取了字段片段,没有展示Key字段的完整值。
核心原理
S3本身不存在实体的多层文件夹结构,你看到的按日期生成的多级子目录,本质是对象键(Key)中用/分隔的路径前缀。S3事件返回的key字段本身就包含从桶根目录开始的完整路径,不会只返回单独的文件名。
标准S3对象URI格式固定为:s3://<存储桶名称>/<解码后的完整对象键>
EventBridge事件字段说明
S3对象创建事件投递到EventBridge后,核心字段结构如下(无关字段已省略):
{ "time": "2024-06-15T08:30:00Z", "detail": { "bucket": { "name": "your-bucket-name" }, "object": { "key": "2024/06/15/batch123/order_data.csv", "size": 24567 } } }
注意:如果对象键包含中文、空格、特殊符号,
key字段的值是经过URL编码的,使用前需要做URL解码,否则拼接出的路径会出现%20、%E4%B8%AD%E6%96%87这类转义字符,和控制台看到的路径不一致。
对接SNS/Kinesis的具体实现方式
根据你的后续投递需求,两种方案可选,都能直接拿到精准的对象完整路径:
- 无代码方案:直接使用EventBridge的输入转换器,不需要部署任何计算资源。在事件规则的目标配置里选择输入转换器,定义输出模板时直接拼接URI字段即可,模板示例:
配置完成后,投递到SNS/Kinesis的消息里会直接携带{ "event_time": "<time>", "source_bucket": "<detail.bucket.name>", "raw_object_key": "<detail.object.key>", "full_s3_uri": "s3://<detail.bucket.name>/<detail.object.key>" }full_s3_uri字段,就是对象的完整路径。 - 轻量转换方案:如果你的对象键存在大量特殊字符需要解码,或者需要补充其他自定义逻辑,可以在EventBridge和目标之间加一个最小规格的Lambda函数做转换,逻辑非常简单:读取事件中的桶名和Key字段,对Key做URL解码后拼接成标准S3 URI,再把加工后的事件投递到SNS或Kinesis即可,单请求运行时长通常在100ms以内,成本几乎可以忽略。
常见误区
不要参考网上部分截断的事件示例误以为返回值只有文件名:只要是官方标准的S3事件通知,object.key字段一定包含完整的路径前缀,和你在S3控制台看到的对象路径完全对应,不需要额外遍历桶内文件定位对象位置。
内容的提问来源于stack exchange,提问作者codeSeeker
相关产品推荐
相关产品推荐

