从Lambda(节点js)发布SNS消息导致超时错误

时间:2019-03-07 23:12:10

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

我使用了一个非常简单的代码,该代码从AWS提供的示例中进行了稍微修改:

exports.handler = async (event) => {
    // Load the AWS SDK for Node.js
    var AWS = require('aws-sdk');
    // Set region
    AWS.config.update({region: 'ap-southeast-2'});

    // Create publish parameters
    var params = {
        Message: 'This is a sample message',
        Subject: 'Test SNS From Lambda',
        TopicArn: 'arn:aws:sns:ap-southeast-2:577913011449:TestTopic'
    };

    // Create promise and SNS service object
    var publishTextPromise = new AWS.SNS().publish(params).promise();

    let response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };

    // Handle promise's fulfilled/rejected states
    publishTextPromise.then(
        function(data) {
            console.log("Message ${params.Message} send sent to the topic ${params.TopicArn}");
            console.log("MessageID is " + data.MessageId);
            response.result = 'Success';
        }).catch(
            function(err) {
            console.error(err, err.stack);
            response.result = 'Error';
        });


    return response;
};

并且在测试此服务时出现超时错误。限制为3秒。

由于这是一个非常简单的过程,所以我认为执行该过程不会超过3秒。

我已经检查了我的IAM设置并授予了我的配置文件(管理员配置文件)以完全访问SNS服务的权限。但是错误仍然存​​在。我想知道这里出了什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:1)

我不确定您为什么会超时,但是您的代码无法按照您期望的方式工作。

看到您正在返回<ul> <li>One</li> <li>Two</li> <li>Three</li> <li>Four</li> </ul>代码之外的响应,这意味着您的代码将在.then()代码运行之前返回(承诺是异步的)。

由于您已经在使用Node 8,所以最好使用async/await,而不要使用旧的.then()方法。

我已经对您的代码进行了一点重构,并且效果很好。为了方便起见,我保留了原始参数。了解代码如何更容易阅读和调试。

.then().catch()

如果出于某种原因您不想使用async / await,则需要将函数的返回内容移入.then()代码内,并在调用promise时立即将其返回,就像这样:

'use strict';

// Load the AWS SDK for Node.js
const AWS = require('aws-sdk');
// Set region
AWS.config.update({region: 'ap-southeast-2'});

const sns = new AWS.SNS()

module.exports.handler = async (event) => {

  const params = {
    Message: 'This is a sample message',
    Subject: 'Test SNS From Lambda',
    TopicArn: 'arn:aws:sns:ap-southeast-2:577913011449:TestTopic'
  };

  let response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  try {
    const data = await sns.publish(params).promise();
    response.messageId = data.MessageId,
    response.result = 'Success'
  } catch (e) {
    console.log(e.stack)
    response.result = 'Error'
  }
  return response

};

我强烈建议您使用方法#1。