15

我想根据我存储的 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 为您提供了一种访问实例状态并能够监控任何更改的方法。但是,一个全新实例的状态呢?

4

6 回答 6

33

boto3 有:

instance.wait_until_running()

boto3 文档

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

于 2016-08-12T19:18:17.867 回答
12

v1.6.0 的 AWS CLI 更改日志

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

我没有在文档中看到这一点,但以下内容对我有用:

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

直到 EC2 实例运行,该wait instance-running行才结束。

我不使用 Python/boto/botocore,但假设它有类似的东西。在 Github 上查看waiter.py

于 2014-11-27T02:31:36.133 回答
6

等待 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()

使用这种机制,您将能够在新实例出现时进行轮询。

于 2013-09-27T15:51:29.050 回答
3

根据您尝试执行的操作(以及您计划启动的服务器数量),您可以在 AMI 上安装一个简单的程序/脚本,而不是轮询实例启动事件,该程序/脚本在实例启动时运行一次并发出通知,即 AWS SNS 主题。

需要知道新服务器启动的进程可以订阅这个 SNS 主题,并在每次服务器启动时收到推送通知。

从不同的角度解决相同的问题;你的旅费可能会改变。

于 2013-09-27T16:12:55.960 回答
0

您可以使用 boto3 服务员, https: //boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#waiters

对于这个例子:https ://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Waiter.InstanceRunning

或者在 Java 中https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/ 我确信在所有 AWS sdks 中都实现了服务员。

于 2018-11-19T18:34:43.750 回答
0

去使用 Boto3 的wait_until_running方法:

http://boto3.readthedocs.io/en/latest/reference/services/ec2.html#EC2.Instance.wait_until_running

于 2017-04-12T10:10:33.343 回答