개요
기존 모니터링 앱에 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 컨테이너로 경량 배포