You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:31:05