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

时间:2016-05-06 10:43:53

标签: javascript node.js amazon-web-services amazon-ec2 amazon-ecs

我最近开始使用AWS,并阅读其文档。

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

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

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

您也应该可以在此处运行自己的代码,然后在将容器实例附加到群集时就可以使用它了。

答案 2 :(得分:0)

你是如何进入ASG的?

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

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

你有什么尝试?

答案 3 :(得分:-1)

您应该使用节点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
});

响应返回属性“registeredContainerInstancesCount”中已注册实例的计数 在启动ec2实例之前先计算实例数,然后等到计数增加1。 您可以使用deasync之类的库来同步等待。