AWS SNS не работает с лямбды, но работает локально - PullRequest
0 голосов
/ 23 октября 2018

У меня есть проблема, которую я не могу решить сама.Моя лямбда-функция работает как положено, когда вызывается локально, но не отправляет текстовое сообщение при вызове из 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 - он возвращает ноль и не отправляет текстовое сообщение.У меня были похожие проблемы с Nexmo, и я подумал, что, возможно, AWS.SNS поможет мне, но нет.

Любая помощь, пожалуйста?

1 Ответ

0 голосов
/ 24 октября 2018

Как я уже писал в своем комментарии, я думаю, что вы путаете обещания и обратные вызовы при исполнении.Попробуйте внести следующие изменения:

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.Это сделает ваш код простым и понятным.

...