Я старался не задавать этот вопрос, но после нескольких часов (или дней) и чтения всех связанных материалов я отчаянно обращаюсь к 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 выберите экземпляр, затем выберите меню «Настройки экземпляра»> «Получить системный журнал», вы можете увидеть, как запускается экземпляр. Вот как я могу определить, выполняется ли мой сценарий запуска в «пользовательских данных».