Application Load Balancer 문제 해결 - Elastic Load Balancing

Application Load Balancer 문제 해결

다음 정보는 Application Load Balancer와 관련된 문제를 해결하는 데 도움이 될 수 있습니다.

등록된 대상은 서비스되지 않고 있습니다.

대상이 InService 상태로 들어가는 데 예상보다 시간이 오래 걸릴 경우 상태 확인에 실패할 수 있습니다. 한번이라도 상태 확인을 통과할 때까지 대상이 서비스되지 않습니다. 자세한 내용은 대상 그룹에 대한 상태 확인 단원을 참조하십시오.

인스턴스가 상태 확인에 실패하고 있는지 확인한 다음, 다음 문제를 점검합니다.

보안 그룹이 트래픽을 허용하지 않음

인스턴스에 연결된 보안 그룹은 반드시 상태 확인 포트와 상태 확인 프로토콜을 사용하여 로드 밸런서에서의 트래픽을 허용해야 합니다. 로드 밸런서 보안 그룹에서의 모든 트래픽을 허용할 수 있도록 인스턴스 보안 그룹에 규칙을 추가할 수 있습니다. 또한 로드 밸런서를 위한 보안 그룹은 반드시 인스턴스로의 트래픽을 허용해야 합니다.

ACL(액세스 제어 목록)이 트래픽을 허용하지 않음

인스턴스를 위해 서브넷에 연결된 네트워크 ACL은 상태 확인 포트에서 인바운드 트래픽을, 휘발성 포트(1024-65535)에서 아웃바운드 트래픽을 허용해야 합니다. 로드 밸런서 노드를 위해 서브넷에 연결된 네트워크 ACL은 휘발성 포트에서 인바운드 트래픽을, 상태 확인 및 휘발성 포트에서 아웃바운드 트래픽을 허용해야 합니다.

핑 경로가 존재하지 않습니다.

상태 확인을 위한 대상 페이지를 생성하고 이것의 경로를 핑 경로로 지정합니다.

유휴 연결 제한 시간

먼저, 대상의 프라이빗 IP 주소와 상태 확인 프로토콜을 사용하여 네트워크 내에서 직접 대상을 연결할 수 있는지 확인합니다. 연결이 불가능하면 인스턴스가 과도하게 사용되고 있는지 확인하고, 이 인스턴스가 처리할 요청이 너무 많은 경우 대상 그룹에 더 많은 대상을 추가합니다. 연결이 가능한 경우, 상태 확인 시간 제한이 시작되기 전에 대상 페이지가 응답을 하지 않을 수 있습니다. 상태 확인을 위해 더 간단한 대상 페이지를 선택하거나 상태 확인 설정을 조정합니다.

대상이 성공적 응답 코드를 반환하지 않음

성공 코드는 200으로 기본 설정되어 있지만, 상태 확인을 구성할 때 선택에 따라 성공 코드를 추가적으로 지정할 수 있습니다. 성공 코드가 로드 밸런서가 기대하고 있는 것인지, 그리고 성공 시 이들 코드를 반환하도록 애플리케이션이 구성되어 있는지 확인합니다.

대상 응답 코드의 형식이 잘못되었거나 대상에 연결하는 동안 오류가 발생했습니다.

애플리케이션이 로드 밸런서의 상태 확인 요청에 응답하는지 확인합니다. 일부 애플리케이션에서는 로드 밸런서가 보낸 HTTP 호스트 헤더에 응답하기 위한 가상 호스트 구성과 같이 상태 확인에 응답하기 위해 추가 구성이 필요합니다. 호스트 헤더 값에는 대상의 프라이빗 IP 주소와 상태 확인 포트가 포함됩니다. 예를 들어, 대상의 프라이빗 IP 주소가 10.0.0.10이고 상태 확인 포트가 8080인 경우 상태 확인에서 로드 밸런서가 보낸 HTTP 호스트 헤더는 Host: 10.0.0.10:8080입니다. 애플리케이션 상태를 확인하려면 해당 호스트에 응답하는 가상 호스트 구성 또는 기본 구성이 필요할 수 있습니다. 상태 확인 요청에는 다음 속성이 포함됩니다. User-AgentELB-HealthChecker/2.0로 설정되고, 메시지 헤더 필드의 행 종결자는 시퀀스 CRLF이며, 헤더는 첫 번째 빈 행에서 종료되고 그 뒤에 CRLF가 옵니다.

클라이언트가 인터넷 경계 로드 밸런서에 연결할 수 없음

로드 밸런서가 요청에 응답하지 않는 경우에는 다음 문제를 점검하세요.

인터넷 경계 로드 밸런서가 프라이빗 서브넷에 연결됩니다.

로드 밸런서를 위한 퍼블릭 서브넷을 지정해야 합니다. 퍼브릭 서브넷은 가상 프라이빗 클라우드(VPC)를 위한 인터넷 게이트웨이로 연결되는 경로를 가지고 있습니다.

