Question

ECS 를 사용하고 있습니다. 

컨테이너 내 500,400 에러가 발생되는 경우가 있습니다. 

에러메시지 코드가 발생되면 컨테이너가 재시작 되는데 이 경우 재시작이  안 되도록 설정 가능할까요?


Answer

  1.  ECS에서 컨테이너 내 4xx, 5xx 에러 발생 하는 원인은 다양합니다. 

            때문에 빈번히 발생하는 원인과 해결방법에 대한 안내 드립니다.

1.1 4xx, 5xx 에러로 인한 Healthcheck 실패 

  • 평균 사용률은 낮지만 간헐적으로 스파이크가 발생하여 최대치로 증가하는 경우 높은 CPU 점유율로 Healthcheck에 실패해 에러가 발생할 수 있습니다. 컨테이너가 재시작 하는 이유 또한 Healthcheck 실패로 발생합니다. 


1.2 application의 버그나 오류로 인한 크러시 하는 경우 

[원인]

-버그 또는 예외 처리 오류: 

애플리케이션 코드에서 잘못된 입력 처리, 응답 생성 오류, 예외 처리 부재 등으로 인해 4XX 및 5XX 에러가 발생할 수 있습니다.

-외부 서비스 오류:

애플리케이션이 외부 서비스와 상호 작용하는데 오류가 발생하여 4XX 및 5XX 에러가 발생할 수 있습니다. 예를 들어, 데이터베이스 연결 오류, API 호출 실패 등이 있습니다.



[해결 방법]

- 로그 분석: 

애플리케이션 로그를 분석하여 어떤 종류의 4XX 및 5XX 에러가 발생하고 있는지 확인합니다. 로그에서 에러 메시지, 스택 트레이스, 요청과 응답 정보를 확인하여 오류의 원인을 파악합니다.


- 코드 검토:

애플리케이션 코드를 검토하여 잠재적인 버그, 예외 처리 부재, 입력 유효성 검사 오류 등을 확인합니다. 에러가 발생하는 부분을 식별하고, 안전한 예외 처리 및 오류 복구 메커니즘을 추가합니다.


- 외부 서비스 연동 검토:

애플리케이션이 외부 서비스와 상호 작용하는 경우, 해당 서비스와의 연결과 통신을 검토합니다. 데이터베이스 연결 설정, API 호출 방법, 인증 토큰 등을 확인하고 문제가 있는 경우 수정하거나 재구성합니다.


1.3 정의된 리소스 한도를 초과하여 컨테이너가 종료되는 경우

[원인]

3.1 애플리케이션 또는 서비스에 할당된 자원(CPU, 메모리 등)이 부족하여 요청을 처리하지 못하거나 응답을 반환하지 못하는 경우가 있을 수 있습니다.

[해결 방법]

3.2 ECS 작업 정의에서 할당된 자원(RAM, CPU 등)을 적절히 조정하여 자원 부족 문제를 해결합니다. 메트릭 및 로그를 확인하여 자원 사용량이 높은 경우 추가 인스턴스를 시작하거나 자동 스케일링을 구성할 수 있습니다.
정의된 자원 외에도 EC2 인스턴스의 타입을 상향할 수도 있습니다. 


1.4 ECS 스케줄러로 인해 4XX 및 5XX 에러가 발생하는 경우

    [원인]

    ECS 스케줄러 문제: 

ECS 스케줄러가 잘못된 컨테이너 인스턴스 연결 또는 부적절한 스케줄링으로 인해 애플리케이션 요청이 올바르게 분배되지 않고 4XX 및 5XX 에러가 발생할 수 있습니다.

        [해결]

        ECS 스케줄러 검토:

ECS 스케줄러의 설정과 연결된 컨테이너 인스턴스의 상태를 확인하고, 부적절한 스케줄링으로 인한 문제를 해결합니다. ECS 클러스터와 컨테이너 인스턴스의 로그를 분석하여 어떤 컨테이너 인스턴스에서 문제가 발생하는지 확인하고, 필요한 조치를 취합니다.


  1. 컨테이너에서 에러 발생 시 재시작 되지 않도록 설정 

  • 일반적으로 컨테이너는 어플리케이션이 다운되면 컨테이너도 같이 Stop 되지만, ECS는 비정상 컨테이너를 자동으로 복구하여 원하는 수의 컨테이너가 애플리케이션을 지원하는 오케스트레이션 기능이 있습니다.  때문에 문제가 되는 컨테이너는 자동 재시작 되며, 강제적으로 복구작업을 못하게 할 수는 없습니다. 

따라서 에러 발생시 위에 작성한 오류 원인 및 해결 방법으로 에러를 해결하여 정상적인 컨테이너 서비스를 이용하시기를 권고드립니다. 

  • 다만, 서비스는 정상적인데 health check 400,500 에러가 간헐적으로 발생하여 컨테이너가 재시작 된다면, 설정하신 Health-Check 정보를 수정하여 ELB Health check 가 OK라고 판단하는 status code 및 Health-Check 요청 및 응답 하는 시간 값을 적당한 시간 값으로 설정하여 운영하시는 방법도 있습니다.


[reference]

https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/APIReference/API_HealthCheck.html