aws ec2 환경에서 spring boot batch 모니터링이 필요한데, 방향을 어떻게 잡는게 좋을지 문의해봅니다.

2018-07-31 17:48

우선 요구조건 1) spring boot batch 의 각 job 수행여부를 모니터해야하고, 실시간으로 job 구동 및 성공여부 등을 실시간으로 알림이 필요합니다.

알림의 매체는 email 혹은 line 등의 메신저 사용입니다. (알림 자체가 중요하므로 매체는 크게 중요하지 않을 것 같습니다.) 이 부분은 사실 application 이 살아있기 때문에 방법이 다양할 것 같아 큰 고민이 없긴 합니다만 일반적인? 방법의 노하우를 듣고 이해하고 싶습니다.

진짜 중요한 부분은 아래 요구조건입니다. 2) aws ec2 환경에서 spring boot batch alive 상태를 모니터해야하고, 만약 어플리케이션이 죽었다면 역시 실시간으로 알림이 필요합니다.

ec2 인스턴스 자체의 사망은 논외로 하구요, 어플리케이션 사망을 캐치해야하는 이슈입니다. 어플리케이션 사망은 매우 다양한 경우의 수가 있어서 spring boot lifecycle 로 접근하기는 어려울듯 싶습니다. ec2 인스턴스를 사용하기 때문에 aws cloud watch를 사용하는 방법이 있을 것 같은데, 올바른 방향인지 고민입니다.

혹시 경험해주신 분 계시다면 노하우를 공유 부탁드립니다.

7개의 의견 from SLiPP

2018-08-01 11:01

@kimmunsu 안녕하세요~

Spring Actuator

AWS를 사용하면, 말씀하신대로 cloud watch로 모니터링하면 되지 않을까 싶어요. Spring Actuator를 사용하시면 health check가 가능한 endpoint를 제공합니다. (https://docs.spring.io/spring-boot/docs/current/actuator-api/html/)

그런데 Actuator를 사용하려면 한가지 주의할게 있습니다. Actuator는 Spring Boot 기반인데, 추가된 의존성의 health를 모두 체크합니다. 예를 들면 redis dependency를 추가했다면, redis health check도 하게되죠. 이게 왜 문제냐면, redis가 죽어도 애플리케이션은 죽은게 아니라고 판단해야될 경우에 문제가 되겠죠.

배치 작업이 웹 애플리케이션 처럼 계속 실행되야 하는가?

작성하신 글로 추측해보자면, quartz와 같은 라이브러리를 사용해서 계속 살아 있으면서 특정 주기 마다 배치가 수행되는 작업인거 같은데, 배치 애플리케이션이 항상 alive 상태여야 할까요? 배치 수행 주기가 매우 빠른 (초 단위) 주기로 실행한다면 상관 없지만, 주기가 꽤 긴 배치라면, jenkins와 같은 툴로 스케줄링을 관리하고 Spring batch를 단발성으로 실행하게 하면 어떨까요? 그럼 애플리케이션이 살아있는지 체크를 할 필요도 없을뿐더러, 자원도 낭비하지 않을거 같은데요.

2018-08-01 11:11

@woniper 땡큐!!!! 우선 Spring Actuator 를 살펴볼게 ㅎㅎ 그리고 우선 아래 질문에 대한 선답을 하자면.. 우리 배치작업은 초단위로 수행하는 작업이 몇몇 있어서 계속 alive 한 상태인지를 체크해야해 ㅠㅠ

2018-08-02 09:25

애플리케이션의 사망 캐치는 aws의 헬스체크 정도만 해도 무난할 듯 한데, 그 이상 배치의 태스크 단위로 실행 여부를 판단하려면 역시 Admin(Jenkins, Batch-Admin)을 도입 하는게 좋아보이는..

2018-08-02 10:51

@eclipse4j 음.. 배치 어드민에서 혹시 실시간캐치가 가능할까요...? 수행여부를 노티알려야 하는데 그 기능을 제가 잠깐 살펴봤는지 못봐서 ㅠㅠ 해당 시점에 배치구동이 되어야 하는데 안되었다라던가..

2018-09-06 15:25

@woniper @eclipse4j 급 현타오는 문제...

애플리케이션 사망 캐치를 하려고 보니 batch 를 돌리는 ec2 인스턴스는 public ip가 없이 private ip 만 존재.. 거기에 추가로 로드밸런싱이 필요없는 단일 인스턴스라서 health check 를 지원하는 ec2 대상그룹을 사용할 수가 없음. 그래서 방향은 비슷하되 우회해서 구현하려는 방식은 aws 람다 함수로 특정 인스턴스를 찾아 해당 인스턴스의 특정 포트가 살아있는지 체크. (혹은 health url 하나 파서 ping...) 이렇게 해결하려고 하는데 정녕 이 방식이 맞는지 스스로 자문했을때 이것밖에 못찾겠어서 이것이 맞는 느낌으로 구현중. (여기서 답답한건 ec2 인스턴스를 찾을 때 태그를 활용하려는데, aws document 에서는 instance id 로 찾는건 많은데 태그로 찾는건 안보여서 계속 헤매는중 ㅎㅎ) 관련해서 경험하신 분 계실까요~?

참조중인 document 는 https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

의견 추가하기

연관태그

← 목록으로