← 목록으로AWS

CloudWatch 알람 기반 EC2/ECS 통합 모니터링 구축

EC2 인스턴스와 ECS 서비스 전반에 걸친 CloudWatch 알람 체계 설계 및 구축. 이메일/문자/전화/Slack 다중 알림 채널 운영.

AWSMonitoringDevOpsCloudWatch
2024-08-05

개요

운영 중인 EC2 인스턴스와 ECS 서비스 전반에 걸쳐 CloudWatch 알람 체계를 설계하고 구축했습니다.

단순 CPU 모니터링을 넘어 메모리, 디스크, IOPS, 시스템 상태, ECS Task Count까지 포괄하는 다층 알림 구조를 구성했으며, 심각도에 따라 이메일 / 문자 / 전화 / Slack으로 알림 채널을 분리했습니다.


알람 설계 원칙

심각도별 알림 채널 분리

단계지속 시간알림 방식설명
경고 (Warning)5분 (5/5)이메일초기 이상 감지
위험 (Critical)10분 (10/10)문자지속적 이상 상태
장애 (Down)1분 (1/1)문자 + 전화즉각 대응 필요
ECS 이상5분 (5/5)Slack태스크 수 변동 감지

EC2 모니터링 항목

EC2 인스턴스별로 다음 지표를 모니터링합니다.

시스템 리소스

지표경고 (5분)위험 (10분)
CPUUtilization이메일문자
mem_used_percent이메일문자
swap_used_percent이메일-
disk_used_percent (OS 볼륨)이메일문자
disk_used_percent (SW 볼륨)이메일문자
평균 IOPS 사용량이메일-
StatusCheckFailed문자 + 전화 (1분)-

StatusCheckFailed는 인스턴스 다운을 의미하므로 1분 단위로 즉시 문자 + 전화 알림을 설정했습니다.

CloudWatch Agent 설치

메모리, 스왑, 디스크 지표는 기본 CloudWatch 지표에 포함되지 않으므로 CloudWatch Agent를 각 인스턴스에 설치해 수집합니다.

# CloudWatch Agent 설치 (Amazon Linux 2)
sudo yum install amazon-cloudwatch-agent -y
 
# 설정 파일 적용
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config \
  -m ec2 \
  -s \
  -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

ECS 서비스 모니터링 항목

ECS 서비스는 Auto Scaling이 설정되지 않은 서비스의 경우 CloudWatch로 직접 모니터링합니다.

모니터링 지표

지표알림 방식비고
CPUUtilization이메일5분 (5/5)
mem_used_percent이메일5분 (5/5)
disk_used_percent이메일5분 (5/5)
RunningTaskCountSlack태스크 수 감소 시 즉시 알림

Auto Scaling이 설정된 서비스는 스케일링으로 자동 대응되지만, 미설정 서비스는 RunningTaskCount 알람으로 태스크 다운을 감지합니다.

RunningTaskCount 알람 설정 예시

import boto3
 
cloudwatch = boto3.client('cloudwatch')
 
cloudwatch.put_metric_alarm(
    AlarmName='ECS-Service-RunningTaskCount-Low',
    MetricName='RunningTaskCount',
    Namespace='AWS/ECS',
    Dimensions=[
        {'Name': 'ClusterName', 'Value': '[cluster-name]'},
        {'Name': 'ServiceName', 'Value': '[service-name]'},
    ],
    Statistic='Average',
    Period=300,        # 5분
    EvaluationPeriods=1,
    Threshold=1,
    ComparisonOperator='LessThanThreshold',
    AlarmActions=['[sns-topic-arn]'],  # Slack 연동 SNS
    TreatMissingData='breaching',
)

알림 채널 구성

SNS → 다중 채널 연동

CloudWatch Alarm
    ↓
SNS Topic
    ├── 이메일 구독 (Warning)
    ├── SMS 구독 (Critical)
    └── Lambda → Slack Webhook (ECS Task)

Slack 알림 Lambda 예시

import json
import urllib.request
 
def lambda_handler(event, context):
    message = json.loads(event['Records'][0]['Sns']['Message'])
    alarm_name = message['AlarmName']
    state = message['NewStateValue']
    reason = message['NewStateReason']
 
    payload = {
        "text": f":warning: *{alarm_name}*\n상태: {state}\n사유: {reason}"
    }
 
    req = urllib.request.Request(
        '[slack-webhook-url]',
        data=json.dumps(payload).encode(),
        headers={'Content-Type': 'application/json'}
    )
    urllib.request.urlopen(req)

모니터링 대상 범위

구축한 알람의 전체 범위:

EC2 인스턴스

  • 애플리케이션 서버 (Active/Standby 구성)
  • DB 서버 (Primary + Replica)
  • FTP 서버 (Windows, 다중 드라이브 모니터링)

ECS 서비스

  • Batch 서비스
  • API 서비스 (다수)
  • 외부 연동 서비스

모니터링 지표 총계

  • EC2 알람: 약 50개 이상
  • ECS 알람: 서비스당 4개 (CPU, Memory, Disk, TaskCount)

정리

이번 CloudWatch 알람 구축을 통해 다음을 달성했습니다.

  • 전체 인프라에 대한 실시간 모니터링 체계 확립
  • 심각도별 알림 채널 분리로 불필요한 알림 피로 감소
  • ECS Task 다운 즉시 감지로 서비스 장애 대응 시간 단축
  • Auto Scaling 미적용 서비스에 대한 수동 모니터링 보완

핵심은 단순히 알람을 많이 만드는 것이 아니라, 심각도와 대응 방식에 맞게 알림 채널을 설계하는 것입니다.