我最近开始使用AWS,并阅读其文档。
根据我的需要,我必须从我的node.js代码部署EC2实例,等待它们被添加到我的ECS集群(通过使用正确的Arn实例配置文件),然后在最后一个EC2实例上启动任务。
但是,实际上,我没有找到在EC2启动时定义任务的方法,因为我必须使用来自nodejs的变量覆盖docker命令并执行其他任务。因此,我必须等待EC2被添加到ECS集群,然后尝试使用我的参数startTask()和来自Container Instance Id的Arn(但我无法从listContainerInstances()获取它直到)。
有没有办法轻松实现这一目标? (实际上我尝试使用setTimeout循环,直到listContainerInstances()返回一些新东西,但我认为这根本不是一个好习惯而且我的代码看起来有点难看。)
答案 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之类的库来同步等待。