Лямбда-функция AWS с проблемой узла

#javascript #node.js #amazon-web-services #aws-lambda

#javascript #node.js #amazon-веб-сервисы #aws-lambda

Вопрос:

Я работал над лямбда-функцией AWS, используя узел 8.10. Я заметил, что могу импортировать aws-sdk, но у меня возникли некоторые проблемы с запуском некоторых функций EC2. У меня настроена роль с политикой, разрешающей доступ к моей функции. Вот где я хотел бы получить некоторое дополнительное понимание.

Я попытался запустить экземпляр, подобный этому…

 let params = { InstanceIds: ["i-31112345d325"] };

 try{
    let response = ec2.startInstances(params);
    response.send();
}catch(ex){
    console.log(ex);
}
  

и вот так…

  ...
 try{
    let response = ec2.startInstances(params, function(err, data){
      if(err) console.log(err);
      else //do something else
    });
 );
}catch(ex){
    console.log(ex);
}
  

ни один из этих методов, похоже, не запускает компьютер EC2. Я немного покопался и вытащил promise(), и, похоже, это работает.

 try{
    await ec2.startInstances(params).promise().then((response)=> {
        console.log("Success with ", response);
    })
}
catch(ex){
    console.log(ex);
}
  

Я больше ничего не изменил. Большая часть кода, который я видел в Интернете, делает это первыми двумя способами. Кто-нибудь может объяснить, почему у меня это не работает? В документации, похоже, это не рассматривается, и примеры в документах, похоже, не работают для меня. (https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/EC2.html#startInstances-property)

Комментарии:

1. Предполагаю: только последний вариант ожидает возврата функции SDK. Другие варианты возвращаются до завершения вызова функции, а лямбда-функция завершается после отправки асинхронного вызова функции SDK.

2. Ваша функция-обработчик… о какой из них идет речь? exports.handler = (event, ... или exports.handler = async (event, ...

3. В то время я использовал асинхронный обработчик. С тех пор я удалил ее, и, похоже, она работает, когда я включаю обратный вызов функции сейчас.

4. Я понял, что проблема заключалась в моем знании того, как работает обработчик. Я обновлю ответ, чтобы помочь тем, кто в будущем столкнется с такой же проблемой.

Ответ №1:

Для узла 8.10 функция-обработчик поддерживает callback метод. Вы можете использовать это callback , чтобы сообщить лямбде, когда завершать работу, из функции обратного вызова или обещания

       'use strict';
      const AWS = require('aws-sdk');
      var ec2 = new AWS.EC2();
      exports.handler = (event, context, callback) => {
              var params = {  InstanceIds: ["i-1234567890abcdef0"]}
              ec2.startInstances(params, function(err, data) {
                if (err) callback(err.stack); // an error occurred
                else     callback(null, data);           // successful response
                });
              }