添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

0 人关注

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

对于我的需求,我必须从我的node.js代码中部署EC2实例,等待它们被添加到我的ECS集群中(通过使用正确的Arnance Profile),然后在最后启动的EC2实例上启动一个任务。

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

有什么方法可以轻松实现这个目标吗? (事实上,我尝试用setTimeout循环,直到listContainerInstances()返回新的东西,但我认为这根本不是一个好的做法,我的代码看起来有点难看)。

javascript
node.js
amazon-web-services
amazon-ec2
amazon-ecs
DarkCenobyte
DarkCenobyte
发布于 2016-05-06
4 个回答
Chris Dev
Chris Dev
发布于 2016-05-14
0 人赞同

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

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

Marc Young
Marc Young
发布于 2016-05-14
已采纳
0 人赞同

你是如何进入ASG的?

你最好的办法是调用 describeAutoScalingInstances 并获得 instanceIds。将你的实例设置为启动,通过获取之前调用中没有的实例,找到它的实例ID。然后设置一个有最大尝试次数和睡眠超时的循环,等待它准备好。你必须用 listContainerInstances 进行调用,让你的集群知道它何时准备好。

当它准备好后,你会想在它身上运行任务,并在那里覆盖命令。你可以通过SDK和CLI将任务钉在一个特定的实例上,但不能在用户界面上钉。

你试过什么?

谢谢,这实际上与我所尝试的相似。我在ec2.runInstances回调中保留了instanceId,并编写了一个执行ecs.listContainerInstances的函数,以获得数组中的实际列表,然后如果列表不是空的,我就调用ecs.describeContainerInstances({containerInstances: instancesArray})并在里面遍历,寻找我EC2实例的instanceId是否在其中。如果instancesArray是空的,或者没有找到instanceId(而且列表完全迭代),我就用setTimeout循环所有这些。这实际上是在工作,但我想知道是否有更好的方法来做这个?
除非你使用类似terraform或cloudformation的东西:不是真的
mcheshier
mcheshier
发布于 2016-05-14
0 人赞同

你是否尝试过使用用户数据在启动时向你的EC2发送命令?例如,我把下面的用户数据传给我的ECS容器实例,这样它们就会自我更新并附加到一个集群上。

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

如果你不使用自动缩放组,你也可以在这里用名字标记你的实例,等等。

你应该也能在这里运行你自己的代码,然后你的容器实例将在连接到你的集群时准备好。

Shibashis
Shibashis
发布于 2016-05-14
0 人赞同

你应该使用node 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