밤 늦게까지 여는 카페

[Amazon ECS] 갑자기 137 종료 코드를 반환하면서 실행 중인 ECS Fargate Task가 종료된다;;; feat. Docker Container 종료 코드 본문

aws

[Amazon ECS] 갑자기 137 종료 코드를 반환하면서 실행 중인 ECS Fargate Task가 종료된다;;; feat. Docker Container 종료 코드

Jㅐ둥이 2024. 11. 7. 23:01
반응형

안녕하세요.

오늘은 Amazon ECS Fargate를 사용하면서 갑작스럽게 Fargate Task가 종료되었던 사례를 기록하려고 합니다.

 

1. 발단: QA 환경 기능 이상

저희는 안정적인 서비스 개발 및 운영을 위해서 4개의 스테이지를 운영하고 있습니다.

  • DEV(개발): 새로운 기능을 개발하기 위해서 자유롭게 사용하는 스테이지
  • QA(테스트): DEV에서 개발된 기능을 테스트 하기 위해 사용하는 스테이지로 테스트 팀이 사용
  • STG(운영과 똑같은 버전): 테스트 팀이 검수한 버전을 운영에 배포하기 전에 마지막으로 확인하는 스테이지
  • PROD(운영): 고객이 사용하는 스테이지

그런데 갑자기 QA 환경에서 서비스가 정상적으로 동작하지 않는다는 이슈를 공유 받았습니다.

OpenSearch를 봐도 패닉 로그는 없었습니다.

 

뭐가 문제지 싶은 순간에 Amazon ECS 콘솔에서 태스크가 계속해서 종료되고 있는 것을 확인했습니다!

'패닉 없이 태스크가 계속 종료된다고?' 속으로 질문하며 종료된 태스크를 눌러보니 137 종료 코드를 확인할 수 있었습니다.

137 종료 코드를 반환하며 종료되어 버린 작업

2. 137 종료 코드 - Out Of Memry

컨테이너 세부 정보에 종료 코드 137과 함께 OutOfMemoryError가 적혀 있어서

프로세스의 메모리가 부족해서 발생한 문제인 것을 알 수 있었습니다.

 

덕분에 QA 환경에서 메모리가 과다하게 사용되고 있는 원인을 찾았고 적절한 조치를 취할 수 있었습니다.

 

3. 종료 코드에 대해서 알아보자

문제가 해결되고 여유가 생기니 137 종료 코드가 무슨 의미를 가지고 있는지 궁금해지더라고요?

찾아본 내용은 다음과 같습니다.

널리 사용되는 표준은 없습니다.

어플리케이션마다 종료 코드를 다르게 관리하더라고요.

 

그러면 도커 컨테이너의 종료 코드는 어떨까요?

 

도커 컨테이너의 종료 코드는 125, 126, 127가 정의되어 있고,

그 외의 종료 코드에 대해서는 컨테이너에서 실행되는 어플리케이션의 종료 코드를 반환한다고 합니다.

  • 125: 도커 데몬에서 에러가 발생했을 때 반환됩니다

도커 데몬의 에러

  • 126: 주어진 명령어를 실행하지 못했을 때 반환됩니다

명령어를 실행하지 못했을 때 발생

 

  • 127: 주어진 명령어를 실행 환경에서 찾지 못했을 때 반환됩니다.

명령어를 실행 환경에서 찾지 못했을 때 발생

 

아하, 137 종료 코드는 우리가 실행한 명령어에서 발생한 것이로군요!

 

저희는 도커 이미지의 용량을 최적화 하기 위해서 alpine linux를 사용하고 있습니다.

그리고 alpine linux에서는 /bin/sh를 통해서 명령어가 실행됩니다.

 

/bin/sh를 통해 실행된 프로세스는 SIGKILL을 받았을 때 137 종료 코드를 반환합니다.

 

🎁다른 Amazon ECS 포스팅들 🎁

 

반응형