문제 발생

배포 환경에서 모니터링을 추가하기 위해 스프링부트 엑추에이터를 적용해보고 있었다.

로컬에서는 /actuator/health 로 접근했을 때는 status가 UP으로 잘 뜨고 있었다.

localhost:8080/actuator/health

 

하지만 EC2 배포 환경에서도 잘 동작하리라 생각했지만 아래처럼 DOWN으로 뜨는 문제가 발생했다.

api.pawland.store/actuator/health

 

네트워크 탭을 확인해보면 아래처럼 상태코드가 503 으로 오는걸 확인할 수 있었다.


문제 해결

결국 로그를 확인하고 나니 금방 해결되는 문제였다.

스프링부트 애플리케이션의 로그를 확인해보니 아래와 같았다.

 

필요한 부분만 살펴보면 아래처럼 레디스 연결에 실패했다는 에러 메시지를 확인할 수 있었다.

[oundedElastic-7] o.s.b.a.d.r.RedisReactiveHealthIndicator : Redis health check failed org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis

 

레디스를 설치하고 다시 헬스 체크 URL로 들어가보니 아래처럼 정상적으로 동작했다.


원인 분석

비록 Redis 서버는 안떴지만, 스프링부트 애플리케이션은 잘 동작하고 있는데 어째서 헬스 체크에 실패했을까?

이는 스프링부트 액추에이터의 동작원리를 뜯어보면 알 수 있다.

간단하게 요약하자면 액추에이터의 헬스 체크는 여러 HealthIndicator 가 수집한 상태를 토대로 status 를 판단한다.

여기서 DataSource의 헬스 체크도 하기 때문에 Redis가 연결되지 않았을 때 DOWN 이라는 status를 반환한 것이다.

로그 저장용 DB 처럼 운영 환경과 크게 상관없는 DB를 운용할 때, 이것 때문에 운영환경에 문제가 생기지 않도록 조심해야겠다.

단순하게 상태코드 200만 반환하는게 헬스 체크인줄 알았는데 동작 원리를 모르면 이런 상황도 만날 수 있단걸 느꼈다.

 

이 글에 스프링부트 액추에이터의 동작 원리가 잘 정리 되어 있으니 참고하자.

 

 

참고자료

 

Spring Boot Actuator의 헬스체크 살펴보기

서버의 상태를 알려주는 헬스 체크에 대해 알고 계시나요? 단순히 200 OK만 내려주겠거니 하고 별로 신경을 안 쓰고 계셨나요? 해당 포스트에서는 Spring Boot Actuaor가 제공해주는 헬스 체크는 어떤

toss.tech

 

+ Recent posts