2011-10-04 38 views
8

我刚开始在Java中使用Amazon EC2 API。EC2 Java Api等到Ec2实例被创建。

我已经使用ec2.runInstances(runInstancesRequest)创建了实例;

但实例启动需要一段时间(通常为1-2分钟)。 我需要通过Java EC2 API获取机器的公共DNS。

如何知道实例何时从“挂起”状态变为“已处理”状态,以及如何通过EC2 API获取EC2实例的公共DNS。

在此先感谢。 Kanna

+0

请注意,对于shell用户http://stackoverflow.com/questions/2644742/getting-id-of-an-instance-newly-launched-with-ec2-api-tools类似的问题答案是一样的,你必须轮询(重复测试)。 – bortzmeyer

回答

9

SDK没有提供任何事件模型或其他信号来告诉您EC2对象何时改变状态 - 找出的唯一方法是在对象上重复发出DescribeXXXXXXXX调用,例如一次每30秒,直到状态字段改变。

调用执行和响应有一个有限的最短时间,所以你需要找到一个间隔,在先前调用完成之前不会触发请求。或者等待响应,然后等待另一个'n'秒后再重新发出呼叫。您也不希望通过快速请求来发送AWS API垃圾邮件,即使它们在响应之间计时。在我的控制器应用程序中,我将间隔设置为30秒,发出请求,等待响应,然后从时间间隔中减去已用时间,然后长时间休眠。在多线程模型中,我可以同时跟踪许多对象的状态更改,而无需淹没本地CPU或API。

一旦检测到状态改变(并且假设新状态是您期望的 - 不要忘记处理失败模式),您可以获得各种各样的描述性信息,包括公共DNS地址(在这种情况下实例对象)从API响应对象中返回的结构中删除。

+0

谢谢@Jonners。我能够使它工作。谢谢你的帮助。 – kanap008

-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 
}