S3事件通知未携带对象key,S3→SNS→SQS→Lambda链路调试咨询
问题根因
你当前打印的事件是S3配置事件通知规则时自动发送的测试事件,事件类型为s3:TestEvent,这类测试通知本身就不会携带S3对象key字段,只有真实的对象操作(如上传、删除对象等)触发的事件通知才会包含key信息。
排查步骤
- 先清空SQS队列中积压的历史测试事件,避免测试事件干扰测试结果
- 检查S3存储桶的事件通知规则配置:
- 确认绑定的事件类型符合你的业务需求(比如
所有对象创建事件、所有对象删除事件等你需要的触发场景) - 检查是否配置了前缀/后缀过滤规则,是否存在规则把你期望触发的事件过滤掉的情况
- 确认S3事件通知绑定的SNS主题ARN正确,且SNS主题的访问策略允许对应S3存储桶向其发布消息
- 确认绑定的事件类型符合你的业务需求(比如
- 检查SNS到SQS的转发配置:
- 确认SNS的SQS订阅没有配置消息过滤规则,把携带key的真实业务事件过滤掉了
- 如果不需要SNS的签名等附加字段,可以开启SNS订阅的「原始消息传递」,减少后续解析的层级
- 确认Lambda的解析逻辑正确,真实事件需要多层JSON解析才能拿到S3对象信息,参考Python解析代码如下:
import json def lambda_handler(event, context): # 遍历SQS触发的所有记录 for sqs_record in event["Records"]: # 解析SQS消息体中的SNS通知 sns_notification = json.loads(sqs_record["body"]) # 解析SNS消息体中的原始S3事件 s3_event = json.loads(sns_notification["Message"]) # 跳过测试事件 if s3_event.get("Event") == "s3:TestEvent": continue # 读取真实S3事件的存储桶和对象key for s3_record in s3_event["Records"]: bucket_name = s3_record["s3"]["bucket"]["name"] object_key = s3_record["s3"]["object"]["key"] # 后续业务逻辑 print(f"存储桶名称: {bucket_name}, 对象Key: {object_key}")
内容的提问来源于stack exchange,提问作者sprint_6
相关产品推荐
相关产品推荐