보안 그룹이나 네트워크 ACL이 트래픽을 허용하지 않음

로드 밸런서를 위한 보안 그룹과 로드 밸런서 서브넷을 위한 모든 네트워크 ACL은 클라이언트에서의 인바운드 트래픽과 리스너 포트의 클라이언트로의 아웃바운드 트래픽을 허용해야 합니다.

로드 밸런서가 비정상 상태 대상에 요청을 전송

대상 그룹에 정상인 대상이 최소 하나 이상 있는 경우 로드 밸런서는 정상인 대상으로만 요청을 라우팅합니다. 대상 그룹에 비정상인 대상만 포함되는 경우 로드 밸런서는 비정상인 대상으로 요청을 라우팅합니다.

로드 밸런서가 응답 코드 000을 보냅니다.

HTTP/2 연결을 사용하는 경우 헤더의 압축 길이가 8K를 초과하거나 하나의 연결에서 지원하는 요청 수가 10,000개를 초과하면 로드 밸런서는 GOAWY 프레임을 보내고 TCP FIN과의 연결을 종료합니다.

로드 밸런서가 HTTP 오류 코드를 생성

로드 밸런서는 다음과 같은 HTTP 오류 코드를 생성합니다. 로드 밸런서는 클라이언트에 HTTP 코드를 전송하고 액세스 로그에 대한 요청을 저장하며, HTTPCode_ELB_4XX_Count 또는 HTTPCode_ELB_5XX_Count 지표를 증분합니다.

HTTP 400: 잘못된 요청

가능한 원인:

  • 클라이언트가 HTTP 사양을 충족하지 않는 잘못된 형식의 요청을 전송했습니다.

  • 요청 헤더가 요청 줄당 16K, 단일 헤더당 16K 또는 전체 헤더에서 64K를 초과했습니다.

HTTP 401: 권한 없음

사용자를 인증하도록 리스너 규칙을 구성했지만, 다음 중 하나가 true입니다.

  • 인증되지 않은 사용자를 거부하도록 OnUnauthenticatedRequest를 구성했거나 IdP가 액세스를 거부했습니다.

  • IdP에서 반환된 클레임 크기가 로드 밸런서에서 지원되는 최대 크기를 초과했습니다.

  • 클라이언트가 호스트 헤더 없이 HTTP/1.0 요청을 제출했으며, 로드 밸런서가 리디렉션 URL을 생성하지 못했습니다.

  • 요청된 범위가 ID 토큰을 반환하지 않습니다.

HTTP 403: 금지됨

Application Load Balancer에 대한 요청을 모니터링하기 위해 AWS WAF 웹 액세스 제어 목록(웹 ACL)을 구성하여 요청이 차단되었습니다.

HTTP 405: 허용되지 않은 메서드

클라이언트가 사용한 TRACE 방법은 Application Load Balancer에서 지원하지 않습니다.

HTTP 408: 요청 제한 시간

클라이언트가 유휴 제한 시간 만료 전에 데이터를 전송하지 않았습니다. TCP 연결 유지를 전송해도 이 시간 제한을 막지 못합니다. 각 유휴 제한 시간이 지나기 전에 최소 1바이트의 데이터를 전송하십시오. 필요한 만큼 유휴 제한 시간의 길이를 늘립니다.

HTTP 413: 페이로드가 너무 큼

대상이 Lambda 함수이고 요청 본문이 1MB를 초과합니다.

HTTP 414: URI가 너무 긺

요청 URL 또는 쿼리 문자열 파라미터가 너무 큽니다.

HTTP 460

로드 밸런서가 클라이언트에서 요청을 수신했지만, 유휴 제한 시간이 종료되기 전에 클라이언트가 로드 밸런서와의 연결을 종료했습니다.

클라이언트 제한 시간이 로드 밸런서의 유휴 제한 시간보다 큰지 확인합니다. 클라이언트 제한 시간이 끝나기 전에 대상이 클라이언트에 응답을 제공하는지 확인하거나, 클라이언트가 제한 시간을 지원할 경우 로드 밸런서의 유휴 제한 시간에 맞게 클라이언트 제한 시간을 늘립니다.

HTTP 463

로드 밸런서가 너무 많은 IP 주소를 가진 X-Forwarded-For 요청 헤더를 받았습니다. IP 주소의 상한은 30입니다.

HTTP 464

로드 밸런서가 대상 그룹 프로토콜의 버전 구성과 호환되지 않는 수신 요청 프로토콜을 받았습니다.

가능한 원인:

  • 요청 프로토콜은 HTTP/1.1이지만, 대상 그룹 프로토콜 버전은 gRPC 또는 HTTP/2입니다.

  • 요청 프로토콜은 GRPC이지만, 대상 그룹 프로토콜 버전은 HTTP/1.1입니다.

  • 요청 프로토콜은 HTTP/2이고 요청은 POST가 아니지만, 대상 그룹 프로토콜 버전은 gRPC입니다.

