Подтвердить что ты не робот

Как проверить статус данных пользователя при запуске экземпляра в aws

Я пытаюсь запустить экземпляр aws с данными пользователя. Мои данные пользователя - это процесс установки сервера, и я должен проверить, правильно ли выполняются сценарии пользовательских данных. Есть ли возможность проверить, завершен ли статус данных пользователя? Мне нужно знать статус, поскольку с этого запущенного экземпляра я беру другое изображение. Как сейчас, я явно использовал time.sleep(90) для моего завершения процесса.

Примечание: Я использую библиотеку Boto.

Любое решение по этому вопросу будет принята с благодарностью!

4b9b3361

Ответ 1

UPDATE

Что я приземлился, так это создание файла маркера в конце запуска пользовательских данных. У меня был контроллер node, который запускал один сеанс ssh на ec2 node и запускал простой цикл ожидания ожидания как команду на другом конце, поэтому он возвращается только после создания файла. Затем я просто жду() для всех сеансов ssh для выхода или до истечения времени ожидания ожидания.

Это некрасиво, но оно работает. Это очень расстраивает то, что EC2 не обеспечивает более качественные возможности для сигнализации статуса изнутри экземпляров.

Ярлыки

Один из возможных подходов заключается в том, чтобы пользовательские данные экземпляра script добавляли дополнительную метку в экземпляр, когда он завершается. Вы можете опросить экземпляр с помощью update или описать экземпляры с фильтром, который включает только узлы с тегом, который вы используете, чтобы указать, что данные пользователя были обновлены.

Это требует, чтобы вы добавляли ограниченный ключ API и секрет в свои скрипты пользовательских данных при их отправке. Не используйте свой обычный ключ api и секрет, сделайте один с очень ограниченными правами IAM. Кроме того, пользовательские данные script, вероятно, захотят удалить свое "я", когда это будет сделано.

SNS/SQS

Я также рассмотрел возможность использования Simple Notification Service и/или SQS для этого, но это похоже на чрезмерный.

Как и теги настроек, для экземпляра требуются собственные учетные данные EC2.

SNS - только push-only, поэтому вы должны иметь конечную точку, доступную для EC2. Это боль. SQS является тягой, но не имеет маршрутизации сообщений, поэтому вам нужна одна очередь на набор узлов, которые вы поднимаете. Вы должны передать уникальное имя очереди в экземпляр или использовать экземпляр EC2 для запроса его из тега, а затем использовать экземпляр этой конкретной очереди.

Итак, да, боль.

Консоль

Получение вывода консоли не будет работать, EC2 перестанет обновлять его вскоре после перехода экземпляра в состояние "running".

Как ни странно, экземпляры или клиентские стороны не могут принудительно обновлять.

Файл маркера

Когда заканчивается cloud-init script, он может touch помещать файл-маркер где-нибудь в оболочку для обычного пользователя. Это немного раздражает, так как это требует ssh'ing в каждом node, а затем опроса для создания файла маркера. Боль опроса может быть несколько уменьшена за счет использования петли типа:

while ! test -e 'cloud-init-complete'
do
    inotifywait -qq -t 2 -e create -e moved_to . ||true
done

после установки пакета inotify-tools. Если вы не сжигаете inotify-tools в своих AMI, вы захотите заменить inotifywait на простой sleep и принять дополнительную задержку или выполнить:

while ! test -e 'cloud-init-complete'
do
    if test -x /usr/bin/inotifywait; then
        inotifywait -qq -t 2 -e create -e moved_to . ||true
    else
        sleep 2
    fi
done

Это все равно требует подключения ssh к каждому серверу, и это боль для мониторинга и опроса.

Что-то умнее?

Решение моей мечты может отправить дополнительный запрос в службу метаданных EC2, чтобы установить специальный тег экземпляра или настраиваемое дополнительное поле статуса.

Ответ 3

Вы используете инструменты API EC2 и выводите данные пользовательских данных или просто проверяете ec2-get-console-output. Обратитесь к этой статье: http://alestic.com/2010/12/ec2-user-data-output

Извините, не уверен в Boto

В ваших пользовательских данных script вы регистрируете результат в лог файл. После запуска экземпляра вы проверяете файл.

Ответ 4

Если вы используете Amazon Linux, вы можете использовать chkconfig script в /etc/init.d с директивой Required-Start:

#!/bin/bash
# chkconfig:   345 95 95
# description: Description

### BEGIN INIT INFO
# Provides: userdatainit
# Description: Wait for user data
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Required-Start: cloud-init
# Required-Stop:
### END INIT INFO

case "$1" in
  start)
    echo "Do work here, will happen -after- UserData script/config."
    ;;
  stop)
    ;;
  *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac

exit 0

Если вы сохранили это как файл типа /etc/init.d/afteruserdata, зарегистрируйте его так:

chown root:root /etc/init.d/afteruserdata
chmod 755 /etc/init.d/afteruserdata
chkconfig --add afteruserdata
chkconfig --level 345 afteruserdata on 

Затем вы можете создать AMI, и ваш код будет запущен после UserData script.

Предостережение: cloud-init выполняет свою работу только при первом запуске экземпляра из AMI.