Infra/AWS

[AWS] EC2 인스턴스 스토리지 용량 Slack 알람 세팅하기

devson 2023. 3. 12. 13:03

최근에 EC2 인스턴스에서 기동 중인 백오피스 툴이 스토리지 용량이 꽉차서 제대로 동작하지 않았던 적이 있다.

원인을 파악하고 EBS 용량을 증가시키는 동안 백오피스 툴을 사용할 수 없었는데

사후에 대처를 잘하는 것도 중요하지만, 사전에 미리 위험을 감지할 수 있는 시스템을 구축하는 것도 중요하다.

 

이번 포스팅에서는 crontab을 통해 주기적으로 파이썬 스크립트를 통해 EC2 인스턴스의 스토리지 용량을 확인하고 용량이 모자른다고 판단되면 Slack 알람을 보내는 예제에 대해 알아보겠다.

(OS는 Ubuntu 기반으로 설명한다)

 

EC2 인스턴스에 CloudWatch Agent를 설치하여 CloudWatch 알람을 받는 방식도 있지만,
단순히 스토리지 용량을 모니터링하기 위함이라면 어쩌면 배보다 배꼽이 더 큰 작업이 될 수 있다.
상황에 맞게 스토리지 용량 뿐만아니라 다양한 지표를 모니터링 해야한다면 CloudWatch Agent를 사용하는 방식을 고려해보자.
참고 - [AWS] CloudWatch로 EC2 디스크 사용량 모니터링 및 알림받기

Slack Incoming Webhook 설정

알람을 받을 Slack Incoming Webhook을 생성하고 설정한다.

이는 Slack 공식 사이트 뿐만 아니라 잘 정리된 글이 많기 때문에 링크로 대체한다.

- Sending messages using Incoming Webhooks

- Slack Webhook API 생성하기

 

파이썬 스크립트

먼저 스토리지 사용량에 대한 데이터를 조회하기 위해서 built-in 모듈인 shutil 을 사용한다.

스토리지 사용량이 일정 수치 이상이라면 requests 라이브러리를 통해 Slack Incoming Webhook에 메세지 전송 요청을 보낸다.

 

스크립트 코드는 아래와 같다.

import shutil
import requests

threshold = 90 # 용량이 해당 %까지 차면 알람을 보낸다
slack_webhook_url = "" # <== Slack Incoming Webhook url

total, used, free = shutil.disk_usage("/") # 스토리지 사용량을 조회한다
used_percent = (used / total * 100)

if threshold < used_percent:
    total_label, used_label, free_label = shutil.disk_usage("/")._fields

    total_mb_str = f"{(total / 2 ** 20):,.2f} MB"
    used_mb_str = f"{(used / 2 ** 20):,.2f} MB"
    free_mb_str = f"{(free / 2 ** 20):,.2f} MB"
    used_percent_str = f"{(used / total * 100):.2f}%"

    summary = f"{total_label}: {total_mb_str} / {used_label}: {used_mb_str} / {free_mb_str}: {free_mb_str} / Use%: {used_percent_str}"

    # Incoming Webhook을 통해 알람 Slack 메세지를 보낸다
    requests.post(
        slack_webhook_url,
        json={
            "username": "EC2 디스크 부족 알람",
            "icon_emoji": ":floppy_disk:",
            "text": f"디스크가 설정한 용량 제한({threshold}%)에 도달했습니다.\n{summary}"
        }
    )

 

위 스크립트를 통해 이런 형식의 Slack 알람을 받게된다.

테스트를 위해 실제 사용량이 90%에 도달하지 않았지만 메세지를 보내도록 하였다

 

서버 환경 설정

이제 위 스크립트가 동작할 수 있는 환경을 설정한다.

새로 Ubuntu EC2 인스턴스를 생성했다는 기준으로 아래와 같이 설정을 한다.

$ sudo apt update
$ sudo apt install python3-pip

 

crontab 등록

이제 스크립트를 주기적으로 실행하기 위해 아래와 같이 crontab을 등록한다.

아래의 예제는 매 시간 모니터링 스크립트를 실행하는 코드이다.

$ sudo vi /etc/crontab

# 아래 코드 추가
0 * * * * ubuntu python3 /home/ubuntu/path/to/your/script.py

 

모든 세팅은 끝이고 슬랙 알람이 오게되면 스토리지를 확인하여 불필요한 파일을 삭제하거나 EBS 용량을 증가시켜주면 해주면 된다.