Classic Load Balancer 세션 고정성 기능 문제를 해결하려면 어떻게 해야 합니까?

4분 분량
0

기간 기반 또는 애플리케이션 제어 세션 고정성을 갖춘 Classic Load Balancer가 있습니다. 로드 밸런서는 클라이언트 HTTP 또는 HTTPS 세션을 등록된 동일한 인스턴스로 라우팅하도록 구성되었지만 클라이언트 요청은 등록된 다른 인스턴스로 라우팅됩니다. Elastic Load Balancing(ELB) 세션 고정성 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

기본적으로 Classic Load Balancer는 처리되지 않은 요청이 가장 적은 등록된 인스턴스로 각 요청을 라우팅합니다. 스티키 세션(세션 선호도)을 사용하면 로드 밸런서가 사용자 세션을 특정 인스턴스에 바인딩하도록 구성되므로 세션 중 사용자의 모든 요청이 동일한 인스턴스로 전송됩니다. 다음과 같은 경우 스티키 세션이 실패할 수 있습니다.

1.    등록된 인스턴스가 애플리케이션 쿠키를 삽입하고 있지 않습니다.

2.    클라이언트가 요청 헤더에 쿠키를 반환하지 않습니다.

3.    등록된 인스턴스에서 삽입한 쿠키의 형식이 올바르지 않습니다.

4.    기간 기반 스티키 세션을 사용할 때 지정된 만료 기간이 지났습니다.

5.    HTTP 또는 HTTPS 요청이 고정성이 활성화된 둘 이상의 로드 밸런서를 통과하고 있습니다.

참고: 로드 밸런서 세션 고정성 기능은 HTTP 또는 HTTPS 리스너에서만 지원됩니다.

해결 방법

애플리케이션 제어 세션 고정성

1.    Classic Load Balancer에서 HTTP 오류를 확인합니다. 자세한 내용은 Classic Load Balancer 문제 해결: HTTP 오류를 참조하세요.

2.    로드 밸런서 DNS 이름과 유사한 다음 명령을 실행합니다. 응답에서 다음 두 쿠키가 있는지 확인합니다. 

  • 애플리케이션 쿠키는 백엔드 인스턴스에서 실행되는 애플리케이션에 의해 삽입됩니다.
  • AWSELB 쿠키는 로드 밸런서에 의해 삽입됩니다.

참고: 이 명령을 실행하기 전에 DNS 이름을 로드 밸런서의 이름으로 바꿔야 합니다.

[ec2-user@ip-172-31-22-85 ~]$ curl -vko /dev/null internal-TESTELB-1430759361.eu-central-1.elb.amazonaws.com

참고: curl 유틸리티는 Linux에서만 사용할 수 있지만Windows에도 설치할 수 있습니다.

다음은 명령에 대한 응답의 예입니다.

...

< Set-Cookie: PHPSESSID=k0qu6t4e35i4lgmsk78mj9k4a4; path=/
< Set-Cookie: 
AWSELB=438DC7A50C516D797550CF7DE2A7DBA19D6816D5E6FB20329CD6AEF2B40030B12FF2839757A60E2330136A2182D27D049FB9D887FBFE9E80FB0724130FB3A86A4B0BAC296FDEB9E943EC9272FF52F5A8AEF373DF33;PATH=/

...

참고: 응답에 AWSELB 쿠키가 없으면 클라이언트와 백엔드 인스턴스 간에 고정성이 없습니다. 

3.    다음과 유사한 명령을 실행하여 등록된 인스턴스 IP로 HTTP 요청을 직접 전송하여 등록된 인스턴스가 애플리케이션 쿠키를 삽입하고 있는지 확인합니다. 

[ec2-user@ip-172-31-22-85 ~]$ curl -vko /dev/null 172.31.30.168

이 명령은 다음 예시와 비슷한 응답을 반환합니다.

...

< Set-Cookie: PHPSESSID=5pq74110nuir60kpapj04mglg4; path=/

...

4.    등록된 인스턴스에서 생성한 쿠키 이름이 로드 밸런서에 구성된 쿠키 이름과 동일한지 확인합니다. 

