【问题标题】:Shutdown system or stop AWS EC2 instance from NodeJS从 NodeJS 关闭系统或停止 AWS EC2 实例
【发布时间】:2020-03-02 23:35:26
【问题描述】:

我有 AWS EC2 实例运行 Debian,systemd 运行节点即服务。 (以下将这些实例称为“节点服务器”。)

Node 服务器由另一个永久开启的实例(以下称为“管理器实例”)启动。

当节点服务器遇到某个预定义的不活动期时,我希望它自动关闭。

我正在考虑以下选项:

  1. (在检测到 Node 中的一段时间不活动后)在运行 shutdown now 命令的 Node 中执行 child_process
  2. (在检测到 Node 中的一段时间不活动后)使用实例自己的资源 ID 调用 AWS SDK 的 stopInstances
  3. 在每个 Node 服务器上公开一个名为 last-request-time 的 HTTP GET 端点,由“管理器实例”定期轮询,然后决定是否/何时调用 AWS SDK 的 stopInstances

我不确定该采用哪种方法,如果有任何建议,我将不胜感激。从运行在同一台机器上的 Node 显式关闭机器感觉有点不合适。但是选项 3 需要定期进行 HTTP 轮询,更不用说依赖另一个实例进行自动关闭感觉风险更大。 (如果经理宕机了,所有的实例都会继续运行。)

或者当特定服务以特定代码退出时,也许可以让 systemd 关闭机器?如果可能的话,这将是最好的解决方案,因为 Node 进程只需要在具有特定退出代码的不活动期之后自行中止。

【问题讨论】:

  • 与其调用StopInstances,不如调用操作系统并简单地关闭(相当于sudo shutdown now -h)。这样,您无需进行 AWS API 调用。
  • @JohnRotenstein 这是问题中的选项 1。

标签: node.js amazon-ec2 aws-sdk systemd aws-sdk-nodejs


【解决方案1】:

您可以创建一个充当 api 并使用 SDK 的 stopInstances 功能的 lambda 函数。 这也将允许您使其具有“管理器实例”的全部功能并节省更多实例,因为它只会在需要时运行。

或者您可以去掉中间人并将“节点服务器”迁移到 lambda。 (lambda documentation)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 2013-04-05
    • 2019-08-03
    • 2015-11-15
    • 2016-11-22
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    相关资源
    最近更新 更多