使用 AWS SDK for Node.js,如何等待 EC2 实例添加到 ECS 集群?

Using AWS SDK for Node.js, how to wait for EC2 instance being added to ECS cluster?

我最近开始使用 AWS,并阅读了它的文档。

根据我的需要,我必须从我的 node.js 代码部署 EC2 实例,等待它们添加到我的 ECS 集群(通过使用正确的 Arn 实例配置文件),然后在最后一个 EC2 实例上启动任务开始了。

但是,实际上,我没有找到在 EC2 启动时定义任务的方法,因为我必须用我的 nodejs 中的变量覆盖 docker 命令并执行其他任务。因此,我必须等待 EC2 添加到 ECS 集群,然后再尝试使用我的参数和容器实例 ID 中的 Arn 启动任务()(但直到我无法从 listContainerInstances() 获取它)。

有没有办法轻松实现? (实际上我尝试使用 setTimeout 循环直到 listContainerInstances() return 一些新的东西,但我认为这根本不是一个好习惯而且我的代码看起来有点难看)。

您是否尝试过在启动时使用用户数据向您的 EC2 发送命令?例如,我将以下用户数据传递到我的 ECS 容器实例中,以便它们自行更新并附加到集群:

#!/bin/bash
yum update -y
echo ECS_CLUSTER=<my cluster name> >> /etc/ecs/ecs.config

如果您不使用自动缩放组,您还可以在此处用名称标记您的实例,等等。

您应该也可以在此处 运行 您自己的代码,然后您的容器实例将在连接到您的集群时准备就绪。

您如何加入 ASG?

最好的办法是调用 describeAutoScalingInstances 并获取 instanceId。将您的实例设置为启动,通过获取上一次调用中没有的实例来找到它的 instanceId。然后设置一个具有最大尝试次数和睡眠超时的循环以等待它准备就绪。您必须使用 listContainerInstances 调用您的集群才能知道它何时准备就绪。

准备就绪后,您会想要 运行 上面的任务并覆盖那里的命令。您可以通过 SDK 和 CLI 将任务固定到特定实例,但不能在 UI

你试过什么?

您应该使用节点 js ecs api describeClusters。

var params = {
  clusters: [
    'STRING_VALUE',
    /* more items */
  ]
};
ecs.describeClusters(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

响应returns属性中注册实例的计数"registeredContainerInstancesCount" 在启动 ec2 实例之前对实例进行计数,并等待计数增加 1。 您可以使用像 deasync 这样的库来同步等待。

Nodejs SDK 中的 EC2 和 ECS 类 都有 waitFor 允许您循环直到满足特定条件。每 6 秒循环一次,最多循环 100 次。

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/EC2.html#waitFor-property