본문 바로가기
Infra

(AWS/CloudWatch) EC2 인스턴스 디스크 사용량 알림/모니터링 구현

by Developer RyanKim 2020. 2. 28.

출처:https://www.css4hosting.com/sunrise/index.php?rp=%2Fknowledgebase%2F27%2FWindows-10-100-disk-usage-in-Task-Manager-SOLVED.html&language=turkish

EC2 인스턴스 디스크 사용량 알림 모니터링

 

Node 서버에서 root 경로에 로그가 제한없이 계속 쌓여 용량을 다 사용해버려서 배포가 막히는 이슈가 발생하였습니다...

따로 마운트 해준 EBS 볼륨에 쌓는것이 아니었나봅니다 ㅠㅠ

 

제가 Node 서버 EC2 인스턴스와 로드밸런서 세팅을 다 해주기는 했지만

Node를 개발하지도 않고 많이 신경을 쓰지못해서 조금 큰일이 터졌네요

 

먼저 근본적인 문제를 해결하고 추후 이런일을 방지하기위해 모니터링 시스템을 구축하기로 하였습니다.

AWS CloudWatch를 통해 디스크 사용량을 모니터링 하려고 하였으나 관련 기능을 도저히 찾을 수 없어

AWS 인프라 파트너사에 문의하였습니다.

 

답변요약 ↓

 

aws 자체 서비스로는 cloudwatch agent를 이용하는 것 외에는 없음.

디스크 사용량의 경우 단순 EBS 볼륨의 정보가 아니라 OS 내의 파일시스템 정보이기에 외부에서 파악 할 수 없음.

(단순 리눅스 내부의 명령어를 이용하는) 별도의 3rd 솔루션을 이용하실 수도 있겠지만, 비용/관리 리소스가 추가되는 부분으로​ 단순히 disk 용량 모니터링이 목적이라면 cloudwatch agent를 사용하는 것이 가장 간편한 방법이라고함.

cloudwatch agent 관련 문서

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

 

https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

CloudWatch 에이전트를 사용하여 Amazon EC2 인스턴스 및 온프레미스 서버로부터 지표 및 로그 수집

docs.aws.amazon.com


여러 방법을 찾았었지만 대부분의 글에는 cloudwatch agent를 사용하는 방법 뿐이었습니다.

하지만 이부분에 개발 리소스를 많이 할당 하고싶지 않아서 간단하게 리눅스로 구현하였습니다.

 

아래는 회사 컨플루언스에 작성한 글 일부입니다.

 


기능

  • linux 명령어를 통해 디스크 용량 체크 후 특정 조건이 만족되면 알림을 주도록 crontab 설정

설정 인스턴스

  • 온 프레미스로 배포되는 서비스들이 디스크용량 문제가 생길 확률이 큼

1. 사전준비 - slack webhook 설정

참고: https://zeddios.tistory.com/123
https://api.slack.com/messaging/webhooks

 

Sending messages using Incoming Webhooks

Learn how to build bot users, send notifications, and interact with workspaces using our APIs.

api.slack.com

 

2.실행파일작성

IP=$(hostname -I);
LIMIT=90;
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\": \"#infra_watch\", \"username\": \"waug_watch\", \"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:\"}" https://hooks.slack.com/{Slack Webhook URL};

mount_disk_used=$(df /data | grep ^/ | awk '{print $5}');
mount_disk_used=${mount_disk_used::-1};
test -z $mount_disk_used || test $LIMIT -lt $mount_disk_used && curl -X POST --data-urlencode "payload={\"channel\": \"#infra_watch\", \"username\": \"waug_watch\", \"text\": \"Usage of disk is in danger. IP: $IP MOUNT_DISK_USAGE: $mount_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:\"}" https://hooks.slack.com/{Slack Webhook URL};

 

  1. IP=$(hostname -I);
    : hostname -l 로 현재 host의 ip를 받아온후 IP라는 변수에 저장

  2. LIMIT=90;
    : 90 퍼센트 이상일때 알림

  3. root_disk_used=$(df / | grep ^/ | awk '{print $5}');
    : df / → 루트 디렉토리의 용량상태 확인
    : | grep ^/ | awk '{print $5}' 그중에 5번째 열의 결과값( disk usage% ) 을 가져옴 그후 변수저장

  4. root_disk_used=${root_disk_used::-1};
    : 비교를 위해 마지막 문자열 제거 (ex. 30% → 30)

  5. test $LIMIT -lt $root_disk_used && curl -X POST --data-urlencode "payload={\"channel\": \"#infra_watch\", \"username\": \"waug_watch\", \"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:\"}" https://hooks.slack.com/{URL};
    : test $LIMIT -lt $root_disk_used && → LIMIT 와 root_disk_used를 -lt 연산자를 통해 비교 (왼쪽이 더 작으면 true) 후 참이면 실행 (&&)
    : curl ~~~~~~~~~~~ →  slack webhook이 걸린 채널에 메세지 전송.
    메세지 내용 클릭시 해당 인스턴스 검색결과로 연결되도록 커스터마이징 하였음

3. 크론탭에 위 실행파일을 실행시키도록 등록

 


저는 EC2 Instance의 디스크 사용량이 90% 이상일 때 Slack 메세지가 오도록 설정하였습니다.
위 스크립트를 보고 사용량 조건이나 알림 오는방법을 커스터마이징 해서 구현하시면 좋을것 같습니다.

 

crontab 설정하는법은 조만간 또 포스트 작성하겠습니다!

 

읽어주셔서 감사합니다~

 

By Ryan Kim

댓글