Как запустить и остановить инстанс EC2 с помощью Lambda

Я пытаюсь запустить и остановить экземпляр Windows EC2 с помощью лямбда, я использую Node.js 8.10 для написания сценария запуска и остановки. Когда я тестирую сценарий, сценарий выполняется успешно, но экземпляр EC2 не выполняется. Я использую Node.js 8.10. с указанием деталей экземпляра и сценария ниже

const AWS = require('aws-sdk');

exports.handler = async (event) => {

const ec2 = new AWS.EC2({ region: event.instanceRegion });
 ec2.stopInstances({ InstanceIds: [event.instanceId] }).promise()
    .then(() => callback(null, `Successfully stopped ${event.instanceId}`))
    .catch(err => callback(err));
};

Скрипт успешно выполнен

введите здесь описание изображения

Ниже приведены сведения об экземпляре  введите описание изображения здесь

Это сценарий остановки, но он не может остановить экземпляр, пожалуйста, помогите мне, я новичок в aws. заранее спасибо


person Mandrek    schedule 31.07.2019    source источник
comment
вы должны вернуть ec2.stopInstances() обещание. То, как вы это делаете, вы возвращаете обработчику обработанное обещание, а затем .stopInstances() не завершает свою работу   -  person guijob    schedule 31.07.2019
comment
@guijob, пожалуйста, отредактируйте мой код, я тоже новичок в node   -  person Mandrek    schedule 31.07.2019


Ответы (1)


При использовании Lambda ваша функция-обработчик получает три параметра: событие, контекст и обратный вызов. Вы используете callback при использовании синхронных функций. При использовании async вы должны вернуть обещание.

const AWS = require('aws-sdk');

exports.handler = async (event, context, callback) => {

const ec2 = new AWS.EC2({ region: event.instanceRegion });
 return ec2.stopInstances({ InstanceIds: [event.instanceId] }).promise()
    .then(() => `Successfully stopped ${event.instanceId}`)
    .catch(err => console.log(err));
};

Фактически, когда вы используете ключевое слово async, вы фактически возвращаете обещание, но, ничего не возвращая, вы разрешаете его с null в качестве ответа, поэтому ваш код просто завершится, а ваш stopInstances не завершит свою работу.

person guijob    schedule 31.07.2019
comment
Или просто await ec2.stopInstances({ InstanceIds: [event.instanceId] }).promise() - person Thales Minussi; 31.07.2019
comment
собственно, для этого есть много разных решений. - person guijob; 31.07.2019
comment
Не уверен, что согласен, что подход .then().catch() можно назвать решением. Это больше не имеет смысла, когда у нас есть async/await. Это, безусловно, работает, но к нему следует относиться неодобрительно. - person Thales Minussi; 31.07.2019