Назад | Перейти на главную страницу

Проблема с закреплением сеанса AWS ELB, когда в одном запросе существует несколько файлов cookie AWSELB

У меня есть два веб-приложения - App-A и App-B - работающих в двух экземплярах EC2 (оба веб-приложения работают в обоих экземплярах), подключенных к AWS ELB. Привязанность сеанса включается с помощью параметра «Прикрепление файлов cookie, созданных приложением», а для файла cookie устанавливается значение «JSESSIONID».

Ниже приводится сценарий:

1) Пользователь сначала пытается получить доступ к App-B. Запрос отправляется на узел A, и приложение создает JSESSIONID с путем "/ appb /", а ELB создает файл cookie AWSELB для того же пути.

Заголовки set-cookie, поступающие в браузер:

Set-Cookie: JSESSIONID=8629A2C6FA26A99678599B0868511610; Path=/appb/; Secure; HttpOnly
Set-Cookie: AWSELB=B321B10B128ADF1E237E8419717E1CC409A63A5C6B3EA2E2C6CEE56E4F76FCE48DFDA95F1F20ED1ADEED570326993D2492C17C070ED41500F3EDC7EB993ED53188BF73D37301213483075952D1ADAD619C3C890672;PATH=/appb/;SECURE;HTTPONLY

2) Затем пользователь пытается получить доступ к App-A. Запрос отправляется на узел B, и приложение создает JSESSIONID с путем "/", а ELB создает файл cookie AWSELB для того же пути.

Заголовки set-cookie, поступающие в браузер:

Set-Cookie: JSESSIONID=5DA3507629D0CB34DE1B032FA71D1CB2; Path=/; Secure; HttpOnly
Set-Cookie: AWSELB=B321B10B128ADF1E237E8419717E1CC409A63A5C6BC5080020E5701A0FB3756B152B401A70BF4CA755D30D9B06C82E5C1EB2E81E99C160A62D108BDB79947DEF2E2421C11C513C2C7452FA63B46EE8DF693FB5ED03;PATH=/;SECURE;HTTPONLY

3) Теперь пользователь снова пытается получить доступ к App-B. Браузер отправляет ему файлы cookie JSESSIONID и 2 файла cookie AWSELB, потому что файлы cookie App-A создаются для "/". Насколько мне известно, cookie для корневого контекста следует отправлять во все другие веб-контексты в том же домене.

Ниже приведен заголовок файла cookie, отправляемый в приложение B:

Cookie: JSESSIONID=8629A2C6FA26A99678599B0868511610; AWSELB=B321B10B128ADF1E237E8419717E1CC409A63A5C6B3EA2E2C6CEE56E4F76FCE48DFDA95F1F20ED1ADEED570326993D2492C17C070ED41500F3EDC7EB993ED53188BF73D37301213483075952D1ADAD619C3C890672; JSESSIONID=5DA3507629D0CB34DE1B032FA71D1CB2; AWSELB=B321B10B128ADF1E237E8419717E1CC409A63A5C6BC5080020E5701A0FB3756B152B401A70BF4CA755D30D9B06C82E5C1EB2E81E99C160A62D108BDB79947DEF2E2421C11C513C2C7452FA63B46EE8DF693FB5ED03

В этом сценарии у меня возникают проблемы с привязкой к сеансу, когда последовательные запросы браузера для App-B отправляются на оба узла, а не только на узел-A.

Мне любопытно, как AWS ELB управляет липкостью сеанса в такой ситуации. На основании чего выбирается 1 файл cookie AWSELB из 2? Мне не хватает какой-то конфигурации в ELB?

Заранее спасибо.

Это просто, по правилам и стандартной практике вам нужно использовать ELB для одного приложения (но ничто не мешает вам использовать несколько приложений из ELB).

Решение Вам нужно использовать 2 ELB для 2 разных приложений

  • Пояснение:

Цель ELB - не просто распределить нагрузку на разные узлы, но и поддерживать доступность и масштабирование (с серверами с высокой доступностью).

Чтобы добиться доступности, вам необходимо предоставить стратегию проверки работоспособности, которая будет отмечать узел Не работает если недоступен. Если вы собираетесь использовать один ELB для нескольких приложений, какую проверку работоспособности вы бы предоставили? Что в основном нарушило бы цель высокой доступности.

Таким образом, вам нужно создать отдельные ELB для каждого приложения. что решит вашу проблему с обычным файлом cookie AWLELB. Поскольку у обоих будут разные файлы cookie AWSELB, которые будут общаться с разными ELB.

BTW AWS ELB не оптимизированы для выполнения множества подобных задач. Подробнее об этом читайте в https://www.linkedin.com/pulse/key-benefits-limitation-aws-elb-admin-cloudfoqus

--- Amazon ELB блокирует запрос, когда трафик генерируется с одного IP-адреса. Этот момент стал неожиданностью для многих пользователей, использующих Amazon ELB. Amazon ELB ведет себя немного странно, когда входящий трафик исходит из одного или определенного диапазона IP-адресов, он не выполняет эффективно циклический перебор и задерживает запрос .----