Завершение работы системы или остановка экземпляра AWS EC2 из NodeJS

У меня есть экземпляры AWS EC2, на которых запущен Debian, а systemd работает с Node в качестве службы. (В дальнейшем эти экземпляры называются «Узловыми серверами».)

Серверы узлов запускаются другим экземпляром (в дальнейшем именуемым «экземпляр менеджера»), который постоянно включен.

Когда сервер Node испытывает некоторый предопределенный период бездействия, я хочу, чтобы он отключался автоматически.

Рассматриваю следующие варианты:

  1. (После определения периода бездействия в Node) выполните child_process в Node, который запускает команду shutdown now.
  2. (После определения периода бездействия в Node) вызовите AWS SDK stopInstances с собственным идентификатором ресурса экземпляра.
  3. Предоставьте конечную точку HTTP GET с именем last-request-time на каждом сервере Node, который периодически опрашивается «экземпляром менеджера», который затем решает, следует ли / когда вызывать AWS SDK stopInstances.

Я не уверен, какой из этих подходов выбрать, и был бы признателен за любой совет. Явное выключение машины из Node, работающего на той же машине, кажется неуместным. Но вариант 3 требует периодического HTTP-опроса, не говоря уже о том, что более рискованно полагаться на другой экземпляр для автоматического выключения. (Если менеджер не работает, все экземпляры продолжают работать.)

Или, возможно, можно заставить systemd выключить машину, когда определенная служба завершает работу с определенным кодом? Это, если возможно, будет лучшим решением, поскольку процесс Node должен будет прервать себя только после периода бездействия с определенным кодом выхода.


person Museful    schedule 02.03.2020    source источник
comment
Вместо вызова StopInstances вы можете обратиться к операционной системе и просто выполнить завершение работы (эквивалент sudo shutdown now -h). Таким образом, вам не нужно выполнять вызов API AWS.   -  person John Rotenstein    schedule 03.03.2020
comment
@JohnRotenstein Это вариант 1 в вопросе.   -  person Museful    schedule 03.03.2020


Ответы (1)


Вы можете создать лямбда-функцию, которая действует как api и использует функциональность SDK stopInstances. Это также позволит вам получить полную функциональность «экземпляра менеджера» и сэкономить еще больше на экземплярах, поскольку он будет запускаться только при необходимости.

Или вы можете исключить посредника и перенести «серверы узлов» на лямбда. (лямбда-документация)

person charbel k    schedule 02.03.2020