首页 文章

Amazon Lambda到SNS通知无法正常工作

提问于
浏览
2

我有一个从Amazon lambda推送SNS通知的用例 . 我编写了以下代码,IAM角色具有调用SNS的权限 . 即使使用Kenesis触发器,此Lambda函数也无法向SNS发送任何通知 . 我确认了这一点,将我的电子邮件ID订阅到SNS .

[编辑]:只是一个跟进问题 . 我现在需要查询DynamoDB并根据输出,需要调用SNS的不同 endpoints . 现在,当我查询DynamoDB时,执行在DynamoDB查询后停止,甚至没有进行SNS检查 .

以下是我的lambda函数代码 .

console.log('Loading function');
var AWS = require('aws-sdk');
exports.handler = function(event, context) {
event.Records.forEach(function(record) {
    //var payload = new Buffer(record.kinesis.data, 'base64').toString('ascii');
    var payload = record.kinesis.data;
    console.log('Decoded payload:', payload);

    var dynamodb = new AWS.DynamoDB();
    var dynamodb_params = {
        Key: {
            dataSource: { 
                S: payload
            }
        },
        TableName: 'TableName',
        AttributesToGet: [
            'attribute' // ...
        ],
        ConsistentRead: false,
    };
    var sns_endpoint = null;
    dynamodb.getItem(dynamodb_params, function(err, data) {
        if (err) {
            console.log(err.stack);
            context.done(err, 'Errors while querying dynamodb!');  
        } else {
            console.log(data);
            sns_endpoint = data.Item.sns.S;
            console.log("Result= " + data);
            console.log("Item= " + data.Item);
            console.log("sns= " + data.Item.sns);
            console.log("value= " + data.Item.sns.S);
            console.log("sns_endpoint= " + sns_endpoint);
            context.done(null, 'Querying dynamodb succeeded!');
        }
    });
    if( sns_endpoint != null ) {
        console.log("sns_endpoint= " + sns_endpoint);
        var sns_params = {
            Message: payload,
            Subject: 'Event Notification From Lambda',
            TopicArn: sns_endpoint
        };
        var sns = new AWS.SNS();
        sns.publish(sns_params, function(err, data) {
            if (err) {
                console.log(err.stack);
                context.done(err, 'Errors while putting to SNS!');  
            } else {
                console.log(data);
                context.done(null, 'Putting to SNS succeeded!');
            }
        });
    }
});

};

1 回答

  • 3

    您正在 forEach 循环中调用异步函数 sns.publish() . 然后你立刻打电话给 context.succeed() . 一旦 context.succeedcontext.failcontext.done 被调用,您的Lambda函数将退出 . 您需要修改代码,以便在完成所有异步函数调用后仅调用其中一个代码 .

相关问题