5.    등록된 인스턴스가 응답에 애플리케이션 쿠키를 삽입하고 로드 밸런서가 AWSELB 쿠키를 삽입하는 경우 클라이언트가 후속 요청에서 이 두 쿠키를 모두 전송해야 합니다. 클라이언트가 애플리케이션 또는 AWSELB 쿠키를 포함하지 못하면 고정성이 작동하지 않습니다. 클라이언트가 애플리케이션과 AWSELB 쿠키를 모두 전송하는지 확인하려면 클라이언트에서 패킷 캡처를 수행하거나 브라우저의 웹 디버깅 도구를 사용하여 요청 헤더에서 쿠키 정보를 검색합니다.

6.    로드 밸런서가 요청을 라우팅한 백엔드 인스턴스를 확인하려면 다음과 유사한 스크립트를 실행하여 인스턴스 메타데이터를 사용하여 인스턴스 ID를 표시하도록 백엔드 인스턴스를 구성할 수 있습니다.

<?php $instance_id =file_get_contents('http://169.254.169.254/latest/meta-data/instance-id');
echo "instance id = " . $instance_id . "\\xA";
?>

7.    ELB 액세스 로그를 검토하여 동일한 사용자의 요청이 등록된 다른 인스턴스로 라우팅되었는지 확인합니다. ELB 액세스 로그 검토에 대한 자세한 내용은 Classic Load Balancer의 액세스 로그를 참조하세요. 

8.    애플리케이션에서 삽입한 쿠키의 형식이 HTTP에 대해 올바른지 확인합니다.

9.    요청이 여러 로드 밸런서를 통과하는 경우 하나의 로드 밸런서에서만 고정성이 활성화되어 있는지 확인합니다. 둘 이상의 로드 밸런서가 쿠키를 삽입하면 원래 쿠키가 대체되고 고정성이 작동하지 않습니다. 

기간 기반 세션 고정성

1.    로드 밸런서 DNS 이름과 유사한 다음 명령을 실행하여 응답에서 AWSELB 쿠키가 있는지 확인합니다. 

[ec2-user@ip-172-31-22-85 ~]$ curl -vko /dev/null internal-TESTELB-1430759361.eu-central-1.elb.amazonaws.com

이 명령은 다음 예시와 비슷한 응답을 반환합니다.

...

< Set-Cookie: 
AWSELB=438DC7A50C516D797550CF7DE2A7DBA19D6816D5E6FB20329CD6AEF2B40030B12FF2839757A60E2330136A2182D27D049FB9D887FBFE9E80FB0724130FB3A86A4B0BAC296FDEB9E943EC9272FF52F5A8AEF373DF33;PATH=/

...

참고: 응답에 AWSELB 쿠키가 없으면 클라이언트와 백엔드 인스턴스 간에 고정성이 없습니다.

2.    로드 밸런서가 AWSELB 쿠키를 삽입하는 경우 클라이언트가 후속 요청에서 이 쿠키를 전송해야 합니다. 클라이언트가 AWSELB 쿠키를 포함하지 않으면 고정성이 작동하지 않습니다. 클라이언트가 AWSELB 쿠키를 전송하는지 확인하려면 클라이언트에서 패킷 캡처를 수행하거나 브라우저의 웹 디버깅 도구를 사용하여 요청 헤더에서 쿠키 정보를 검색합니다.

3.    로드 밸런서에 구성된 기간을 확인합니다. 쿠키 만료 기간이 경과하면 로드 밸런서에서 새 쿠키를 발행할 때까지 클라이언트 세션이 등록된 인스턴스에 더 이상 고정되지 않습니다.

4.    요청이 여러 로드 밸런서를 통과하는 경우 하나의 로드 밸런서에서만 고정성이 활성화되어 있는지 확인합니다. 둘 이상의 로드 밸런서가 쿠키를 삽입하면 원래 쿠키가 대체되고 고정성이 작동하지 않습니다. 


관련 정보

Classic Load Balancer에 대한 스티키 세션 구성

describe-load-balancers

AWS 공식
AWS 공식업데이트됨 6년 전