HTTP 500: 내부 서버 오류

가능한 원인:

  • AWS WAF 웹 액세스 제어 목록(웹 ACL)을 구성했으며 웹 ACL 규칙을 실행하는 데 오류가 발생했습니다.

  • 로드 밸런서가 IdP 토큰 엔드포인트 또는 IdP 사용자 정보 엔드포인트와 통신할 수 없습니다. 로드 밸런서의 보안 그룹과 VPC의 네트워크 ACL이 이러한 엔드포인트에 대한 발신 액세스를 허용하는지 확인합니다. VPC에서 인터넷에 액세스할 수 있는지 확인합니다. 내부 로드 밸런서가 있는 경우, NAT 게이트웨이를 사용하여 인터넷 액세스를 활성화하십시오.

HTTP 501: 구현되지 않음

로드 밸런서가 미지원 값이 포함된 Transfer-Encoding 헤더를 받았습니다. Transfer-Encoding에서 지원하는 값은 chunkedidentity입니다. 대신 Content-Encoding 헤더를 사용할 수 있습니다.

HTTP 502: 잘못된 게이트웨이

가능한 원인:

  • 연결 설정을 시도하는 동안 로드 밸런서가 대상에서 TCP RST를 수신했습니다.

  • 연결을 설정하려고 했을 때 로드 밸런서가 "ICMP 대상에 연결할 수 없음(호스트에 연결할 수 없음"과 같이 대상으로부터 예기치 않은 응답을 받았습니다. 로드 밸런서 서브넷부터 대상 포트의 대상에 이르기까지 트래픽 허용 여부를 점검하십시오.

  • 로드 밸런서가 대상에 대해 대기 중인 요청을 가지고 있는 상태에서 대상이 TCP RST 또는 TCP FIN과의 연결을 종료했습니다. 대상의 연결 유지 기간이 로드 밸런서의 유휴 제한 시간 값보다 짧은지 확인합니다.

  • 대상 응답이 잘못된 형식이거나 유효하지 않은 HTTP를 포함하고 있습니다.

  • 로드 밸런서가 대상에 연결할 때 SSL 핸드섀이크 오류 또는 SSL 핸드섀이크 제한 시간(10초)가 발생했습니다.

  • 등록 취소된 대상에 의해 처리 중인 요청에 대해 경과된 등록 취소 지연 시간 오래 걸리는 작업이 완료될 수 있도록 지연 기간을 늘립니다.

  • 대상이 Lambda 함수이고 응답 본문이 1MB를 초과합니다.

  • 대상이 구성된 제한 시간에 도달하기 전에 응답하지 않은 Lambda 함수입니다.

  • 대상이 오류를 반환하는 Lambda 함수이거나 Lambda 서비스에 의해 스로틀된 함수입니다.

HTTP 503: 서비스 사용 불가

로드 밸런서의 대상 그룹에 등록된 대상이 없습니다.

HTTP 504: 게이트웨이 제한 시간

가능한 원인:

  • 연결 제한 시간이 만료(10초)되기 전에 로드 밸런서가 대상에 대한 연결을 설정하지 못했습니다.

  • 로드 밸런서가 대상에 대한 연결을 설정했지만, 유휴 제한 시간이 끝나기 전에 대상이 응답을 하지 않았습니다.

  • 서브넷의 네트워크 ACL이 휘발성 포트(1024-65535)에서 대상에서 로드 밸런서 노드로의 트래픽을 허용하지 않았습니다.

  • 대상이 개체 몸체보다 큰 콘텐츠 길이 헤더를 반환합니다. 로드 밸런서가 놓친 바이트를 기다리는 도중 시간이 초과되었습니다.

  • 대상이 Lambda 함수이고 Lambda 서비스는 연결 제한 시간이 만료되기 전에 응답하지 않았습니다.

HTTP 505: 버전이 지원되지 않습니다.

로드 밸런서가 예상치 못한 HTTP 버전 요청을 받았습니다. 예를 들어, 로드 밸런서가 HTTP/1 연결을 설정했지만 HTTP/2 요청을 받았습니다.

HTTP 561: 권한 없음

사용자를 인증하도록 리스너 규칙을 구성했지만, 사용자를 인증할 때 IdP가 오류 코드를 반환했습니다.

대상이 HTTP 오류 코드를 생성

로드 밸런서가 HTTP 오류를 포함하여 대상에서 클라이언트로 유효한 HTTP 응답을 전달합니다. 대상이 생성한 HTTP 오류 코드는 HTTPCode_Target_4XX_Count and HTTPCode_Target_5XX_Count 지표에 기록이 됩니다.