
CloudWatch 완전 정복: 클라우드 서비스의 '블랙박스'를 읽는 법
서버가 죽기 전에 알 수 있다면? 비용이 폭증하기 전에 감지할 수 있다면? CloudWatch는 AWS의 모든 서비스에서 무슨 일이 일어나고 있는지를 실시간으로 보여주는 '블랙박스 레코더'다. 모니터링이 왜 필요한지부터, 메트릭·로그·알람·대시보드의 실전 활용까지.

서버가 죽기 전에 알 수 있다면? 비용이 폭증하기 전에 감지할 수 있다면? CloudWatch는 AWS의 모든 서비스에서 무슨 일이 일어나고 있는지를 실시간으로 보여주는 '블랙박스 레코더'다. 모니터링이 왜 필요한지부터, 메트릭·로그·알람·대시보드의 실전 활용까지.
모니터링이 없는 인프라 운영은 계기판 없이 비행기를 모는 것과 같다.
실제로 벌어지는 시나리오:
이것은 과장이 아니다. 모니터링이 제대로 설정되지 않은 소규모 서비스에서 실제로 반복되는 패턴이다.
모니터링의 목표는 단순하다: 문제가 발생하면 사람보다 기계가 먼저 알아채는 것. 그리고 AWS에서 이 역할을 하는 것이 CloudWatch다.
Google의 SRE(Site Reliability Engineering) 팀이 정립하고, Cindy Sridharan이 2018년 저서 "Distributed Systems Observability"에서 체계화한 관측성의 세 기둥(Three Pillars of Observability):
CloudWatch는 이 세 기둥을 하나의 서비스로 통합한다.
Google의 SRE 책 "Site Reliability Engineering"(2016)에서 정의한, 모든 서비스가 반드시 모니터링해야 할 4대 황금 시그널(Four Golden Signals):
| 시그널 | 의미 | CloudWatch 메트릭 예시 |
|---|---|---|
| 지연시간 (Latency) | 요청 처리에 걸리는 시간 | ALB TargetResponseTime |
| 트래픽 (Traffic) | 서비스에 들어오는 요청량 | ALB RequestCount |
| 에러 (Errors) | 실패한 요청의 비율 | ALB HTTPCode_Target_5XX_Count |
| 포화도 (Saturation) | 자원이 얼마나 꽉 찼는가 | EC2 CPUUtilization, EBS VolumeQueueLength |
Amazon CloudWatch는 AWS 리소스와 애플리케이션의 모니터링·관측성 서비스다. 2009년 출시로, AWS에서 가장 오래된 서비스 중 하나다.
핵심 기능 5가지:
| 기능 | 역할 | 비유 |
|---|---|---|
| CloudWatch Metrics | 시계열 숫자 데이터 수집·저장·시각화 | 체온계, 혈압계 |
| CloudWatch Logs | 로그 수집·저장·검색·분석 | 병원 차트 |
| CloudWatch Alarms | 메트릭이 임계값을 넘으면 알림 | 심박 모니터 경보 |
| CloudWatch Dashboards | 커스텀 시각화 대시보드 | 수술실 모니터 화면 |
| CloudWatch Logs Insights | 로그 데이터 SQL 유사 쿼리 | 진단 검사 |
CloudWatch의 가장 큰 장점: AWS의 거의 모든 서비스가 자동으로 CloudWatch에 메트릭을 보낸다. 별도 설정 없이.
EC2를 시작하면 → CPU 사용률, 네트워크 I/O, 디스크 I/O가 자동으로 CloudWatch에 RDS를 만들면 → DB 커넥션 수, 쿼리 지연시간, 여유 메모리가 자동으로 Lambda를 배포하면 → 실행 횟수, 에러 수, 실행 시간이 자동으로 EBS를 연결하면 → IOPS, 처리량, 큐 길이가 자동으로
기본 메트릭(Basic Metrics): AWS 서비스가 자동으로 보내는 메트릭. 무료.
| 서비스 | 주요 기본 메트릭 | 수집 주기 |
|---|---|---|
| EC2 | CPUUtilization, NetworkIn/Out, DiskReadOps | 5분 (기본) / 1분 (상세) |
| RDS | CPUUtilization, FreeableMemory, DatabaseConnections | 1분 |
| Lambda | Invocations, Errors, Duration, Throttles | 1분 |
| ALB | RequestCount, TargetResponseTime, HTTPCode_5XX | 1분 |
| EBS | VolumeReadOps, VolumeWriteOps, VolumeQueueLength | 5분 |
| S3 | BucketSizeBytes, NumberOfObjects | 1일 |
커스텀 메트릭(Custom Metrics): 애플리케이션에서 직접 보내는 메트릭. 유료.
import boto3
cloudwatch = boto3.client("cloudwatch")
# 주문 처리 시간을 커스텀 메트릭으로 전송
cloudwatch.put_metric_data(
Namespace="MyApp/Orders",
MetricData=[{
"MetricName": "OrderProcessingTime",
"Value": 1.23,
"Unit": "Seconds",
"Dimensions": [{"Name": "Environment", "Value": "production"}]
}]
)
CloudWatch Alarm은 세 가지 상태를 가진다:
1. EC2 CPU 과부하
aws cloudwatch put-metric-alarm \
--alarm-name "High-CPU" \
--metric-name CPUUtilization \
--namespace AWS/EC2 \
--statistic Average \
--period 300 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 3 \
--alarm-actions arn:aws:sns:ap-northeast-2:123:ops-team
"5분 평균 CPU가 80%를 3번 연속 초과하면 SNS로 알림."
2. EBS 디스크 꽉 참 (CloudWatch Agent 필요)
3. RDS 여유 메모리 부족
FreeableMemory < 500MB → 경고
FreeableMemory < 100MB → 긴급
4. Lambda 에러 급증
Errors > 10/분 → 알림
5. 예산 초과 (CloudWatch Billing Alarm)
EstimatedCharges > $500 → 알림
알람은 알림만 보내는 게 아니다. 자동 조치(Auto Action) 를 트리거할 수 있다:
CloudWatch Logs는 세 계층으로 구성된다:
/ecs/my-api, /aws/lambda/my-function| 소스 | 수집 방법 | 설정 |
|---|---|---|
| Lambda | 자동 | 코드에서 print()/console.log() 하면 자동 수집 |
| ECS/Fargate | 태스크 정의 | awslogs 로그 드라이버 설정 |
| EC2 | CloudWatch Agent | 에이전트 설치 + 설정 파일 |
| API Gateway | 설정 | 스테이지 설정에서 로깅 활성화 |
| RDS | 파라미터 그룹 | 슬로우 쿼리 로그, 에러 로그 활성화 |
CloudWatch Logs Insights는 SQL과 유사한 쿼리 언어로 로그를 분석한다.
# 지난 1시간 동안 가장 많이 발생한 에러 TOP 10
fields @timestamp, @message
| filter @message like /ERROR/
| stats count(*) as error_count by @message
| sort error_count desc
| limit 10
# 특정 사용자의 요청 추적
fields @timestamp, @message
| filter @message like /user_id=u123/
| sort @timestamp desc
| limit 50
# Lambda 실행시간 P99 추이
filter @type = "REPORT"
| stats percentile(@duration, 99) as p99_duration by bin(5m)
print("error occurred") 대신 {"level": "ERROR", "service": "payment", "user_id": "u123", "message": "timeout"}으로 로깅하면, 필드별 필터링과 집계가 가능해진다.2017년 2월 — S3 us-east-1 장애 (인터넷의 30%가 다운)
AWS 엔지니어가 S3 빌링 시스템 디버깅 중 실수로 대규모 서버를 제거하는 명령을 실행했다. S3 us-east-1이 4시간 동안 장애를 일으켰고, S3에 의존하는 수많은 서비스(Slack, Trello, IFTTT, 심지어 AWS 자체 대시보드)가 마비됐다.
교훈: AWS의 상태 대시보드 자체가 S3에 의존하고 있어서, 장애 상황을 대시보드에서 확인할 수 없었다. 이후 AWS는 상태 페이지를 S3에서 분리했다.
2020년 11월 — Kinesis 장애 → CloudWatch 모니터링 마비
Kinesis Data Streams 장애가 발생했는데, CloudWatch가 Kinesis에 의존하는 부분이 있어 모니터링 자체가 먹통이 됐다. 알람이 발동하지 않아 고객들이 장애를 인지하는 데 더 오래 걸렸다.
교훈: 모니터링 시스템 자체의 가용성도 모니터링 대상이다.
CloudWatch에는 **항상 무료(Free Tier)**인 부분이 있다:
| 항목 | 무료 범위 |
|---|---|
| 기본 메트릭 | 무료 (5분 간격) |
| 알람 | 10개 무료 |
| 대시보드 | 3개 무료 (50 메트릭 이내) |
| API 요청 (GetMetricData 등) | 100만 건/월 무료 |
| Logs 수집 | 5GB/월 무료 |
| Logs 저장 | 5GB/월 무료 |
| Logs Insights 쿼리 | 스캔 데이터 5GB 무료 |
| 전략 | 효과 |
|---|---|
| 로그 보존 기간 설정 | 가장 큰 비용 절감. 무제한→30일만으로도 대폭 절감 |
| 불필요한 로그 필터링 | DEBUG 레벨 로그를 프로덕션에서 제거 |
| S3로 로그 내보내기 | 장기 보관은 S3 (CloudWatch의 1/10 비용) |
| 커스텀 메트릭 최소화 | 메트릭당 월 $0.30. 불필요한 메트릭 삭제 |
| 상세 모니터링 선별 적용 | EC2 1분 간격은 필요한 인스턴스만 |
소규모~중간 규모에서는 CloudWatch만으로 충분하다. 하지만 대규모 서비스나 특수한 요구사항에서는 전문 도구가 필요할 수 있다.
| 도구 | 강점 | CloudWatch 대비 | 비용 |
|---|---|---|---|
| Datadog | 올인원 관측성, 아름다운 UI | 더 풍부한 시각화, APM | 높음 (호스트당 $15~23/월) |
| Prometheus + Grafana | 오픈소스, K8s 표준 | 커스터마이징 자유, 비용 낮음 | 운영 비용 (인프라) |
| New Relic | APM, 코드 수준 추적 | 더 깊은 앱 성능 분석 | 중간 |
| Splunk | 로그 분석 전문 | 더 강력한 로그 검색·분석 | 높음 |
| AWS X-Ray | 분산 트레이싱 | CloudWatch에 없는 트레이싱 | AWS 네이티브, 추가 비용 |
웹 서비스 대시보드 (필수 위젯):
| 위젯 | 메트릭 | 목적 |
|---|---|---|
| 요청 수 | ALB RequestCount | 트래픽 추이 |
| 응답 시간 | ALB TargetResponseTime p50/p99 | 성능 모니터링 |
| 5xx 에러율 | ALB HTTPCode_Target_5XX / 전체 | 에러 감지 |
| CPU 사용률 | EC2/ECS CPUUtilization | 포화도 |
| 메모리 사용률 | CW Agent mem_used_percent | 포화도 |
| 활성 커넥션 | RDS DatabaseConnections | DB 부하 |
| 예상 비용 | Billing EstimatedCharges | 비용 관리 |
CloudFormation이나 Terraform으로 대시보드를 코드로 관리하면, 환경마다 동일한 대시보드를 자동 생성할 수 있다.
Netflix는 자체 모니터링 도구 Atlas를 운영하지만, 기반 인프라에는 CloudWatch를 활용한다. 하루에 수십억 개의 메트릭 데이터 포인트를 수집하며, 이상 감지 알고리즘으로 장애를 자동 탐지한다.
Netflix의 Chaos Monkey는 프로덕션에서 임의로 인스턴스를 죽여 시스템의 복원력을 테스트하는 도구다. CloudWatch 알람이 이 "의도적 장애"를 즉시 감지하고 자동 복구가 작동하는지 검증한다.
Airbnb는 인프라 메트릭뿐 아니라 비즈니스 메트릭(예약 수, 검색 전환율, 결제 성공률)도 CloudWatch 커스텀 메트릭으로 추적한다. "예약 수가 평소 대비 30% 감소"하면 기술 장애가 아니더라도 알람이 발동한다.
많은 팀이 이렇게 말한다: "일단 서비스부터 만들고, 모니터링은 나중에." 하지만 "나중"은 보통 장애가 터진 후가 된다.
모니터링은 서비스 론칭과 동시에 설정해야 한다. 아니, 론칭 전에 설정해야 한다. 모니터링 없는 서비스는 계기판 없는 비행기다 — 이륙은 할 수 있지만, 안전하게 착륙할 수 있을지는 운에 달려 있다.
이 시리즈 전체에서 다룬 서비스들을 CloudWatch 관점에서 모으면:
| 서비스 | CloudWatch로 모니터링할 것 |
|---|---|
| EC2 | CPU, 메모리(Agent), 디스크, 네트워크 |
| EBS | IOPS, 처리량, 큐 길이 |
| RDS | 커넥션 수, 여유 메모리, 쿼리 지연 |
| Lambda | 실행 시간, 에러, 스로틀, 콜드 스타트 |
| ECS/Fargate | CPU, 메모리, 러닝 태스크 수 |
| API Gateway | 요청 수, 지연시간, 4xx/5xx 에러 |
| CloudFront | 캐시 히트율, 에러율, 원본 지연 |
| DynamoDB | 읽기/쓰기 소비 용량, 스로틀 |
| S3 | 요청 수, 에러, 버킷 크기 |
코어닷투데이의 AI 서비스에서도 CloudWatch는 "언제나 켜져 있는 감시자"다. AI 추론 서버의 응답 시간, 모델 서빙의 에러율, 데이터 파이프라인의 처리량 — 이 모든 지표가 CloudWatch 대시보드에서 실시간으로 확인되고, 이상이 감지되면 즉시 알람이 울린다. 서비스가 죽기 전에 우리가 먼저 안다 — 그것이 모니터링의 가치다.