EC2 Java Api Подождите, пока не будет создан экземпляр Ec2.

Я только начал использовать Amazon EC2 API в Java.

Я создал экземпляры, используя ec2.runInstances(runInstancesRequest);

Но запуск экземпляра займет некоторое время (обычно 1-2 минуты). Мне нужно получить общедоступный DNS машины через Java EC2 API.

Как узнать, когда экземпляры переходят из состояния «ожидание» в состояние «обработано», и как получить общедоступный DNS экземпляра EC2 через API EC2.

Заранее спасибо. Канна


person kanap008    schedule 04.10.2011    source источник
comment
Обратите внимание, что у пользователей оболочки есть аналогичный вопрос stackoverflow.com/questions/2644742/, и ответ тот же, вам нужно опросить (повторно протестировать).   -  person bortzmeyer    schedule 13.10.2011


Ответы (2)


SDK не использует модель событий или другой сигнал, сообщающий вам об изменении состояния объекта EC2. Единственный способ выяснить это — повторять вызов DescribeXXXXXXXX для объекта, скажем, каждые 30 секунд, пока не произойдет изменение состояния. поле состояния изменяется.

Существует конечное минимальное время для выполнения вызова и ответа, поэтому вам нужно найти интервал, который не запускает запросы до завершения предыдущего. Или просто подождите ответа, а затем подождите еще n секунд, прежде чем повторить вызов. Вы также не хотите спамить API AWS быстрыми запросами, даже если они рассчитаны между ответами. В моем приложении контроллера я устанавливаю интервал в 30 секунд, выдаю запрос, жду ответа, а затем вычитаю прошедшее время из интервала и сплю так долго. Таким образом, в многопоточной модели я могу отслеживать изменения состояния многих объектов одновременно, не перегружая ни свой локальный процессор, ни API.

Как только изменение состояния было обнаружено (и предполагая, что новое состояние соответствует вашим ожиданиям — не забудьте обработать режимы сбоя), вы можете получить широкий спектр описательной информации, включая общедоступный DNS-адрес (в случае объектов экземпляра). из структуры, возвращаемой в объекте ответа API.

person Eight-Bit Guru    schedule 04.10.2011
comment
спасибо @Jonners. Я смог заставить его работать. Спасибо за вашу помощь. - person kanap008; 05.10.2011

На самом деле, вы можете ОПРОСИТЬ, чтобы узнать статус экземпляра. Вот некоторый код Bash для этого, просто адаптируйте его к JAVA. У вас МОЖЕТ быть аналогичная команда в Java SDK, чтобы вам не приходилось выполнять Bash из Java. Команда ec2-describe-instances поступает из Amazon. Интерфейс командной строки AWS. Я бы запустил функцию или метод, чтобы дождаться рабочего состояния, чтобы проверить, находится ли экземпляр «в ожидании», и потерпеть неудачу, если он не запускается или «ожидает». Затем запишите время и дайте ему максимум, скажем, 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
}
person Dennis    schedule 05.06.2016