EC2 Java Api Подождите, пока не будет создан экземпляр Ec2. - PullRequest
8 голосов
/ 04 октября 2011

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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 05 октября 2011

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

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

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

0 голосов
/ 06 июня 2016

На самом деле, вы можете опрашивать, чтобы узнать состояние экземпляра. Вот код Bash для этого, просто адаптируйте его для JAVA. Вы МОЖЕТЕ иметь подобную команду в Java SDK, чтобы вам не приходилось выполнять Bash из Java. Команда 'ec2-description-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
}
...