Lambda函数异步发送SNS消息重复问题排查与解决求助
问题原因及解决方案
核心原因
你代码里的关键问题是同时混用了AWS SDK的回调模式和Promise模式:在调用sns.publish时,既传入了回调函数,又调用了.promise()方法。AWS SDK v2中,这两种调用方式会各自触发一次publish请求,直接导致SNS发送两条相同消息。
修复方案
方案一:仅使用Promise模式(推荐,适配async handler)
修改sendToTopic函数,移除回调参数,仅保留Promise调用:
function sendToTopic(error){ var sns = new AWS.SNS(); let eventText = 'Error message:\n' + error; var params = { Message: eventText, Subject: "Test SNS From Lambda", TopicArn: 'arn' // 替换为你的实际Topic ARN }; console.log(params); // 直接返回publish的Promise,不再传入回调 return sns.publish(params).promise(); }
Handler可以简化为:
exports.handler = async (event, context) => { await sendToTopic("error"); }
方案二:仅使用回调模式(不推荐,与async handler风格冲突)
如果坚持用回调,需调整函数逻辑避免混用:
function sendToTopic(error, callback){ var sns = new AWS.SNS(); let eventText = 'Error message:\n' + error; var params = { Message: eventText, Subject: "Test SNS From Lambda", TopicArn: 'arn' }; console.log(params); sns.publish(params, function onPublish(err, data){ if(err){ console.error("Unable to send to Topic. Error JSON:", JSON.stringify(err, null, 2)); return callback(err); } console.log('success:' + data); callback(null, data); }); } exports.handler = (event, context, callback) => { sendToTopic("error", callback); }
额外排查点
如果修复后仍有重复消息,检查以下内容:
- 查看Lambda的CloudWatch日志,确认handler是否被触发了两次(可能是事件源重复发送事件)
- 检查SNS主题的订阅列表,是否存在同一收件地址的重复订阅
内容的提问来源于stack exchange,提问作者joey visbeen
相关产品推荐
相关产品推荐

