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

4분 분량
0

기간 기반 고정성 또는 애플리케이션 기반 고정성 세션을 사용하는 Application Load Balancer가 있습니다. 로드 밸런서는 모든 사용자 세션 요청을 동일한 대상으로 라우팅하도록 구성됩니다. 하지만 사용자 세션 요청이 다른 대상으로 라우팅되기를 원합니다.

간략한 설명

스티키 세션은 쿠키를 사용하여 클라이언트가 쿠키의 수명 기간 동안 동일한 대상에 대한 연결을 유지할 수 있도록 도와줍니다. 스티키 세션은 사용자 세션을 특정 대상에 바인딩하도록 로드 밸런서를 구성합니다. 즉, 세션 중 사용자의 모든 요청이 동일한 대상으로 전송됩니다. 그러나 연결에 대한 이러한 가정은 시간이 지남에 따라 불균형을 초래할 수 있습니다.

스티키 세션은 다음과 같은 이유로 실패할 수 있습니다.

  • 등록된 대상이 쿠키를 생성하지 않았습니다.
  • 클라이언트가 요청 헤더에 쿠키를 반환하지 않았습니다.
  • 쿠키 형식이 올바르지 않습니다.
  • 기간 기반 세션이 끝났습니다.
  • 세션 요청이 여러 로드 밸런서를 통과합니다.
  • 대상 상태가 비정상으로 변경되었습니다.
  • AWS 서비스가 고정성을 비활성화했습니다.

참고: 시작하기 전에 Application Load Balancer에 대한 스티키 세션의 요구 사항 및 고려 사항 섹션을 검토해야 합니다.

해결 방법

애플리케이션 기반 세션 고정성

  1. 로드 밸런서에서 HTTP 오류를 확인하십시오. 지침은 Application Load Balancer 문제 해결을 참조하십시오.

  2. 백엔드 인스턴스 또는 로드 밸런서에 배치된 쿠키를 확인하려면 다음과 비슷한 curl 명령을 실행하십시오. DNS 이름을 로드 밸런서 이름으로 바꿉니다.

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

    참고: Windows 운영 체제(OS)에 리눅스 curl 유틸리티를 설치할 수도 있습니다. 자세한 내용은 curl 웹사이트에서 윈도우용 curl 8.10.1을 참조하십시오.

    curl 명령의 출력은 다음과 비슷합니다.

    ...
    < Set-Cookie: PHPSESSID=k0qu6t4e35i4lgmsk78mj9k4a4; path=/
    
    < Set-Cookie:
    
    AWSALBAPP-0=438DC7A50C516D797550CF7DE2A7DBA19D6816D5E6FB20329CD6AEF2B40030B12FF2839757A60E2330136A2182D27D049FB9D887FBFE9E80FB0724130FB3A86A4B0BAC296FDEB9E943EC9272FF52F5A8AEF373DF33;PATH=/
    
    ...
  3. 등록된 대상이 애플리케이션 쿠키를 생성했는지 확인하려면 다음과 같이 인스턴스 IP 주소로 HTTP 요청을 전송하십시오.

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

    이 명령의 출력은 다음과 비슷합니다.

    ...
    < Set-Cookie: PHPSESSID=5pq74110nuir60kpapj04mglg4; path=/
    
    ...
  4. 등록된 대상에서 생성한 쿠키 이름이 2단계와 3단계의 로드 밸런서에 있는 쿠키의 이름인지 확인합니다.

  5. 대상에서 애플리케이션 쿠키를 생성하고 로드 밸런서가 AWSALBAPP 쿠키를 생성하는 경우 클라이언트가 후속 요청에서 두 쿠키를 모두 전송하는지 확인합니다. 클라이언트에 애플리케이션 또는 AWSELB 쿠키가 포함되어 있지 않으면 고정성이 실패합니다. 클라이언트가 애플리케이션과 AWSALBAPP 쿠키를 모두 전송하는지 확인하려면 클라이언트에서 패킷 캡처를 수행하십시오. 요청 헤더에서 쿠키 정보를 검색하려면 다음 옵션 중 하나를 사용하십시오.

    tcpdump 웹사이트tcpdump
    Wireshark 웹사이트Wireshark 유틸리티
    브라우저 웹 디버깅 도구

    참고: AWS Support와 협력하는 경우 HAR 파일을 생성하여 이 정보를 수집하십시오. HAR 파일은 사용자 이름, 암호 및 키와 같은 민감한 정보를 캡처할 수 있으므로 HAR 파일에서 중요한 정보를 제거해야 합니다.

  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. 동일한 사용자의 요청이 등록된 다른 대상으로 라우팅되는지 확인하려면 Elastic Load Balancing(ELB) 액세스 로그를 검토하십시오. 지침은 Application Load Balancer에 대한 로그 액세스를 참조하십시오.

  8. 고정성이 활성화된 대상 그룹에 속한 모든 대상의 상태가 정상인지 확인합니다. 대상 상태가 비정상으로 변경되면 고정성이 중단되고 로드 밸런서가 요청을 해당 대상으로 라우팅하지 않습니다. 그러면 로드 밸런서가 새 정상 대상을 자동으로 선택하고 스티키 세션을 설정합니다. 로드 밸런서는 상태가 비정상인 경우에도 요청을 새 대상으로 계속 라우팅합니다. 상태 확인에 대한 자세한 내용은 Application Load Balancer 대상 그룹의 상태 확인을 참조하십시오.

  9. Amazon Elastic Kubernetes Service(Amazon EKS)와 같이 로드 밸런서의 고정성이 비활성화되었을 수 있는 AWS 서비스가 있는지 확인하십시오. CloudTrail 이벤트 기록을 확인하십시오. API 이름 ModifyTargetGroupAttributes와 속성 stickiness.enabled를 사용합니다.

