EC2: ожидание, пока новый экземпляр находится в рабочем состоянии

Я хотел бы создать новый экземпляр на основе моего сохраненного AMI.

Я достигаю этого с помощью следующего кода:

RunInstancesRequest rir = new RunInstancesRequest(imageId,1, 1);
// Code for configuring the settings of the new instance
...
RunInstancesResult runResult = ec2.runInstances(rir);

Однако я не могу найти ожидание для "блокировки" / ожидания, пока экземпляр не будет запущен и работает отдельно от команды Thread.currentThread(). Sleep(xxxx).

С другой стороны, StartInstancesResult и TerminateInstancesResult дают вам возможность получить доступ к состоянию экземпляров и иметь возможность отслеживать любые изменения. Но как насчет состояния совершенно нового экземпляра?

7 ответов

Решение

Ожидание готовности экземпляра EC2 - это обычная модель. В библиотеке Python Бото вы также решаете это с sleep звонки:

   reservation = conn.run_instances([Instance configuration here])
   instance = reservation.instances[0]

   while instance.state != 'running':
       print '...instance is %s' % instance.state
       time.sleep(10)
       instance.update()

С помощью этого механизма вы сможете опрашивать, когда появится ваш новый экземпляр.

boto3 имеет:

instance.wait_until_running()

Из журнала изменений CLI AWS для v1.6.0:

Добавьте подкоманду wait, которая позволяет команде блокироваться, пока ресурс AWS не достигнет заданного состояния ( проблема 992, проблема 985)

Я не вижу этого в документации, но у меня сработало следующее:

aws ec2 start-instances --instance-ids "i-XXXXXXXX"
aws ec2 wait instance-running --instance-ids "i-XXXXXXXX"

wait instance-running линия не завершилась до запуска экземпляра EC2.

Я не использую Python/boto/botocore, но предполагаю, что он имеет что-то похожее. Проверьте waiter.py на Github.

В зависимости от того, что вы пытаетесь сделать (и сколько серверов вы планируете запустить), вместо того, чтобы опрашивать события запуска экземпляра, вы можете установить на AMI простую программу / скрипт, который запускается один раз, когда экземпляр запускается и отправляет уведомление об этом, т. е. в тему AWS SNS.

Процесс, который должен знать о запуске новых серверов, может затем подписаться на эту тему SNS и получать push-уведомления при каждом запуске сервера.

Решает ту же проблему под другим углом; Ваш пробег может варьироваться.

Вы можете использовать официантов boto3, https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html

например: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html

Или в Java https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/ Я уверен, что во всех sdks AWS реализованы официанты.

Перейти использовать Boto3 wait_until_running метод:

http://boto3.readthedocs.io/en/latest/reference/services/ec2.html

Используйте следующий сценарий оболочки с помощью AWS CLI, чтобы дождаться запуска экземпляра и успешно завершить проверку состояния:

      timeout=600  # Timeout in seconds
start_time=$(date +%s)

until [ "$(aws ec2 describe-instance-status --instance-id ${INSTANCE_ID} --query 'InstanceStatuses[0].InstanceStatus.Status' --output text)" = "ok" ] && \
      [ "$(aws ec2 describe-instance-status --instance-id ${INSTANCE_ID} --query 'InstanceStatuses[0].SystemStatus.Status' --output text)" = "ok" ] && \
      [ "$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[0].Instances[0].State.Name' --output text)" = "running" ]; do
  current_time=$(date +%s)
  elapsed_time=$((current_time - start_time))

  if [ "$elapsed_time" -ge "$timeout" ]; then
    echo "Timeout reached. Instance didn't reach the desired state within $timeout seconds."
    exit 1
  fi

  sleep 5
  echo "Waiting for instance to be running and complete status checks..."
done

echo "Instance is now running fine and status checks have been completed!"

Примечание:${INSTANCE_ID}— идентификатор экземпляра AWS EC2.

Ссылка: дождитесь запуска экземпляра AWS EC2 и завершите проверку статуса.

Другие вопросы по тегам