Lambda报错Cannot read properties of undefined (reading 'bucket'):S3通知经SNS触发Lambda无事件详情
问题解决步骤
1. 明确事件结构差异
S3直接触发Lambda时,事件是顶层的S3原生结构;但通过SNS中转后,Lambda收到的是SNS封装后的事件结构,S3的原始事件被嵌套在event.Records[0].Sns.Message中,且该字段是JSON字符串格式,无法直接当作对象访问。
2. 修改Lambda代码解析事件
把原来直接读取event.bucket的逻辑,改为先解析SNS消息中的S3原始事件:
示例Node.js代码:
exports.handler = async (event) => { // 提取SNS消息体(S3事件的JSON字符串) const snsMessage = event.Records[0].Sns.Message; // 解析为JSON对象 const s3Event = JSON.parse(snsMessage); // 正常访问S3事件的bucket和object信息 const bucketName = s3Event.Records[0].s3.bucket.name; const objectKey = s3Event.Records[0].s3.object.key; console.log(`Bucket: ${bucketName}, Object: ${objectKey}`); // 后续业务逻辑... };
3. 验证事件结构(可选)
如果不确定事件层级,可以先打印完整event对象确认结构:
exports.handler = async (event) => { console.log('Received event:', JSON.stringify(event, null, 2)); };
执行后查看CloudWatch日志,就能清楚看到SNS消息的位置和S3事件的嵌套关系。
4. 检查SNS订阅配置
确保SNS订阅Lambda时,协议选择AWS Lambda,同时确认Lambda的IAM角色已授权SNS服务调用该函数(可在Lambda触发器配置中查看SNS触发器是否正常添加)。
内容的提问来源于stack exchange,提问作者Rushi
相关产品推荐
相关产品推荐

