← 목록으로AWS

운영 서버 Port 모니터링 및 다중 알람 서비스 구축

2분 간격으로 운영 서버 포트 상태를 확인하고 이상 감지 시 SMS/Email/전화 알람을 자동 발송하는 야간 모니터링 시스템 구축

AWSMonitoringPythonAutomation
2024-07-15

개요

기존 모니터링 앱에 SMS / Email / 전화 알람 서비스를 추가하고 AWS에 배포했습니다.

운영 서버에 대한 야간 모니터링을 통해 긴급 상황 발생 시 담당자에게 즉시 알림을 전달하는 것이 목적입니다.


동작 방식

2분마다 대상 서버 포트 확인
    ↓
응답 코드 200 아닌 경우
또는 5초 이상 응답 없음
또는 5초 이상 연결 실패
    ↓
SMS / Email / 전화 알람 발송

알람 트리거 조건

조건설명
HTTP 응답 코드 != 200서버 오류 응답
응답 시간 > 5초서버 과부하 또는 지연
연결 실패 (5초 이상)서버 다운 또는 네트워크 단절

수행 주기

  • 기본: 24시간 상시 운영
  • 옵션: 저녁 시간대에만 동작하도록 스케줄 변경 가능

모니터링 대상

설정 파일을 통해 대상을 유동적으로 추가/삭제할 수 있습니다.

# monitoring_targets.yaml
targets:
  - name: "[SERVICE-A] AP1"
    url: "http://[internal-ip-1]:[port-1]"
  - name: "[SERVICE-A] AP2"
    url: "http://[internal-ip-2]:[port-1]"
  - name: "[SERVICE-B] AP1"
    url: "http://[internal-ip-1]:[port-2]"
  - name: "[SERVICE-B] AP2"
    url: "http://[internal-ip-2]:[port-2]"
  - name: "[SERVICE-B] AP1 Health"
    url: "http://[internal-ip-1]:[port-3]/hello"
  - name: "[SERVICE-B] AP2 Health"
    url: "http://[internal-ip-2]:[port-3]/hello"

알람 수단

SMS, Email, 전화 중 다중 선택 가능하며, 수신 대상은 설정 파일로 유동적으로 관리합니다.

SMS

def send_sms(recipients: list, message: str):
    sns = boto3.client('sns')
    for phone in recipients:
        sns.publish(
            PhoneNumber=phone,
            Message=message,
        )
 
# 사용 예시
send_sms(
    recipients=['[phone-1]', '[phone-2]', '[phone-3]'],
    message="운영 서버 포트 접속 에러입니다. 대응 부탁드립니다."
)

Email (SES)

def send_email(subject: str, body: str):
    ses = boto3.client('ses')
    ses.send_email(
        Source='[sender-email]',
        Destination={'ToAddresses': ['[team-email]']},
        Message={
            'Subject': {'Data': subject},
            'Body': {'Text': {'Data': body}}
        }
    )
 
# 사용 예시
send_email(
    subject='[긴급][운영 APP] Connection Timeout',
    body='운영 서버 포트 접속 에러입니다.'
)

전화 (Amazon Connect / Twilio)

def make_call(recipients: list, message: str):
    # 순차적으로 전화 발신
    for phone in recipients:
        client.calls.create(
            to=phone,
            from_='[caller-number]',
            tts_message=message
        )
 
# 순차 발신: 담당자1 → 담당자2 → 담당자3 → ...

포트 확인 핵심 로직

import requests
import time
 
TIMEOUT = 5  # 5초
 
def check_port(name: str, url: str) -> dict:
    try:
        start = time.time()
        response = requests.get(url, timeout=TIMEOUT)
        elapsed = time.time() - start
 
        if response.status_code != 200:
            return {
                'name': name,
                'status': 'ERROR',
                'reason': f'HTTP {response.status_code}',
                'elapsed': elapsed
            }
 
        if elapsed > TIMEOUT:
            return {
                'name': name,
                'status': 'SLOW',
                'reason': f'응답 지연 {elapsed:.1f}초',
                'elapsed': elapsed
            }
 
        return {'name': name, 'status': 'OK', 'elapsed': elapsed}
 
    except requests.exceptions.ConnectTimeout:
        return {'name': name, 'status': 'TIMEOUT', 'reason': '연결 시간 초과'}
    except requests.exceptions.ConnectionError:
        return {'name': name, 'status': 'DOWN', 'reason': '연결 실패'}

설정 파일 기반 수신자 관리

알람 수신 대상을 코드 변경 없이 설정 파일로 관리합니다.

# alarm_config.yaml
sms:
  enabled: true
  recipients:
    - "[phone-1]"
    - "[phone-2]"
    - "[phone-3]"
 
email:
  enabled: true
  from: "[sender-email]"
  to:
    - "[team-email]"
 
call:
  enabled: true
  recipients:
    - "[phone-1]"  # 1순위
    - "[phone-2]"  # 2순위
    - "[phone-3]"  # 3순위

배포 구성

Docker Container (Port Monitor)
    ├── 2분 간격 배치 실행
    ├── monitoring_logs.json 기록
    └── 이상 감지 시 알람 발송
        ├── AWS SNS (SMS)
        ├── AWS SES (Email)
        └── 전화 발신 서비스

운영 서버 내 Docker 컨테이너로 배포하여 별도 인프라 없이 운영합니다.

로그 확인

# 특정 환경 모니터링 로그 확인
docker exec -it [container-id] grep -c "[SERVICE-NAME] Prod" monitoring_logs.json

설계 포인트

설정 파일 기반 유연성 수신자 목록, 모니터링 대상, 알람 수단을 모두 설정 파일로 관리해 코드 변경 없이 운영 중 수정 가능합니다.

다중 알람 채널 SMS, Email, 전화를 독립적으로 활성화/비활성화할 수 있어 상황에 맞는 알람 전략을 유연하게 구성할 수 있습니다.

순차 전화 발신 전화 알람은 담당자 우선순위에 따라 순차적으로 발신해 책임자가 반드시 인지하도록 설계했습니다.


정리

  • 운영 서버 포트 상태 2분 간격 상시 모니터링 구축
  • HTTP 오류 / 응답 지연 / 연결 실패 3가지 조건 감지
  • SMS / Email / 전화 다중 알람 채널 구성
  • 설정 파일 기반으로 수신자 및 대상 유동적 관리
  • Docker 컨테이너로 경량 배포