【问题标题】:AWS: Publishing to SNS from Lambda functionAWS:从 Lambda 函数发布到 SNS
【发布时间】:2019-01-28 17:19:25
【问题描述】:

我正在尝试从 lambda 函数发布到我的 AWS SNS 主题,但我只是不明白为什么以下代码不起作用。

我尝试了以下代码的多种变体,但似乎始终无法正常工作。

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

我在回调函数中的登录永远不会触发,无论我将 Lambda 超时时间设置为什么,它总是只是等待时钟结束。

我已经反复检查了我正在使用的 AWS ARN,并且我非常确信它是正确的。

如果我使用无效的 AWS ARN,它的行为与我的代码被触发时完全相同。

CloudWatch Logs 没有向我提供任何额外信息。几乎就像它只是默默地失败而没有在任何地方登录。

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);
    }
};

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

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);
    }
};

输出日志:

    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 

编辑 #2 我已将我的代码更新如下

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);
    }
};

输出日志

START RequestId: 1155953d-b645-11e8-883f-bb9cff5533aa Version: $LATEST
2018-09-12T04:33:59.966Z    1155953d-b645-11e8-883f-bb9cff5533aa    { TopicArn: 'arn:aws:sns:eu-west-1:XXX:XXX',
  Message: 'TEST' }
2018-09-12T04:34:00.516Z    1155953d-b645-11e8-883f-bb9cff5533aa    Promise { <pending> }
END RequestId: 1155953d-b645-11e8-883f-bb9cff5533aa
REPORT RequestId: 1155953d-b645-11e8-883f-bb9cff5533aa  Duration: 610.75 ms Billed Duration: 700 ms     Memory Size: 128 MB Max Memory Used: 32 MB  

【问题讨论】:

  • 你得到什么输出?
  • 这是一个示例输出(我已经删除了一些敏感数据:START RequestId: [removed] Version: $LATEST 2018-08-22T14:25:35.126Z [removed] { TopicArn: 'arn: aws:sns:eu-west-1:[removed]',消息:'TEST'} END RequestId:[removed] REPORT RequestId:[removed] 持续时间:3003.27 ms 计费持续时间:3000 ms 内存大小:128 MB 最大已用内存: 66 MB 2018-08-22T14:25:37.847Z [已删除] 任务在 3.00 秒后超时如您所见,它不会在回调函数中记录任何内容。我不明白为什么...
  • 我的评论看起来真的很乱。没有意识到它会像那样格式化......有没有办法让我的 cmets 更整齐地格式化,这样它就不会删除回车?
  • 放到原帖中
  • @MarcodaFonseca 您还需要增加 Lambda 计时。目前仅设置为 3 秒。

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


【解决方案1】:

替换,

context.done(null, data); 

callback(null, data);

context.fail(err);

callback(err);

【讨论】:

  • 会试一试。握大拇指
  • 不幸的是,这仍然不适合我。我已经更新了原始问题中的代码。
  • 我发现了我的问题...我的 lambda 位于 VPC 上,因此我需要设置一个 VPC 端点,允许它访问 SNS 服务。文档:docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html
猜你喜欢
  • 2015-11-16
  • 2016-04-02
  • 2017-10-11
  • 2021-10-18
  • 2015-12-22
  • 2016-03-05
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
相关资源
最近更新 更多