我有自定义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
变为desiredState
(running
)时,我会获得实例准备就绪的状态。但是,任何新创建的实例,尽管处于running
状态,都无法立即使用,因为它仍在初始化。
如何确保仅在我能够访问实例及其服务时才返回?是否有任何具体的状态检查?
PS:我使用Scala
答案 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文档。