Search code examples
iosnode.jsamazon-web-serviceslambdaaws-api-gateway

AWS SNS Multiple notifications received


I have an API Gateway method calling a Lambda Node.js function. The Lambda function calls SNS and posts an APNS notification to my iPhone. When I invoke the API gateway or the Lambda function in the AWS console, I get one notification as expected. I also get one notification when running the Lambda code on the command line (Grunt and Node.js). I also get one notification when running the javascript from eclipse.

However, when I POST to the API gateway, I get 2-5 notifications. Every thing looks the same. I checked the Cloudwatch logs and it seems only one request is sent each time. Anybody have any idea how to debug this?


Solution

  • I figured it out. I had my function outside the exports.handler function:

    var AWS = require('aws-sdk');
    var sns = new AWS.SNS();
    
    var myAlerter = function(){
    
        var numSent = 0;
        var callback;
        var arn = "arn:aws:sns:us-west-2:45435475457:endpoint/APNS/MyAlerter/5a11c61f-1122-3344-5566-656845463";
    
        var sendNotification = function(messageText){
    
                var apns = {
                        aps : {
                            alert : messageText,
                            sound : 'default'
                        }
                };
                var message = {
                        "APNS" : JSON.stringify(apns)
                };
                message = JSON.stringify(message);
    
                var params = {
                        Message: message, 
                        MessageStructure: 'json',
                        TargetArn: arn
                };
    
                numSent++;
                sns.publish(params, function(err, data){
                    if (err){
                        callback(err, err.stack);
                    }else {
                        var result = {
                                error: false,
                                numSent : numSent,
                                data: data
                        };              
    
                        callback(false,result);
                    }
                });            
        };
    
        return {
    
            alert : function(message, cb){
                callback = cb;
                sendNotification(message);
            }
    
        }
    
    }();
    
    exports.handler = function(event, context){
    
        var alertedCallback = function(error, data){
            if (error){
                context.done(error);
            } else {
                context.succeed(data);
            }
        };          
    
        myAlerter.alert(event.message, alertedCallback);
    
    };
    

    Everytime I called the API Gateway and invoked my Lambda function, the numSent variable would increment. I guess putting my function inside the exports.handler ensured that my function wasn't global or something.