EC2: 等待新实例进入运行状态

16

我希望创建一个基于我已存储的AMI的新实例。

我通过以下代码实现:

RunInstancesRequest rir = new RunInstancesRequest(imageId,1, 1);
// Code for configuring the settings of the new instance
...
RunInstancesResult runResult = ec2.runInstances(rir);

然而,除了Thread.currentThread().sleep(xxxx)命令之外,我找不到“阻止”/等待实例运行的方法。

另一方面,StartInstancesResult和TerminateInstancesResult为您提供了一种访问实例状态并能够监视任何更改的方法。但是,对于全新实例的状态呢?

7个回答

34
instance.wait_until_running()

来自boto3文档:

等待此实例运行。此方法调用 EC2.Waiter.instance_running.wait() ,该方法每15秒轮询一次 EC2.Client.describe_instances() 直到达到成功的状态,如果失败40次则返回错误。


12

根据AWS CLI v1.6.0的更改日志

添加了等待子命令,允许命令阻塞,直到AWS资源达到给定状态(问题992问题985

我没有在文档中找到这个功能的提及,但以下方法对我有效:

aws ec2 start-instances --instance-ids "i-XXXXXXXX"
aws ec2 wait instance-running --instance-ids "i-XXXXXXXX"

wait instance-running这一行直到EC2实例运行起来之前都没有完成。

我没有使用Python/boto/botocore,但是假设它们有类似的东西。可以查看Github上的waiter.py


7

等待EC2实例准备就绪是一种常见的模式。在Python库boto中,您也可以使用sleep调用来解决这个问题:

   reservation = conn.run_instances([Instance configuration here])
   instance = reservation.instances[0]

   while instance.state != 'running':
       print '...instance is %s' % instance.state
       time.sleep(10)
       instance.update()

通过这种机制,您将能够轮询新实例启动的时间。

1
我没有意识到有一个更新方法。知道这点非常好。谢谢。然而,当前最佳解决方案是@Zags的instance.wait_until_running() - Bruno Bronosky
@BrunoBronosky 这取决于您的目标。我需要等待实例运行并通过状态检查。基于此,您不能使用Zags的解决方案,因为这将几乎立即解决。 - tyron
1
更新:如果使用boto3运行上述循环,则应该使用instance.load()而不是instance.update()。 - Ruben Ramirez Padron

3

根据您所需求的内容(以及您计划启动的服务器数量),与其轮询实例启动事件,不妨在AMI 上安装一个简单的程序/脚本,该程序/脚本在实例启动时运行一次并发送通知,即发送到 AWS SNS 主题。

需要了解新服务器启动的进程可以订阅此SNS主题,并且每次服务器启动时都会收到推送通知。

从不同角度解决相同的问题;效果因人而异。


0

1
我已经尝试过这个,虽然它确实等待了一段时间,但我要等大约10秒到60秒之后才能SSH到该实例。 - hum3


0
使用以下的shell脚本,利用AWS CLI等待实例运行并成功完成状态检查:
timeout=600  # Timeout in seconds
start_time=$(date +%s)

until [ "$(aws ec2 describe-instance-status --instance-id ${INSTANCE_ID} --query 'InstanceStatuses[0].InstanceStatus.Status' --output text)" = "ok" ] && \
      [ "$(aws ec2 describe-instance-status --instance-id ${INSTANCE_ID} --query 'InstanceStatuses[0].SystemStatus.Status' --output text)" = "ok" ] && \
      [ "$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[0].Instances[0].State.Name' --output text)" = "running" ]; do
  current_time=$(date +%s)
  elapsed_time=$((current_time - start_time))

  if [ "$elapsed_time" -ge "$timeout" ]; then
    echo "Timeout reached. Instance didn't reach the desired state within $timeout seconds."
    exit 1
  fi

  sleep 5
  echo "Waiting for instance to be running and complete status checks..."
done

echo "Instance is now running fine and status checks have been completed!"

注意:${INSTANCE_ID} 是 AWS EC2 实例的 ID。
参考:等待 AWS EC2 实例运行并完成状态检查

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接