【问题标题】:How to send SNS topic a message from Node.js Lambda function如何从 Node.js Lambda 函数向 SNS 主题发送消息
【发布时间】:2021-02-15 19:25:43
【问题描述】:

已创建一个 SNS 主题来调用订阅的 Lambda 函数,该函数将用户添加到 Cognito 中的组。使用 Web 浏览器中的控制台向主题发送消息可以正常工作。调用 Lambda 函数并将用户添加到组中。

下面的 Lambda 函数尝试通过向 SNS 主题本身发送消息来替换 Web 控制台,该消息应以将用户添加到组中结束。在 Lambda Web 控制台中运行该函数时,该函数返回以下消息:

执行结果:成功(logs)

但是用户没有成功添加到组中。为什么 Lambda 返回成功,但消息没有发送到 SNS 主题?是不是某处配置错误?

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

exports.handler = async (event) => {

AWS.config.update({region: 'ca-central-1'});
   
var params = {
    Message: 'Example',
    TopicArn: 'arn:aws:sns:ca-central-1:example:example'
  };
  
  var publishTextPromise = new AWS.SNS({apiVersion: '2010-03-31'}).publish(params).promise();
  
  publishTextPromise.then(
      function(data) {
          console.log(`Message ${params.Message} sent to the topic ${params.TopicArn}`);
          console.log("MessageID is " + data.MessageId);
      }).catch(
      function(err) {
          console.error(err, err.stack);
  });
};

【问题讨论】:

  • CloudWatch 中有任何日志吗?另外,Lambda 函数是否有权发布到 SNS 主题?
  • @Christian 将 SNS 权限添加到 Lambda 函数的最佳方法是什么?
  • 请看下面我的回答。

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


【解决方案1】:

Lambda 执行环境可能没有等待返回的承诺。试试rewriting your promise code using async/await

【讨论】:

  • 或者在publishTextPromise.then前面插入一个return
【解决方案2】:

要允许函数向 SNS 主题发送消息,请向函数的执行角色添加一个策略,以提供适当的权限,如下所示:

"Action" : [
        "sns:Publish",
    ],
    "Effect" : "Allow",
    "Resource" : [
        { "Ref" : "arn:aws:sns:ca-central-1:example:example" }
    ]

如果 lambda 函数是在 CloudFormation 模板中定义的,您可以在此处添加它。

如果在 AWS 控制台中创建了 lambda 函数,请转到权限选项卡并使用链接导航到执行角色,并将上述权限添加到它:

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 2023-03-18
    • 2019-11-05
    • 1970-01-01
    • 2019-09-28
    • 2021-01-22
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多