Как я могу устранить неполадки в балансировщике нагрузки приложений AWS, выдавшей 504, в то время как инстанс EC2, стоящий за ним, выдает 200?

У меня есть экземпляр EC2 с несколькими успешно развернутыми на нем приложениями, которые прослушивают соединения на портах 3000/3001/3002. Я могу правильно загрузить с него веб-страницу, подключившись к его общедоступному DNS или общедоступному IP-адресу на данном порту. Т.е. curl http://<ec2-ip-address>:3000 работает. Итак, я знаю, что приложения работают, и я знаю, что привязки портов / правила брандмауэра / группы безопасности EC2 настроены правильно для получения подключений из внешнего мира.

У меня также есть балансировщик нагрузки приложений, который должен направлять трафик в 3 приложения в зависимости от имени хоста, но он всегда дает мне «504 тайм-аут шлюза». Я проверил все настройки, но не вижу, что не так, и я не совсем уверен, как это исправить.

  • ALB имеет один прослушиватель HTTPS / 443 с сертификатом, действительным для mydomain.com, app1.mydomain.com, app2.mydomain.com, app2.mydomain.com.
  • The listener has 3 rules, plus the default rule:
    1. Host == app1.mydomain.com => app1-target-group
    2. Хост == app2.mydomain.com => app2-target-group
    3. Хост == app3.mydomain.com => app3-target-group
    4. Действие по умолчанию (последнее средство) => default-target-group
  • Each target group contains only the single EC2 instance, over HTTP, with the following ports:
    1. app1-target-group: 3000
    2. app2-target-group: 3001
    3. app3-target-group: 3002
    4. default-target-group: 3000

Учитывая, что я могу получить доступ к приложению напрямую, я уверен, что проблема в том, как я настроил группы ALB / listener / target. Но 504 не дает мне много возможностей для продолжения.

Я попытался включить журналы доступа к ведру S3, но похоже, что он ничего там не пишет. Есть единственный объект с именем ELBAccessLogTestFile, а в корзине нет реальных журналов.

РЕДАКТИРОВАТЬ: Дополнительная информация ... У меня действительно установлен nginx на экземпляре EC2, где я ранее выполнял завершение SSL и сопоставление / маршрутизацию имени хоста и порта. Если я изменю default-target-group выше, чтобы он указывал на порт 443 по HTTPS, то он работает!

Так почему-то маршрутизация трафика - от ALB к инстансу EC2 по HTTPS на порт 443 -> ОК! - от ALB к экземпляру EC2 через HTTP на порт 3000 -> Сломано!

Но опять же, я могу подключиться к экземпляру напрямую по HTTP / 3000 со своего ноутбука.


person Cam Jackson    schedule 31.10.2017    source источник
comment
Можете ли вы опубликовать настройки группы безопасности вашего экземпляра EC2? Тот факт, что он доступен через ваше Интернет-соединение, не обязательно означает, что он доступен из Load Balancer, который будет устанавливать внутреннее сетевое соединение VPC.   -  person Mark B    schedule 31.10.2017
comment
В настоящий момент ALB и экземпляр EC2 находятся в одной группе безопасности, которая имеет вход для портов 22, 80, 443 и 2376 и выход для портов 80, 443 и 53, все на 0.0.0.0/0. Я попытался временно добавить вход на 3000, чисто для тестирования с моего ноутбука. Я предположил, что вход 3000 не потребуется для связи ALB- ›EC2, если они находятся в одной группе безопасности. Это не так? Даже с входом 3000 ALB все равно выдает 504.   -  person Cam Jackson    schedule 31.10.2017
comment
Находиться в одной группе безопасности совершенно неуместно (и на самом деле не рекомендуется). Это вообще не дает никакого особого доступа. Вам нужно открыть порт 3000 в группе безопасности. Если вы не хотите, чтобы он был общедоступным, используйте идентификатор группы безопасности в поле источника.   -  person Mark B    schedule 31.10.2017
comment
Да, я не собираюсь оставлять их в одной группе безопасности, это было просто временное состояние, пока я все меняю. Думаю, теперь я знаю, почему это работает. Я добавил вход 3000 во время тестирования, что позволило получить доступ с моего ноутбука, но я не добавил выход 300, что, как я полагаю, означает, что ALB не может выйти на 3000, даже для доступа к чему-то в той же группе на 3000 Я попробую это сейчас.   -  person Cam Jackson    schedule 31.10.2017
comment
Почему вы вообще определяете правила выхода? По умолчанию исходящий трафик полностью открыт, чтобы сервер мог устанавливать необходимые исходящие соединения как для ответа на запросы, так и для загрузки обновлений сервера и т. Д.   -  person Mark B    schedule 31.10.2017
comment
Я использую terraform для определения своих групп безопасности, а terraform удаляет это значение по умолчанию, разрешающее весь исходящий трафик, поэтому вам нужно определить любой исход, который вам нужен. Я решил специально разрешить выход на 80/443/53, а не добавлять обратно правило разрешения всех исходов. В любом случае теперь работает! Ура! Если вы хотите добавить в качестве ответа свою точку зрения о том, что правила группы безопасности должны специально разрешать вход / выход для сообщений в группе безопасности, я с радостью приму это как решение :)   -  person Cam Jackson    schedule 31.10.2017


Ответы (1)


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

person Mark B    schedule 31.10.2017