ECS 서비스 헬스체크
파일시스템을 사용한 헬스체크
ECS 서비스에서 태스크 컨테이너의 헬스 체크 방식을 개선한 방향을 정리합니다. 1초마다 cloud watch에 헬스 체크 로그를 기록하는 방식이 필요한 로그를 찾을때 노이즈가 되어 불편함이 있었습니다.
문제는 뭘까?
기존에는 카프카 컨슈머 커맨드가 무한 반복문으로 돌면서 작업을 처리하고, 매번 작업이 끝난 후 1초 대기(sleep 1) 후 CloudWatch에 헬스 체크 로그를 남겼습니다. 이 방식은 직관적이고 편하지만 헬스 체크 로그가 너무 많이 쌓여서 실제로 필요한 로그를 찾으려면 검색 기능을 매번 사용해야 했습니다. 물론 AWS Log Insights를 활용하면 로그를 필터링할 수 있지만, 그래도 로그가 너무 많아서 관리 부담이 컸습니다.
작업 목표는 다음과 같이 정했습니다.
- 헬스 체크를 ECS에서 직접 처리하도록 바꾸자.
- 불필요한 헬스 체크 로그를 완전히 없애자.
어떻게 해결할까?
처음엔 ChatGPT와 함께 어떤 방식이 좋을지 탐색했습니다. 가장 일반적인 방법인 /health API를 추가해서 헬스 체크를 하는 방안을 생각지만 워커는 비동기적으로 데이터를 처리하는 구조라, API 방식이 적합하지 않았습낟. 그래서 다른 방법을 찾아봤고 파일 기반 타임스탬프를 활용한 헬스체크 방식이 적합해 보였습니다.
아이디어는 다음과 같습니다
- 카프카 컨슈머 커맨드가 작업을 마칠 때마다 /tmp/health-check 파일에 현재 타임스탬프를 기록(덮어쓰기)한다.
- ECS는 주기적으로 이 파일을 읽어서 현재 시간과 파일의 타임스탬프를 비교한다.
- 두 시간 차이가 60초 이하면 정상, 60초를 초과하면 비정상(컨테이너가 멈췄거나 작업이 너무 오래 걸리는 경우)으로 판단한다.
구체적인 헬스 체크 로직은 아래와 같은 쉘 스크립트로 다음과 같습니다.
if [ -f /tmp/health_check ] && [ $(( $(date +%s) - $(cat /tmp/health_check) )) -le 60 ];
then
exit 0;
else
exit 1;
fi
이 스크립트는 /tmp/health_check 파일이 있는지 확인하고, 현재 시간(초 단위)에서 파일에 기록된 타임스탬프를 뺀 값이 60초 이하인지 체크합니다. 조건을 만족하면 exit 0(정상), 아니면 exit 1(비정상)을 반환합니다.
그래서 효과는 어땠나?
CloudWatch에 헬스 체크 로그가 더 이상 쌓이지 않아서 로그 관리가 훨씬 깔끔해졌고
/tmp/health-check
파일의 타임스탬프를 통해 컨테이너 상태를 간단하고 정확하게 확인 가능했습니다.
필요한 로그를 찾는 데 방해가 되던 잡음이 줄어들어서 작업 효율도 올라갔습니다.
배운 점과 앞으로의 계획
모든 서비스에 API 기반 헬스 체크가 적합한 건 아니고 비동기 워쿼 같이 작업이 많은 서비스에는 파일 기반 같은 대안이 더 적합할 수 있습니다. 타임스탬프를 활용한 헬스 체크는 간단하면서도 유용한 방법입니다. 로그 관리는 시스템 운영에서 정말 중요한데, 불필요한 로그를 줄이는 것도 중요한 일이라는 것을 배웠습니다.