等待EC2实例启动

时间:2016-08-10 04:35:11

标签: scala amazon-web-services amazon-ec2 aws-sdk aws-java-sdk

我有自定义AMI来运行我的服务。使用AWS Java SDK,我使用AMI中的RunInstancesRequest创建EC2实例。在我开始使用我的服务之前,我必须确保新创建的实例已启动并运行。我使用以下方法轮询实例:

var transitionCompleted = false
while (!transitionCompleted) {
  val currentState = instance.getState.getName
  if (currentState == desiredState) {
    transitionCompleted = true
  }
  if(!transitionCompleted) {
    try {
      Thread.sleep(TRANSITION_INTERVAL)
    } catch {
      case e: InterruptedException => e.printStackTrace()
    }
  }
}

因此,当实例的currentState变为desiredStaterunning)时,我会获得实例准备就绪的状态。但是,任何新创建的实例,尽管处于running状态,都无法立即使用,因为它仍在初始化。

如何确保仅在我能够访问实例及其服务时才返回?是否有任何具体的状态检查?

PS:我使用Scala

1 个答案:

答案 0 :(得分:2)

您正在检查实例state,而您实际感兴趣的是实例status检查。您可以使用Amazon Java SDK中的describeInstanceStatus方法,但不是实现自己的轮询(在非惯用的Scala中),最好使用SDK中的现成解决方案:{{3} }。

import com.amazonaws.services.ec2._, model._, waiters._

val ec2client: AmazonEC2 = ...

val request = new DescribeInstanceStatusRequest().withInstanceIds(instanceID)

ec2client.waiters.instanceStatusOk.run(
  new WaiterParameters()
    .withRequest(request)
    // Optionally, you can tune the PollingStrategy:
    // .withPollingStrategy(...)
  )
)

要自定义轮询延迟并重试服务员的策略,请检查EC2 waiters文档。