Profile picture

[Shell Script] 디스코드 웹 훅(web hook)으로 서버 자원 알림 받기

JaehyoJJAng2024년 01월 22일

◾️ 개요

현재 게임 서비스를 운영 중인 도커 서버에서는 메모리 점유율이 70%를 초과할 경우 자동으로 도커 서비스가 종료되고 재시작하는 스크립트를 작성하여 crontab에 등록하고 있다.

그러나, 현재 운영 중인 디스코드 채널에 메모리 점유율 경고를 알림 형식으로 전송하는 것이 유용하다고 판단하여 이에 관한 글을 작성하게 되었다


◾️ 사전 준비

image


◾️ Web hook 생성

1. 웹 훅을 활성화 할 채널의 설정을 들어가보자.
image


2. 연동 탭 - 웹 후크 만들기 클릭
image


3. 설정할 Bot 이름 및 활성화할 채널을 지정해주고 웹 후크 URL을 복사
image
💥 복사한 웹 훅 URL을 어딘가에 저장해놓도록 하자.


◾️ 셸 스크립트 작성

이제 모든 준비가 끝났으니 서버 메모리 점유율을 확인하는 스크립트를 작성하고

10분마다 해당 스크립트를 실행할 수 있도록 Crontab에 등록하면 된다.


먼저 기본 템플릿은 아래와 같다.
webhook_기본.sh

#!/bin/bash

##
# Discord Webhook
# Change the 'your_discord_webhook_name' with your actual Discord Webhook
##

discord_url="your_discord_webhook_name"
generate_post_data() {
  cat <<EOF
{
  "content": "Hello! World!",
  "embeds": [{
    "title": "Embeded Title",
    "description": "Description",
    "color": "45973"
  }]
}
EOF
}

# POST request to Discord Webhook
curl -H "Content-Type: application/json" -X POST -d "$(generate_post_data)" $discord_url

이제 예시도 살펴봤으니 본격적으로 알람용 스크립트를 작성해보자.

스크립트를 작성하기 전에 먼저 jq 패키지를 설치해야한다.

sudo apt-get install -y jq

jq는 커맨드 라인에서 JSON 데이터를 다루고 처리하는 데 사용되는 강력한 도구이다.

jq 명령어 관련 예시가 궁금하다면 다음 게시글을 참고하도록 하자
👉 jq 명령어 알아보기 - WTT Devlog


script1.sh

#!/usr/bin/bash

HOST="master"
LOG_FILE="/home/${HOST}/discord-webhook/shell-script/webhook_log"
WEBHOOK_URL_FILE="/home/${HOST}/discord-webhook/shell-script/.webhook_url.txt"
DISCORD_WEBHOOK_URL=$(awk -F '=' '{print $2}' "$WEBHOOK_URL_FILE")

# 메모리 점유율 확인
MEMORY_USAGE=$(free | grep 'Mem' | awk '{print int($3/$2 * 100.0)}')

if [[ "$MEMORY_USAGE" -le 30 ]]; then
    color=2003199
elif [[ "$MEMORY_USAGE" -le 50 ]]; then
    color=16747520
elif [[ "$MEMORY_USAGE" -le 60 ]]; then
    color=16711680
else
    color=0
fi

# 보낼 Embed 메시지 작성
MEMORY_MESSAGE="현재 서버의 메모리 점유율은 $MEMORY_USAGE% 입니다."
REBOOT_MESSAGE="메모리 점유율이 70% 이상 올라갈 시 자동 재부팅 됩니다."

# JSON 데이터 인코딩
DATA=$( jq -n \
    --arg mm "$MEMORY_MESSAGE" \
    --arg rm "$REBOOT_MESSAGE" \
    --arg c "$color" \
    '{ content: " ", embeds: [ { title: "서버 메모리 상태", description: $mm, color: $c, fields: [ { name: "자동 재부팅", value: $rm, inline: false } ] } ] }' )

# curl을 사용하여 웹훅 호출
curl -X POST -H "Content-Type: application/json" -d "$DATA" "$DISCORD_WEBHOOK_URL"

# curl의 반환 코드를 확인하여 로그 파일에 결과 기록
if [[ $? != 0 ]]; then
    echo "디스코드 메시지 전송 실패!" >> "$LOG_FILE"
else
    echo "디스코드 메시지 전송 성공!" >> "$LOG_FILE"
fi

▪️ 실행 결과

위 스크립트에 실행 권한을 부여하고 스크립트를 실행해보자.

# 실행 권한 부여
chmod u+x script.sh

# 스크립트 실행
bash script.sh

image


◾️ crontab 등록

crontab -e

*/10 * * * * bash /home/master/discord-webhook/shell-script/script.sh > /home/master/discord-webhook/shell-script/cronLog 2>&1

Loading script...