#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
});
}