我刚开始在Java中使用Amazon EC2 API。
我使用ec2.runInstances(runInstancesRequest);
创建了实例但实例启动需要一些时间(通常为1-2分钟)。 我需要通过Java EC2 API获取机器的公共DNS。
如何知道实例何时从“待处理”状态变为“已处理”状态,以及如何通过EC2 API获取EC2实例的公共DNS。
提前致谢。 看那
答案 0 :(得分:9)
SDK没有提出事件模型或其他信号来告诉你EC2对象何时改变状态 - 找出的唯一方法是重复发出对象的DescribeXXXXXXXX调用,比如每30秒一次,直到状态字段改变。
执行和响应调用的最短时间是有限的,因此您需要找到一个在前一个请求完成之前不会触发请求的时间间隔。或者只是等待响应,然后等待另一个'n'秒再重新发出呼叫。您也不希望使用快速请求向AWS API发送垃圾邮件,即使它们在响应之间进行了定时。在我的控制器应用程序中,我将间隔设置为30秒,发出请求,等待响应,然后从间隔中减去经过的时间并长时间休眠。在多线程模型中,我可以同时跟踪许多对象的状态更改,而不会淹没我的本地CPU或API。
一旦检测到状态发生变化(并假设新状态是您所期望的 - 不要忘记处理故障模式),您可以获得各种描述性信息,包括公共DNS地址(在实例对象)来自API响应对象中返回的结构。
答案 1 :(得分:-1)
实际上,您可以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
}