8

我刚刚开始在 Java 中使用 Amazon EC2 API。

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

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

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

提前致谢。看无

4

2 回答 2

9

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

调用执行和响应的最短时间是有限的,因此您需要找到一个在前一个请求完成之前不会触发请求的间隔。或者只是等待响应,然后再等待“n”秒,然后再重新发出呼叫。您也不希望通过快速请求向 AWS API 发送垃圾邮件,即使它们在响应之间是定时的。在我的控制器应用程序中,我将时间间隔设置为 30 秒,发出请求,等待响应,然后从时间间隔中减去经过的时间并休眠那么久。在多线程模型中,我可以同时跟踪许多对象的状态变化,而不会占用我的本地 CPU 或 API。

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

于 2011-10-04T23:28:03.640 回答
-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
}
于 2016-06-05T22:30:33.823 回答