@senspond
>
도커 서비스 중단시 Slack 알람 발송 세팅하기
이 rgbitcode 블로그는 2023년부터 중단 된 기간 없이 운영을 해오고 있었다.
하지만, 2025년 6월 14일 ~ 6월 20일 오전까지 사이트를 이용 할 수 없던 것으로 파악된다.
최근 이 블로그에 들어오지 않아서 모르고 있었다.
20일 오전 7시에 발견을 하고 조치를 했다.
현재 이 블로그 서버는 블로그 용으로만 쓰기에는 다소 과한 사양으로 개인 개발용 서버와 함께 겸하고 있다.
정확하게는 OCI A1 4Core CPU 24GB RAM 사양으로 쓰고 있다.
블로그도 서비스 형태로 만들어 놓기는 했지만, 가입을 받지 않고 혼자서만 사용하고 있고
다른 용도로 리뉴얼을 생각해보고 있기도 하다. 블로그로만 쓰기엔 서버자원이 아깝다는 느낌도 있다.
6월 14일날 테스트로 이 서버에서 다소 무거운 작업을 테스트를 해봤다.
특정 인공지능 모델을 CPU 만으로 어느정도 추론 속도로 가능할지 테스트를 해보고자, AI 모델 추론을 해봤다.
결과는 4core CPU를 400% 가깝게 사용을 하였고, RAM은 2GB 이상 사용하였다.
이날 저 모델을 한번 돌려본게 아니라, 여러번 반복해서 테스트를 해봤다.
그런데 이 작업으로 인해 Spring Boot 기반의 백엔드 API 서비스가 중단되어 있던 것이다.
그 사실을 미쳐 모르고 있었다.
이로 인해 CPU 에 많은 부하를 주는 작업을 수행하는 것만으로도 도커 서비스가 중단 될 수도 있다는 사실을 알게 됬다.
일단, 서비스를 다시 가동시켜 놨다.
블로그의 방문 데이터를 각 게시물 당 / 일별로 통계를 내며 2년간 수집되고 있었는데, 해당 기간 데이터가 누락이 되었다.
Redis에 방문 데이터를 쌓고 배치 스케쥴러로 매일 자정에 DB에 업데이트 하는 식으로 구성 했었다.
이번처럼 특별히 서버를 건드리지 않는다면, 이번 처럼 멈춰있는 일이 발생 할 가능성은 희박하지만
Slack으로 자동 알림이 가도록 만들어줘야 할것 같다.
채널 ID를 복사해둔다.
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/웹훅URL"
CHANNEL="채널 ID"
# Slack 메시지 전송
curl -X POST -H 'Content-type: application/json' \
--data "{
\"channel\": \"$CHANNEL\",
\"username\": \"System\",
\"text\": \"테스트 메시지 입니다."
}" \
$SLACK_WEBHOOK_URL"
복사한 채널 ID를 넣으면 된다.
응답이 오는 것을 확인한다.
다음은 도커 서비스 상태를 체크할 수 있는 스크립트를 작성
check_service.sh
#!/bin/bash
CONTAINER_NAME="$1"
if [ -z "$CONTAINER_NAME" ]; then
echo "컨테이너 이름이 입력되지 않았습니다."
exit 1
fi
# 컨테이너 ID 확인
CONTAINER_ID=$(docker ps -a -q -f "name=^/${CONTAINER_NAME}$")
if [ -z "$CONTAINER_ID" ]; then
echo "컨테이너 $CONTAINER_NAME 없음"
exit 0
fi
# 상태 조회
status=$(docker inspect -f '{{.State.Status}}' "$CONTAINER_ID" 2>/dev/null)
echo "컨테이너 $CONTAINER_NAME 상태: $status"
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/웹훅URL"
CHANNEL="채널 ID"
USERNAME="DockerMonitorBot"
# Slack 메시지 전송
curl -X POST -H 'Content-type: application/json' \
--data "{
\"channel\": \"$CHANNEL\",
\"username\": \"$USERNAME\",
\"text\": \"컨테이너 *$CONTAINER_NAME* 상태 : *$status*\"
}" \
$SLACK_WEBHOOK_URL"
확인해본다.
chmod +x check_service.sh
./check_service.sh api_was1
api_was1 도커 컨테이너의 상태를 체크하고 Slack으로 전송했다.
하지만, 문제가 생겼을 때만 알림을 받고 싶으므로 조건문을 하나 추가.
check_service.sh
#!/bin/bash
CONTAINER_NAME="$1"
if [ -z "$CONTAINER_NAME" ]; then
echo "컨테이너 이름이 입력되지 않았습니다."
exit 1
fi
# 컨테이너 ID 확인
CONTAINER_ID=$(docker ps -a -q -f "name=^/${CONTAINER_NAME}$")
if [ -z "$CONTAINER_ID" ]; then
echo "컨테이너 $CONTAINER_NAME 없음"
exit 0
fi
# 상태 조회
status=$(docker inspect -f '{{.State.Status}}' "$CONTAINER_ID" 2>/dev/null)
if [ "$status" != "running" ]; then
echo "컨테이너 $CONTAINER_NAME 상태: $status"
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/웹훅URL"
CHANNEL="채널 ID"
USERNAME="DockerMonitorBot"
# Slack 메시지 전송
curl -X POST -H 'Content-type: application/json' \
--data "{
\"channel\": \"$CHANNEL\",
\"username\": \"$USERNAME\",
\"text\": \"컨테이너 *$CONTAINER_NAME* 상태 : *$status*\"
}" \
"$SLACK_WEBHOOK_URL"
fi
상태가 running이 아닐 때만 메시지 전송한다.
check_all_service.sh
#!/bin/bash
# 확인할 컨테이너 이름 리스트
CONTAINERS=("api_was1" "api_was2" "nginx" "redis")
for cname in "${CONTAINERS[@]}"; do
/경로/check_service.sh "$cname"
done
check_service.sh 를 통해 각 서비스를 체크한다.
CONTAINERS 에 체크할 도커 컨네이너명들을 나열하면 된다.
chmod +x /경로/check_all_service.sh
crontab -e
crontab 에 등록한다.
0 * * * * /경로/check_all_service.sh
crontab으로 일정 주기마다 서비스를 체크한다.
만약 멈춰있는 도커 서비스가 있다면, Slack 으로 메시지가 전송된다.
Slack은 모바일 앱으로도 사용이 가능해서, 보다 빠르게 인지를 할 수가 있다.
안녕하세요. Red, Green, Blue 가 만나 새로운 세상을 만들어 나가겠다는 이상을 가진 개발자의 개인공간입니다.
현재글에서 작성자가 발행한 같은 카테고리내 이전, 다음 글들을 보여줍니다
@senspond
>