我刚刚开始在 Java 中使用 Amazon EC2 API。
我使用 ec2.runInstances(runInstancesRequest); 创建了实例
但启动实例需要一些时间(通常为 1-2 分钟)。我需要通过 Java EC2 API 获取机器的公共 DNS。
我如何知道实例何时从“待处理”状态变为“已处理”状态,以及如何通过 EC2 API 获取 EC2 实例的公共 DNS。
提前致谢。看无
我刚刚开始在 Java 中使用 Amazon EC2 API。
我使用 ec2.runInstances(runInstancesRequest); 创建了实例
但启动实例需要一些时间(通常为 1-2 分钟)。我需要通过 Java EC2 API 获取机器的公共 DNS。
我如何知道实例何时从“待处理”状态变为“已处理”状态,以及如何通过 EC2 API 获取 EC2 实例的公共 DNS。
提前致谢。看无
当 EC2 对象更改状态时,SDK 不会发出事件模型或其他信号来告诉您 - 唯一的方法是在对象上重复发出 DescribeXXXXXXXX 调用,例如每 30 秒一次,直到状态字段更改。
调用执行和响应的最短时间是有限的,因此您需要找到一个在前一个请求完成之前不会触发请求的间隔。或者只是等待响应,然后再等待“n”秒,然后再重新发出呼叫。您也不希望通过快速请求向 AWS API 发送垃圾邮件,即使它们在响应之间是定时的。在我的控制器应用程序中,我将时间间隔设置为 30 秒,发出请求,等待响应,然后从时间间隔中减去经过的时间并休眠那么久。在多线程模型中,我可以同时跟踪许多对象的状态变化,而不会占用我的本地 CPU 或 API。
一旦检测到状态变化(并假设新状态是您所期望的 - 不要忘记处理故障模式),您可以获得各种各样的描述性信息,包括公共 DNS 地址(在实例对象的情况下)来自 API 响应对象中返回的结构。
实际上,您可以通过 POLL 来了解实例的状态。这是一些执行此操作的 Bash 代码,只需将其调整为 JAVA。您可能在 Java SDK 中有一个类似的命令,这样您就不必从 Java 执行 Bash。命令“ec2-describe-instances”来自Amazon AWS CLI。我会启动函数或方法来等待运行状态以测试实例是否“挂起”,如果它没有开始或“挂起”则失败。然后记录时间,并给它一个最大值,比如说 3 分钟,然后在循环中不断轮询“运行”状态,检查 3 分钟的限制。返回调用点,以“未启动”、“超出启动时间”或“正在运行”中的先到者为准。
setInstanceStatus () {
instanceStatus=`ec2-describe-instances $INSTANCE_ID -C $CERTIFICATE_FILE -K $PRIVATE_KEY --region $REGION -U $AWS_URL`
is_pending="`echo $instanceStatus|grep -c " pending "`"
is_running="`echo $instanceStatus|grep -c " running "`"
is_shutting_down="`echo $instanceStatus|grep -c " shutting-down "`"
is_terminated="`echo $instanceStatus|grep -c " terminated "`"
is_stopping="`echo $instanceStatus|grep -c " stopping "`"
is_stopped="`echo $instanceStatus|grep -c " stopped "`"
if [ "$is_pending" -eq "1" ]; then
status="pending"
elif [ "$is_running" -eq "1" ]; then
status="running"
elif [ "$is_shutting_down" -eq "1" ]; then
status="shutting-down"
elif [ "$is_terminated" -eq "1" ]; then
status="terminated"
elif [ "$is_stopping" -eq "1" ]; then
status="stopping"
elif [ "$is_stopped" -eq "1" ]; then
status="stopped"
else
status="bad-instance-state"
fi
}