【问题标题】:Amazon Lambda to SNS notifications not workingAmazon Lambda 到 SNS 通知不起作用
【发布时间】:2015-12-14 21:55:28
【问题描述】:

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

[编辑]:只是一个后续问题。我现在需要查询 DynamoDB 并根据输出,需要调用 SNS 的不同端点。现在,当我查询 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!');
            }
        });
    }
});

};

【问题讨论】:

  • 能分享一下日志输出吗?

标签: amazon-web-services amazon-sns aws-lambda


【解决方案1】:

您正在forEach 循环内调用异步函数sns.publish()。然后您立即致电context.succeed()。只要调用了 context.succeedcontext.failcontext.done,您的 Lambda 函数就会退出。您需要修改您的代码,以便在所有异步函数调用完成后只调用其中一个。

【讨论】:

  • 知道了。因此,如果我删除 context.fail 和 context.done 语句,但保留 context.succeed,那么它会成功吗?
  • 一点也不。您需要研究异步调用是如何工作的。您的 context.succeed 调用发生在您的 sns.publish 调用完成之前。
  • @GurpreetSingh 看看这个问题的答案:stackoverflow.com/questions/34205738/…
猜你喜欢
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2021-02-22
  • 2021-01-24
  • 2017-01-19
相关资源
最近更新 更多