Почему экземпляры AWS Classic Load Balancer являются OutOfService, а группа автоматического масштабирования показывает InService и исправен? - PullRequest
1 голос
/ 21 мая 2019

Я старался не задавать этот вопрос, но после нескольких часов (или дней) и чтения всех связанных материалов я отчаянно обращаюсь к SO.

Итак, я пытаюсь развернуть проект узла / реагирования в AWS с помощью (классической) системы балансировки нагрузки и автоматического масштабирования. У меня все отдельные части работают. Каким-то образом экземпляры в балансировщике нагрузки всегда показывают OutOfService, хотя в группе автоматического масштабирования этими экземплярами являются InService и Healty. Почему это отключить?

Затем я добавил эластичный IP в один из экземпляров. Я ssh'd к нему, а затем запустил «npm start» вручную. Теперь этот экземпляр показывает InService и Healthy в балансировщике нагрузки.

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

#!/bin/bash
cd /home/ec2-user/projectname
npm start

Почему бы и нет?

Некоторые обновления:

Я включил журнал доступа для этого балансировщика и получил много (одинаковых) журналов ошибок. Вот один из них:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>BC0FA4BB97BA1557</RequestId>
    <HostId>r3wBXZLxJkTzm/SqcQnxEO+f9DhbtCxTLcVAn1vmllj6Dwa0xlO2psP3eEKOiuvNWY/Yb+Gt4C0=</HostId>
</Error>

Это не очень полезно для меня, чтобы выяснить, где проблема. Еще более запутанным является то, что я также получаю такой журнал ошибок, когда экземпляр запускается вручную и работает, а состояние экземпляра в LB исправно.

Что отказано? проверка здоровья? Кто проверка здоровья? Это моя проверка здоровья в балансире:

Ping Target   HTTP:3000/
Timeout     5 seconds
Interval    30 seconds
Unhealthy threshold     2
Healthy threshold   10

Приемник имеет HTTP 80 в качестве порта балансировки нагрузки и 3000 в качестве порта экземпляра.

ОБНОВЛЕНИЕ снова:

Мне кажется, что настоящая причина проблемы в том, что скрипт запуска не запускался. Я нашел несколько предложений по этой проблеме, таких как очистка папки / var / lib / cloud или добавление # cloud-boothook в начало сценария запуска, но у меня ничего не работает.

ОБНОВЛЕНИЕ (3):

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

Во-первых, мне удалось проследить видео Райана Льюиса PluralSight и заставить его работать как положено: развертывание на AWS с балансировкой нагрузки и автоматическим масштабированием. Мой проект очень близок к его проекту "pizza-luvrs", за исключением того, что я использую интерфейс React и MongoDB. Однако по какой-то причине я не могу заставить его работать на свой собственный проект.

Моя цель состояла в том, чтобы балансировщики нагрузки работали вместе с группой автоматического масштабирования с использованием предварительно созданного AMI (с установленным узлом, pm2 и моим проектом). Используя приведенный ниже скрипт запуска с pm2, я запустил сервер с портом 3000.

#!/bin/bash
echo "starting xxx..."
# restart pm2 and thus node app on reboot
crontab -l | { cat; echo "@reboot sudo pm2 start /home/ec2-user/xxx/server.js -i 0"; } | crontab -
# start the server on port 3000
pm2 start /home/ec2-user/xxx/server.js -i 0
echo "xxx started."

Однако экземпляры в балансировщике нагрузки продолжают говорить «OutOfService», хотя экземпляры в группе автоматического масштабирования всегда показывают InService. Самым странным является то, что после того, как я присоединяю Elastic IP (потому что мой экземпляр автоматического масштабирования является частным) и SSH'd к экземпляру, и ничего не делая, он в конечном итоге становится InService (не всегда). Затем я могу отключить Elastic IP, и он сохраняет статус InService. Похоже, что причиной этой проблемы может быть группа безопасности, поэтому я тысячу раз сравнил это с проектом «pizza-luvrs» и убедился, что у них точно такая же настройка. Тем не менее, это работает для его проекта, но не для моего.

Кстати, в представлении экземпляров AWS выберите экземпляр, затем выберите меню «Настройки экземпляра»> «Получить системный журнал», вы можете увидеть, как запускается экземпляр. Вот как я могу определить, выполняется ли мой сценарий запуска в «пользовательских данных».

1 Ответ

0 голосов
/ 23 мая 2019

То, что вы вводите в пользовательских данных, выполняется один раз, при первой загрузке , вот и все.Он предназначен для настройки экземпляра при первом запуске.При последующих запусках он не запустится.если вы хотите запланировать запуск сценария при загрузке, посмотрите, как это сделать на любой операционной системе, которую вы используете.

Предполагая, что вы используете какую-то форму Linux, в которой используется systemd, который является наиболее популярным выбором, здесь

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

...