백엔드(Back-end)/AWS

[AWS] EC2 디스크 사용량 부족할때 슬랙으로 알림보내기! 디스크 사용량 모니터링 초 간단 방법

기록하는 동구 2022. 1. 8. 23:01
반응형

 

긴급 문제 발생 !

 

주말에 쉬고있는데 회사 사업팀 동료가 회사 서비스 페이지가 접속이 안된다고 연락이왔다.

 

 

로그를 보니 대충 DB가 작동을 안하길래 원인을 파악해보니 DB를 올려놓은 EC2 서버의 디스크 사용량이 가득차서 DB가 죽었다.

 

사실 이런건은 전에도 있어서 클라우드에서 볼륨을 높여주고 적용했었지만, 서버 디스크 사용을 최적화 하지않는 이상 계속 일어날 일이였다. 당시에는 임시방편으로 디스크 볼륨을 확장시켜줘서 끝났지만, 언제간 다시 일어날 일이 오늘 바로 터진것이다. 계속 이렇게 된다면 앞으로도 소 잃고 외양간 고치는 격이다.  [EC2 디스크 용량을 확장하는 방법은 아래를 참고하면 도움이 될거에요!]

 

2020.12.16 - [AWS] 문제 해결 : 디스크용량이 부족할때 EBS 볼륨 늘리기

 

[AWS] 문제 해결 : 디스크용량이 부족할때 EBS 볼륨 늘리기

문제 발생! cp: writing `syslogbackup`: No space left on device cs 갑자기 서버가 마비되서 ec2를 접속해보니 이런 터미널 오류가뜨면서 공간이없다고 나온다. 해결하러 가보자! 디스크 용량 확인 $ df -hT c..

donggu1105.tistory.com

 

그래서 EC2 디스크 사용량이 일정량 이상 높아진다면, 회사에서 쓰는 슬랙채널로 알림을 보내게 만들어 보았다

 

결과는 이렇습니다!

 

 


 

자 이제 한번 만들어볼까요?  목차는 다음과 같습니다.

 

  1. 슬랙에 알림을 보낼수 있는 incoming webhook 설정을 한다. (쉽게 애기하면, 채널에 메시지를 보내는 URL을 생성하고 요청을 할수있게 만든다)
  2. 리눅스 명령어를 통해 해당 EC2 서버에 디스크 사용량을 체크하고 일정 사용량이상으로 늘어나면 메시지를 보내는 쉘 스크립트를 생성한다.
  3. 해당 쉘 스크립트를 정기적으로 실행시키는 크론탭을 설정한다.

 

1.  슬랙 webhook API 만들기 

https://jojoldu.tistory.com/552

 

Slack Webhook API 생성하기

요즘 대부분의 개발도구들은 Slack과의 통합 (Integration)을 지원하지만, 여전히 미지원 하는 도구들도 많습니다. 이런 미지원 도구들을 Slack에 연동할때 Slack Webhook을 사용합니다. 저도 종종 사용하

jojoldu.tistory.com

슬랙 incoming webhook 관련 설명은 조졸두님께서 친절히 설명을 해주셔서 내가 따로 할 필요가없다. 위에를 참고해주세요!

 

2. 리눅스 쉘 스크립트 작성

 

EC2 디스크 사용량을 체크 하는 리눅스 쉘 스크립트 코드는 다음과 같다. 아래에서 설명을 해보도록 하겠습니다.

1
2
3
4
5
6
IP=$(hostname -I);
LIMIT=90;
slack_webhook_url="https://hooks.slack.com/{Slack Webhook URL}"
root_disk_used=$(df / | grep ^/ | awk '{print $5}');
root_disk_used=${root_disk_used::-1};
test $LIMIT -lt $root_disk_used && curl -X POST --data-urlencode "payload={\"channel\": \"#alert\", \"username\": \"disk_use_alert\", \"text\": \"Usage of disk is in danger. IP: $IP ROOT_DISK_USAGE: $root_disk_used % <https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#Instances:search=$IP |Click here to go AWS EC2 Instance > \", \"icon_emoji\": \":sunrise:\"}" $slack_webhook_url;
cs

 

쉘 스크립트 설명

 

1. IP=$(hostname -I);

: hostname -l 로 현재 host의 ip를 받아온후 IP라는 변수에 저장

 

2. LIMIT=90;

: 디스크 사용량 90 이상일때 알림오도록 설정

 

3. slack_webhook_url="https://hooks.slack.com/{Slack Webhook URL}"

: 슬랙 메시지를 보낼 URL 변수 지정

 

4.

root_disk_used=$(df /| grep ^/| awk '{print $5}');   

root_disk_used=${root_disk_used::-1};

: 디스크 사용량을 숫자로 뽑아내기 

df / -> 루트 디렉토리의 용량 상태 확인

grep ^/ | awk '{print $5}' -> 5번째 블락인 사용률 가져오기 

${root_disk_used::-1}; -> % 퍼센트 짜르기

 

5.

test $LIMIT -lt $root_disk_used && curl -X POST --data-urlencode "payload={\"channel\": \"#alert\", \"username\": \"disk_use_alert\", \"text\": \"Usage of disk is in danger. IP: $IP ROOT_DISK_USAGE: $root_disk_used % <https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#Instances:search=$IP |Click here to go AWS EC2 Instance > \", \"icon_emoji\": \":sunrise:\"}" $slack_webhook_url;

: #alert 채널에 disk_use_alert라는 이름으로 text의 value값을 슬랙 메시지를 보낸다.

 

 

 

자 이제, EC2 디스크사용량을 체크해 슬랙으로 알림을 보낼수있는 쉘 스크립트를 작성했습니다. 이제 이 스크립트를 주기적으로 작동시키는 크론탭을 만들어보죠.

 

 

3. 크론탭 설정

https://jdm.kr/blog/2

 

리눅스 크론탭(Linux Crontab) 사용법 :: JDM's Blog

* 이 포스팅은 네이버 블로그에서 작성(2013.04.01)한 내용을 옮겨온 것입니다. 오늘은 리눅스 크론탭에 대해 알아볼까 합니다. 음, 윈도우에서는 스케줄러와 비슷하다고 보면 되겠네요. "특정 시간

jdm.kr

 

이분이 크론탭 설정하는법을 기가막히게 설명해주셔서 저는 그대로 배꼈습니다. ㅋㅋㅋ

크론탭 설정 결과는 다음과 같습니다. 

1
*/30 * * * * /usr/local/bin/volume_check_script.sh
cs

 

저는 30분마다 /usr/local/bin/volume_check_script.sh를 실행시키도록 만들었습니다.

 

 

혹시나 크론탭이 실행이 안된다면?

 

크론식도 잘 쓰고 스크립트도 잘 작성했는데 실행이 안되는거 같으면 꼭 스크립트의 실행권한이 있는지 확인하세요! 전 이것때문에 좀 삽질을 했습니다. ls -al 명령어를 쳐보시고,

 

위와 같이 파일에 x가 있어야 실행권한이 있는겁니다. 

 

만약에 없다면 , 다음과 같이 실행권한을 주시면 해결 됩니다!

1
chmod +/usr/local/bin/volume_check_script.sh
cs

 

이상, AWS EC2 디스크 사용량 모니터링 시스템 만들기 였습니다. 읽어주셔서 감사합니다. 도움이 되길 바랍니다~

 

 

참고 :

https://jdm.kr/blog/2

https://jhnyang.tistory.com/146

https://jojoldu.tistory.com/552

https://lion-king.tistory.com/entry/AWS-EC2-instance-disk-usage-alert?category=854360 

반응형