기간 기반 세션 고정성

  1. AWSALB 쿠키를 확인하려면 다음과 비슷한 curl 명령을 실행합니다. 로드 밸런서 DNS 이름을 사용해야 합니다.

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

    curl 명령의 출력은 다음과 비슷합니다.

    ...
    < Set-Cookie: AWSALB=438DC7A50C516D797550CF7DE2A7DBA19D6816D5E6FB20329CD6AEF2B40030B12FF2839757A60E2330136A2182D27D049FB9D887FBFE9E80FB0724130FB3A86A4B0BAC296FDEB9E943EC9272FF52F5A8AEF373DF33;PATH=/
    ...

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

  2. 로드 밸런서가 AWSALB 쿠키를 생성한 경우 클라이언트가 후속 요청에서 이 쿠키를 전송하는지 확인하십시오. 클라이언트가 AWSALB 쿠키를 포함하지 못하면 고정성이 작동하지 않습니다. 클라이언트가 AWSALB 쿠키를 전송하는지 확인하려면 클라이언트에서 패킷 캡처를 수행하십시오. 요청 헤더에서 쿠키 정보를 검색하려면 다음 옵션 중 하나를 사용하십시오.

    tcpdump 웹사이트tcpdump
    Wireshark 웹사이트Wireshark 유틸리티
    브라우저 웹 디버깅 도구

    참고: AWS Support와 협력하는 경우 HAR 파일을 생성하여 이 정보를 수집하십시오. HAR 파일은 사용자 이름, 암호 및 키와 같은 민감한 정보를 캡처할 수 있으므로 HAR 파일에서 중요한 정보를 제거해야 합니다.

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

  4. 요청이 여러 로드 밸런서를 통과하는 경우 하나의 로드 밸런서에서만 고정성이 활성화되었는지 확인하십시오. 둘 이상의 로드 밸런서가 쿠키를 생성하면 로드 밸런서가 원래 쿠키를 대체하고 고정성이 실패합니다.

Classic Load Balancer의 경우 Classic Load Balancer 세션 고정성 기능 문제를 해결하려면 어떻게 해야 합니까?를 참조하십시오.

관련 정보

Elastic Load Balancing이 로드 밸런서 트래픽을 불균등하게 라우팅하는 이유는 무엇입니까?

Classic Load Balancer의 스티키 세션 구성

Application Load Balancer에 가중치가 적용된 대상 그룹을 설정하려면 어떻게 해야 합니까?

AWS 공식
AWS 공식업데이트됨 7달 전