AWS SNS不是在lambda上运行,而是在本地运行

时间:2018-10-23 17:51:10

标签: node.js amazon-web-services aws-lambda amazon-sns aws-serverless

我遇到了无法解决自己的问题。我的lambda函数在本地调用时按预期工作,但从AWS Lambda调用时不发送文本消息。它也不会记录任何错误。

这是我的代码,我只对私人内容加注了星标

import request from 'request';
import AWS from "aws-sdk";

const options = {***};
const sentAlert = async msg => {
  const sns = new AWS.SNS();
  await sns.publish({
    Message: msg,
    PhoneNumber: '***',
    MessageAttributes: {
      'AWS.SNS.SMS.SenderID': {
        'DataType': 'String',
        'StringValue': '***'   
      }
    }
  }, function (err, data) {
  if (err) {
    console.log(err.stack);
    return;
  }
  });
  console.log('sms sent');
};

export const getAlert = async (event, context, callback) => {
  request(options, (err, res, body) => {
    if (err) { return console.log('error: ', err); }
    if (body.length === 0 ) { return }
    console.log(`***`);
    const optionsId = {*** };
    request(optionsId, (err, res, body) => { 
      const msg = body.current.indexes[0].description;
      console.log('msg: ', msg);
      sentAlert(msg);
    });
  });
};

我使用serverless invoke local --function getSmogAlert在本地对其进行测试,并且按预期方式工作,我从AWS获得了短信,但是当我使用serverless invoke --function getSmogAlert对其进行调用时-它返回null并且不发送任何文本消息。 我在Nexmo上也遇到过类似的问题,并以为AWS.SNS可能会对我有所帮助,但不。

有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

正如我在评论中所写,我认为您在执行中混淆了promise和回调。尝试以下更改:

const options = {***};
const sentAlert = (msg, callback) => {
  const sns = new AWS.SNS();
  await sns.publish({
    TopicArn: ***
    Message: msg,
    PhoneNumber: '***',
    MessageAttributes: {
      'AWS.SNS.SMS.SenderID': {
        'DataType': 'String',
        'StringValue': '***'   
      }
    }
  }, function (err, data) {
  if (err) {
    console.log(err.stack);
    callback(err);
  }
  });
  console.log('sms sent');
  callback(null)
};

export const getAlert = (event, context, callback) => {
  request(options, (err, res, body) => {
    if (err) { 
      console.log('error: ', err);
      callback(err); 
    }
    if (body.length === 0 ) {
      console.log('Got no body!') 
      callback(null) 
    }
    console.log(`***`);
    const optionsId = {*** };
    request(optionsId, (err, res, body) => {
      if (err) {
        console.log(err.stack);
        callback(err);
      } 
      const msg = body.current.indexes[0].description;
      console.log('msg: ', msg);
      sentAlert(msg, callback);
    });
  });
};

但是,总的来说,我更喜欢使用AWS Lambda nodejs8.10映像支持的异步/等待机制。这将使您的代码简单易行。