我有一个运行我的服务的自定义 AMI。使用 AWS Java SDK,我使用 RunInstancesRequest
创建了一个 EC2 实例来自 AMI。现在,在我开始使用我的服务之前,我必须确保新创建的实例已启动并正在运行。我使用以下方法轮询实例:
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
最佳答案
您正在查看实例 state ,而您真正感兴趣的是实例 status检查。您可以使用 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(...)
)
)
自定义waiter的轮询延迟和重试策略查看
PollingStrategy
文档。
关于scala - 等待 EC2 实例启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38864331/