AWS:从Lambda函数发布到SNS

时间:2018-08-22 12:30:48

标签: node.js aws-lambda amazon-sns

我试图通过lambda函数发布到我的AWS SNS主题,但我不明白为什么以下代码无法正常工作。

我尝试了以下代码的多种变体,但似乎从未奏效。

我还确保我的角色具有此处所述的正确特权:https://stackoverflow.com/a/31493841/4198290

我的回调函数中的记录永远不会触发,无论我将Lambda超时时间设置为什么,总是会等到时钟。

我已对我正在使用的AWS ARN进行了两次检查并进行了三次检查,我非常确定它是正确的。

如果我使用无效的AWS ARN,则其代码被激发时的行为完全相同。

CloudWatch Logs没有为我提供任何其他信息。几乎就像它只是在没有登录的情况下静默失败一样。

var startTime = $('.startcall').val();
    var endTime = $('.endcall').val();

    startTime = new Date(startTime);

    endTime = new Date(endTime);;

    console.log(startTime);
    console.log(endTime);

    var difference = endTime.getTime() - startTime.getTime();
    var resultInMinutes = Math.round(difference / 60000);

    $('.callduration').val(resultInMinutes + ' minutes');

编辑#1 我已更改代码,以在指定AWS版本时尝试进行异步调用,但仍然无法正常运行

const logger = require('./Framework/logger');
const aws = require('aws-sdk');

exports.handler = (event, context, callback) => {
    try {
        var message = {
            "default": "TEST"
        };

        var snsParameters = {
            TopicArn: process.env.Topic,
            Message: JSON.stringify(message)
        }

        logger.error(snsParameters);

        var sns = new aws.SNS();
        sns.publish(snsParameters, function (err, data) {
            if (err) {
                logger.error('error publishing to SNS');
                context.fail(err);
            } else {
                logger.error('message published to SNS');
                context.done(null, data);
            }
        });
    }
    catch (e) {
        logger.error(e);
    }
};

输出日志:

const repository = require('./Framework/database');
const logger = require('./Framework/logger');
const aws = require('aws-sdk');

aws.config.update({ region: 'eu-west-1' });

exports.handler = async (event, context, callback) => {
    try {
        var message = "TEST";

        var snsParameters = {
            TopicArn: process.env.Topic,
            Message: message
        }

        logger.error(snsParameters);

        var sns = new aws.SNS({ apiVersion: '2010-03-31' });

        var snsPromise = sns.publish(snsParameters).promise();

        await snsPromise
            .then((data) => {
                logger.error('message published to SNS');
                context.done(null, data);
            })
            .catch((error) => {
                logger.error('error publishing to SNS');
                context.fail(err);
            });

    }
    catch (e) {
        logger.error(e);
    }
};

编辑#2 我已经更新了我的代码,如下所示

    START RequestId: [removed] Version: $LATEST 
    2018-08-22T14:25:35.126Z [removed] { TopicArn: 'arn:aws:sns:eu-west-1:[removed]', Message: 'TEST' } 
    END RequestId: [removed] 
    REPORT RequestId: [removed] Duration: 3003.27 ms Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 66 MB 
2018-08-22T14:25:37.847Z [removed] Task timed out after 3.00 seconds 

输出日志

var AWS = require('aws-sdk');

AWS.config.update({ region: 'eu-west-1' });

exports.handler = async (event, context, callback) => {
    try {
        var message = "TEST";

        var snsParameters = {
            TopicArn: process.env.Topic,
            Message: message
        };

        console.log(snsParameters);

        var publishTextPromise = new AWS.SNS({ apiVersion: '2010-03-31' }).publish(snsParameters).promise();

        publishTextPromise
            .then(function (data) {
                console.log("Message ${params.Message} send sent to the topic ${params.TopicArn}");
                console.log("MessageID is " + data.MessageId);
                callback(null, data);
            })
            .catch(function (err) {
                console.log(err);
                callback(err);
            });
        console.log(publishTextPromise);
    }
    catch (e) {
        console.log(e);
    }
};

1 个答案:

答案 0 :(得分:1)

替换

context.done(null, data); 

使用

callback(null, data);

context.fail(err);

callback(err);