Amazon CloudWatch 지표 및 액세스 로그를 사용하여 Application Load Balancer에서 수신한 HTTP 502 “잘못된 게이트웨이” 오류를 해결하려고 합니다.
해결 방법
HTTP 502 오류 원인 파악
HTTP 502: 잘못된 게이트웨이 오류의 원인은 여러 가지가 있을 수 있습니다. 오류의 원인은 대상 또는 로드 밸런서일 수 있습니다. 오류의 원인을 확인하려면 CloudWatch 지표 또는 액세스 로그를 사용하십시오.
CloudWatch 지표 사용
HTTPCode_ELB_502_Count 지표에 데이터 포인트가 있는 경우 로드 밸런서가 오류의 원인입니다. HTTPCode_Target_5XX_Count 지표에 데이터 포인트가 있으면 대상이 오류의 원인입니다.
액세스 로그 사용
elb_status_code가 "502"이고, target_status_code가 "-"인 경우 로드 밸런서가 오류의 원인입니다. elb_status_code가 "502"이고 target_status_code가 "502"인 경우에는 대상이 오류의 원인입니다.
HTTP 502 오류 문제 해결
원인을 파악하려면 elb_status_code = "502" 및 target_status_code로 액세스 로그를 필터링하십시오. 그런 다음, 발생한 문제에 맞는 해결 방법을 수행하십시오.
로드 밸런서가 연결을 설정하려고 할 때 로드 밸런서가 대상으로부터 TCP RST를 수신함
연결을 설정할 때 대상으로부터 TCP RST 메시지를 받을 수 있습니다. 이 메시지는 로드 밸런서가 대상과 TCP 3방향 핸드셰이크를 설정할 수 없을 때 나타납니다. 따라서 로드 밸런서가 사용자 요청을 대상에 전달할 수 없습니다.
TargetConnectionErrorCount 지표에서 대상이 TCP RST를 사용하여 로드 밸런서의 연결을 거부하고 있음을 보여주는 데이터 포인트를 확인하십시오.
액세스 로그에서 request_processing_time, target_processing_time 및 response_processing_time 필드를 -1 값으로 설정하십시오. 값을 -1로 설정하는 경우 로드 밸런서를 연결해야 하므로 로드 밸런서가 대상에 요청을 보낼 수 없습니다.
다음은 request_processing_time, target_processing_time 및 response_processing_time이 -1로 설정된 액세스 로그 항목의 예입니다.
http 2022-04-15T16:52:50.757968Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 10.0.0.1:80 -1 -1 -1 502 - 86 155 "GET http://example.com:80/ HTTP/1.1" "curl/7.51.0" - - arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/my-targets/73e2d6bc24d8a067" Root=1-58337262-36d228ad5d99923122bbe354"
로드 밸런서가 연결을 시도할 때 로드 밸런서가 대상으로부터 "ICMP Destination unreachable (Host unreachable)"과 같은 예기치 않은 응답을 수신함
액세스 로그에서 request_processing_time, target_processing_time 및 response_processing_time 필드를 -1 값으로 설정합니다. 그런 다음, 로드 밸런서 서브넷이 대상 포트의 대상으로 트래픽을 허용하는지 확인합니다.
로드 밸런서에 대상에 대해 처리되지 않은 요청이 있는 경우 대상이 TCP RST 또는 TCP FIN 메시지를 사용하여 연결을 종료함
로드 밸런서는 요청을 수신하여 해당 요청을 대상에 전달합니다. 대상이 요청 처리를 시작하지만 로드 밸런서에 대한 연결을 너무 일찍 닫습니다. 이 문제는 일반적으로 대상에 구성한 연결 유지 시간 초과 기간이 로드 밸런서의 유휴 제한 시간 값보다 짧을 때 발생합니다. 연결 유지 시간 초과 기간이 유휴 제한 시간 값보다 긴지 확인하십시오.
대상 응답의 형식이 잘못되었거나 유효하지 않은 HTTP 헤더가 포함되어 있음
대상 응답 문제를 해결하려면 문제가 발생한 기간 동안 대상에서 패킷 캡처를 수행하십시오.
Linux에 대해 패킷 캡처를 수행하려면 다음 명령을 실행합니다.
sudo tcpdump -i any -w filename.pcap
**중요:**대상 인스턴스에 많은 양의 트래픽이 있는 경우 tcpdump 컬렉션에서 생성하는 패킷 캡처(PCAP) 파일이 디스크 공간에 영향을 줄 수 있습니다. 또한 대량의 트래픽은 대상 인스턴스의 서비스에도 영향을 줄 수 있습니다.
Windows의 경우 Wireshark 웹사이트에서 Wireshark 애플리케이션을 다운로드하여 사용하십시오.
tcpdump를 사용하여 패킷 캡처 샘플을 테스트하려면 Amazon Virtual Private Cloud(Amazon VPC)의 Amazon Elastic Compute Cloud(Amazon EC2) Linux 또는 Windows 인스턴스와 인터넷 게이트웨이를 통한 온프레미스 호스트 간의 네트워크 성능 문제를 해결하려면 어떻게 해야 합니까?를 참조하십시오
로드 밸런서가 대상에 연결할 때 SSL 핸드셰이크 오류가 발생함
로드 밸런서에서 대상의 HTTPS 리스너로의 TCP 연결은 성공했지만 후속 SSL 핸드셰이크에서 오류가 발생합니다. 그 결과, 로드 밸런서가 요청을 대상으로 전달할 수 없습니다.
대상 그룹이 HTTPS 프로토콜을 사용하는 경우 문제가 발생한 기간 동안 대상에서 패킷 캡처를 수행하십시오.
서버는 로드 밸런서가 백엔드 연결에 사용하는 보안 정책이 지원하는 TLS 암호화 스위트를 사용해야 합니다.
등록 취소된 대상이 관리하는 요청에 대한 등록 취소 지연 기간이 경과됨
AWS CloudTrail 이벤트에서 문제가 발생한 기간 동안 DeregisterTargets API 작업을 확인하십시오. 대상이 너무 일찍 등록을 취소하면 HTTP 502 오류가 발생합니다. 이 문제를 해결하려면 등록 취소 지연 기간을 늘려 긴 작업이 완료될 수 있도록 합니다.
대상이 Lambda 함수인 경우 HTTP 502 오류 문제 해결
AWS Lambda 함수에 대해 실패한 요청의 경우 로드 밸런서 액세스 로그의 error_reason 필드에 있는 Lambda 오류 이유 코드를 확인하십시오.
대상이 Lambda 함수이고 응답 본문이 1MB를 초과함
문제를 확인하려면 LambdaUserError 지표에 대한 데이터 포인트가 있는지 확인하십시오. 또는 로드 밸런서 액세스 로그의 error_reason 필드가 LambdaResponseTooLarge로 설정되어 있는지 확인하십시오.
문제를 해결하려면 Lambda 코드를 업데이트하고 오류 처리 로직을 추가합니다.
대상인 Lambda 함수가 구성된 제한 시간 전에 응답하지 않음
문제를 확인하려면 LambdaUserError 지표에 대한 데이터 포인트가 있는지 확인하십시오. 또는 로드 밸런서 액세스 로그의 error_reason 필드가 LambdaUnhandled로 설정되어 있는지 확인하십시오.
대상이 오류를 반환한 Lambda 함수이거나 Lambda가 함수를 제한함
Lambda가 함수를 제한했는지 확인하려면 데이터 포인트에 대한 Throttles 지표를 확인하십시오. Lambda가 함수를 제한한 경우 AWS Service Quotas를 사용하여 Lambda 동시 실행에 대한 할당량 증가를 요청하십시오.
자세한 내용은 Lambda 호출 제한 한도에 대한 이해를 참조하십시오.