5

我有一个运行我的服务的自定义 AMI。使用 AWS Java 开发工具包,我使用RunInstancesRequestAMI 创建了一个 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实例变为desiredState(即running)时,我得到实例准备就绪的状态。然而,任何新创建的实例,尽管处于running状态,但仍无法立即使用,因为它仍在初始化。

如何确保仅在能够访问实例及其服务时才返回?是否需要进行任何特定的状态检查?

PS:我使用 Scala

4

1 回答 1

4

您正在检查实例状态,而您真正感兴趣的是实例状态检查。您可以使用describeInstanceStatusAmazon Java SDK 中的方法,但与其实现自己的轮询(在非惯用的 Scala 中),不如使用 SDK 中的现成解决方案:EC2 waiters

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(...)
  )
)

要自定义服务员的轮询延迟和重试策略,请查看PollingStrategy文档。

于 2016-10-25T14:12:57.340 回答