我有一个运行我的服务的自定义AMI。使用AWS Java SDK,我使用RunInstancesRequest
AMI创建了一个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
您正在检查实例状态,而您真正感兴趣的是实例状态检查。您可以使用describeInstanceStatus
Amazon 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
文档。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句