Ответ 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, чтобы установить специальный тег экземпляра или настраиваемое дополнительное поле статуса.