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()
С помощью этого механизма вы сможете опрашивать, когда появится ваш новый экземпляр.
Из журнала изменений 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 и завершите проверку статуса.