如何从Cloud Trail的AWS事件触发NotifyEvent负载提取Bucket Name和Key
从S3 Event Bridge触发的CloudTrail NotifyEvent负载中提取Bucket Name和Key
当S3对象上传触发CloudTrail的NotifyEvent并通过Event Bridge传递时,你可以从事件负载的特定字段中提取Bucket名称和对象Key,以下是具体方法:
事件负载关键结构示例
Event Bridge传递的CloudTrail事件核心结构片段如下:
{ "detail": { "eventName": "PutObject", "eventSource": "s3.amazonaws.com", "requestParameters": { "bucketName": "my-demo-bucket", "key": "assets/image%20file.jpg" }, "resources": [ { "ARN": "arn:aws:s3:::my-demo-bucket" }, { "ARN": "arn:aws:s3:::my-demo-bucket/assets/image%20file.jpg" } ] } }
提取步骤
提取Bucket Name
有两种可靠方式:
- 直接读取字段:从
detail.requestParameters.bucketName直接获取,这是最简便准确的方式。 - 从ARN解析:取
detail.resources数组第一个元素的ARN,按:::分割字符串,取最后一段(比如arn:aws:s3:::my-demo-bucket分割后得到my-demo-bucket)。
提取Object Key
注意对象Key通常会做URL编码(空格、特殊字符转义),需要解码:
- 读取并解码字段:先获取
detail.requestParameters.key的编码值,再用URL解码工具还原原始键(比如assets/image%20file.jpg解码后为assets/image file.jpg)。 - 从ARN解析:取
detail.resources数组第二个元素的ARN,去掉前缀arn:aws:s3:::bucket-name/后,再进行URL解码。
示例代码(Lambda处理)
如果用AWS Lambda接收Event Bridge事件,Python示例如下:
import urllib.parse def lambda_handler(event, context): # 提取Bucket名称 bucket = event["detail"]["requestParameters"]["bucketName"] # 提取并解码对象Key encoded_key = event["detail"]["requestParameters"]["key"] object_key = urllib.parse.unquote_plus(encoded_key) # 这里可以添加你的业务逻辑 print(f"处理Bucket: {bucket} 中的对象: {object_key}") return {"statusCode": 200, "body": f"已处理对象 {object_key}"}
内容的提问来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

