AI/도커(Docker)

[기타] 도커 컨테이너 종료 시 알람(telegram으로 알람 받기)

mingchin 2024. 4. 26. 18:41
728x90
반응형

학습 서버가 제대로 동작하고 있는지 확인하는 것은 모델링 과정에서 필수적이고, 꽤나 중요한 작업이다. 최근 사양이 좋은 서버를 담당하며 그 중요성이 더 커져서 주말에도 모니터에 로그를 띄워놓고 확인하곤 했는데, 늘 서버를 들여다 보고 있어야 한다는 것은 꽤나 고역이고,, 주말에 모니터링을 한다는 건 사실 없어야 하는 일이다. 따라서 해당 문제를 해결하고자 아래 작업을 수행했다.

 

현황 파악 및 목표 설정


  • 현황
    • 현재 빌더는 docker container 기반으로 실행한다. 컨테이너를 띄워놓고 그 안에서 작업이 이루어지는게 아니라, 일회성으로 (--rm 옵션) 컨터이너를 띄우고 내리기 때문에 그 프로세스가 종료 되었는지 여부가 곧 작업이 정상적으로 진행되고 있는지에 해당한다. 즉, 프로세스가 잘 살아 있는지를 알람으로 연결하면 된다.
    • 프로세스가 살아 있는지 확인하는 작업은 어렵지 않고, 이미 구현되어 있다.
  • 목표 설정
    • 프로세스 종료 여부를 내가 찾아가서 보지 않아도 눈앞에 보여지는 모바일 알람이 필요하다.
    • 알람은 어떤 서버에서 누구의 어떤 작업이 종료되었는지 포함해야 한다.

구현


아주 간단한 기능이었지만, 리눅스 내 이메일 기능으로는 outlook에 접근이 어려웠다. slack이나 telegram에는 이미 python API가 존재해 알람용 봇을 생성하고 리눅스 서버와 연결이 가능하다는 정보를 얻어, 나에게 좀 더 생소한 telegram을 선택했다.

 

1) 프로세스 종료 여부 확인

 

# 컨테이너 실행
docker run -d --rm ~

# 실행 스크립트의 프로세스 ID 할당
PROC_ID=$!

# 프로세스 종료 여부 확인
ALARM=false
while kill -0 "$PROC_ID" 2> /dev/null; do
    ALARM=true
    sleep 1.
done

 

docker 컨테이너를 실행하기 위한 cmd를 구성하고 실제 실행하는 스크립트가 별도로 있었기에, 해당 스크립트의 프로세스 ID를 추적해 살아 있는지를 "kill -0"으로 확인했다. 사실 while 루프이기에 알람 관련 로직을 아래 쪽에 위치시키면 ALARM 인자는 불필요해 보인다.

 

2) alarm을 위한 파이썬 스크립트 구성

 

import telegram
import asyncio
import sys

token = "your_token" 
bot = telegram.Bot(token = token)
chat_id = "your_id"

async def main(args): #실행시킬 함수명 임의지정
    server_ip = args[0]
    user = args[1].upper()
    action = args[2].upper()
    await bot.send_message(chat_id, f'Hi {user}, action {action} done in {server_ip}')

if __name__ == "__main__":
    args = sys.argv[1:]
    asyncio.run(main(args)) #봇 실행하는 코드

 

텔레그램을 설치하고 bot을 생성하는 과정,그리고 API 업데이트로 인해 async를 적용해야 하는 등의 정보는 이 글을 참고했다. user 정보, 어떤 action을 도커에 던졌는지, 해당 서버가 어디인지를 추적하고자 하였다.

 

3) alram 실행 코드 추가

 

# 서버 내 ip 주소 추적 및 실행
if [ ${ALARM} = true ]; then
    python3 alarm.py `ip addr show $IP_NAME | grep -oP '(?<=inet\s)\d+(\.\d+){3}'` $USER $ACTION
fi

 

인자의 종류나 순서 등은 2의 코드 구성에 따라 달라진다.

 

결과 및 TO DO


결과

위와 같이 프로세스 종료 시점에 알람을 발송하는 봇을 만들었다. 여타 봇에게 특정 요청을 하고 싶은 경우에는, handler 관련 추가 분석 및 개발이 필요할 것으로 보인다. 서버 작업이 의도치 않게 종료되었는지 확인하기 위해 간단한 목표를 잡았으므로 코드가 확장성이 없는데, 추후 더 많은 상황에 대해 다양한 알람을 수신하고 싶은 경우 객체 구조를 정확히 잡고 추가 개발을 진행하고 싶다.

728x90
반응형