coredot.today
CloudWatch 완전 정복: 클라우드 서비스의 '블랙박스'를 읽는 법
블로그로 돌아가기
CloudWatchAWS모니터링관측성로그알람DevOps

CloudWatch 완전 정복: 클라우드 서비스의 '블랙박스'를 읽는 법

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

코어닷투데이2026-02-2028

들어가며: "서버가 언제 죽었는지 모릅니다"

모니터링이 없는 인프라 운영은 계기판 없이 비행기를 모는 것과 같다.

실제로 벌어지는 시나리오:

  1. 금요일 저녁, 팀원들이 퇴근한다
  2. 토요일 새벽, EC2 인스턴스의 디스크가 꽉 찬다
  3. 애플리케이션이 로그를 쓸 수 없어 에러가 발생한다
  4. 사용자들이 서비스 장애를 경험한다
  5. 월요일 아침, 출근해서야 알게 된다
  6. 48시간 동안 서비스가 죽어 있었다

이것은 과장이 아니다. 모니터링이 제대로 설정되지 않은 소규모 서비스에서 실제로 반복되는 패턴이다.

$5,600 분당 다운타임 비용 Gartner, 기업 평균
70% 장애를 고객이 먼저 발견 모니터링 미비 시 (PagerDuty 조사)
5분 장애 감지까지 걸리는 시간 적절한 모니터링 설정 시

모니터링의 목표는 단순하다: 문제가 발생하면 사람보다 기계가 먼저 알아채는 것. 그리고 AWS에서 이 역할을 하는 것이 CloudWatch다.


1. 모니터링과 관측성: 왜 필요한가

관측성(Observability)의 세 기둥

Google의 SRE(Site Reliability Engineering) 팀이 정립하고, Cindy Sridharan이 2018년 저서 "Distributed Systems Observability"에서 체계화한 관측성의 세 기둥(Three Pillars of Observability):

관측성의 세 기둥
메트릭 (Metrics) 숫자 데이터 CPU 80%, 응답시간 200ms, 에러율 2%
로그 (Logs) 이벤트 기록 [ERROR] Connection refused at 03:15:22
트레이스 (Traces) 요청 추적 요청 #abc → 서비스A → 서비스B → DB
  • 메트릭: "지금 상태가 어떤가?" — CPU 사용률, 메모리, 요청 수 같은 시계열 숫자 데이터. 대시보드의 그래프
  • 로그: "무슨 일이 일어났는가?" — 이벤트의 텍스트 기록. 에러 메시지, 접근 로그, 감사 로그
  • 트레이스: "요청이 어떤 경로로 흘렀는가?" — 마이크로서비스 환경에서 하나의 요청이 여러 서비스를 거치는 전체 경로 추적

CloudWatch는 이 세 기둥을 하나의 서비스로 통합한다.

Google SRE의 4대 황금 시그널

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
💡
핵심 원칙: 이 네 가지를 모니터링하면 대부분의 장애를 감지할 수 있다. 반대로, 이 중 하나라도 빠지면 사각지대가 생긴다. "CPU 사용률은 정상인데 왜 느리지?" → 에러율을 안 봤기 때문. "에러도 없고 CPU도 괜찮은데 왜 장애?" → 포화도(디스크 꽉 참)를 안 봤기 때문.

2. CloudWatch란 무엇인가

정의

Amazon CloudWatch는 AWS 리소스와 애플리케이션의 모니터링·관측성 서비스다. 2009년 출시로, AWS에서 가장 오래된 서비스 중 하나다.

핵심 기능 5가지:

기능역할비유
CloudWatch Metrics시계열 숫자 데이터 수집·저장·시각화체온계, 혈압계
CloudWatch Logs로그 수집·저장·검색·분석병원 차트
CloudWatch Alarms메트릭이 임계값을 넘으면 알림심박 모니터 경보
CloudWatch Dashboards커스텀 시각화 대시보드수술실 모니터 화면
CloudWatch Logs Insights로그 데이터 SQL 유사 쿼리진단 검사

CloudWatch는 AWS의 "기본 장착" 모니터링

CloudWatch의 가장 큰 장점: AWS의 거의 모든 서비스가 자동으로 CloudWatch에 메트릭을 보낸다. 별도 설정 없이.

EC2를 시작하면 → CPU 사용률, 네트워크 I/O, 디스크 I/O가 자동으로 CloudWatch에 RDS를 만들면 → DB 커넥션 수, 쿼리 지연시간, 여유 메모리가 자동으로 Lambda를 배포하면 → 실행 횟수, 에러 수, 실행 시간이 자동으로 EBS를 연결하면 → IOPS, 처리량, 큐 길이가 자동으로


3. CloudWatch Metrics: 숫자로 보는 인프라 건강

기본 메트릭 vs 커스텀 메트릭

기본 메트릭(Basic Metrics): AWS 서비스가 자동으로 보내는 메트릭. 무료.

서비스주요 기본 메트릭수집 주기
EC2CPUUtilization, NetworkIn/Out, DiskReadOps5분 (기본) / 1분 (상세)
RDSCPUUtilization, FreeableMemory, DatabaseConnections1분
LambdaInvocations, Errors, Duration, Throttles1분
ALBRequestCount, TargetResponseTime, HTTPCode_5XX1분
EBSVolumeReadOps, VolumeWriteOps, VolumeQueueLength5분
S3BucketSizeBytes, NumberOfObjects1일

커스텀 메트릭(Custom Metrics): 애플리케이션에서 직접 보내는 메트릭. 유료.

hljs language-python
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"}]
    }]
)
⚠️
EC2의 숨겨진 사각지대: EC2의 기본 메트릭에는 메모리 사용률과 디스크 사용률이 없다. CloudWatch는 EC2 인스턴스 "외부"에서 관측하므로, 내부 OS 메트릭은 수집하지 못한다. CloudWatch Agent를 설치해야 메모리, 디스크, 프로세스 수준의 메트릭을 수집할 수 있다.

4. CloudWatch Alarms: 문제를 사람보다 먼저 아는 법

알람의 구조

CloudWatch Alarm은 세 가지 상태를 가진다:

  • OK: 메트릭이 정상 범위
  • ALARM: 임계값을 초과하여 경보 발생
  • INSUFFICIENT_DATA: 데이터가 부족하여 판단 불가

실전: 반드시 설정해야 할 알람 5가지

1. EC2 CPU 과부하

hljs language-bash
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 → 알림
가장 먼저 설정할 알람: CloudWatch Billing Alarm. 예상 비용이 설정한 금액을 넘으면 이메일로 알려준다. 이것만 설정해도 "이번 달 청구서가 100만 원이 나왔다"는 공포를 예방할 수 있다. 프리 티어에서도 설정 가능.

알람 → 자동 대응

알람은 알림만 보내는 게 아니다. 자동 조치(Auto Action) 를 트리거할 수 있다:

  • Auto Scaling: CPU 80% 알람 → EC2 인스턴스 자동 추가
  • Lambda 트리거: 알람 → SNS → Lambda → 자동 복구 스크립트 실행
  • EC2 재시작: StatusCheck 실패 알람 → EC2 자동 재부팅
  • ECS 스케일링: 타겟 응답시간 알람 → ECS 태스크 수 자동 증가

5. CloudWatch Logs: 모든 것은 로그에 기록된다

로그의 구조

CloudWatch Logs는 세 계층으로 구성된다:

  • 로그 그룹 (Log Group): 로그의 최상위 컨테이너. 보통 서비스/앱 단위. /ecs/my-api, /aws/lambda/my-function
  • 로그 스트림 (Log Stream): 로그 그룹 내의 개별 소스. 컨테이너 인스턴스, Lambda 실행 환경 등
  • 로그 이벤트 (Log Event): 실제 로그 메시지 한 줄 + 타임스탬프

로그 수집 방법

소스수집 방법설정
Lambda자동코드에서 print()/console.log() 하면 자동 수집
ECS/Fargate태스크 정의awslogs 로그 드라이버 설정
EC2CloudWatch Agent에이전트 설치 + 설정 파일
API Gateway설정스테이지 설정에서 로깅 활성화
RDS파라미터 그룹슬로우 쿼리 로그, 에러 로그 활성화

Logs Insights: 로그에서 인사이트를 캐내기

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)
💡
실전 팁: Logs Insights는 구조화된 JSON 로그와 함께 사용할 때 가장 강력하다. print("error occurred") 대신 {"level": "ERROR", "service": "payment", "user_id": "u123", "message": "timeout"}으로 로깅하면, 필드별 필터링과 집계가 가능해진다.

6. 모니터링 부재의 대가: 실제 사고 사례

AWS 자체 장애에서 배우기

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에 의존하는 부분이 있어 모니터링 자체가 먹통이 됐다. 알람이 발동하지 않아 고객들이 장애를 인지하는 데 더 오래 걸렸다.

교훈: 모니터링 시스템 자체의 가용성도 모니터링 대상이다.

기업의 모니터링 부재 사고

2019
British Airways: 15시간 IT 장애
데이터센터 전원 장애를 모니터링 시스템이 즉시 감지하지 못해 복구가 지연. 수천 편의 항공편 취소, £80M+ 보상금
2021
Facebook: 6시간 글로벌 다운
BGP 라우팅 설정 오류로 전체 서비스 다운. 내부 통신 도구도 먹통이라 엔지니어들이 데이터센터에 물리적으로 가야 했음
2023
비용 폭탄 사례 다수
Billing Alarm 미설정으로 개발/테스트 환경의 리소스가 방치되어 월 수천~수만 달러 청구. "클라우드 파산" 사례
🔒
CloudWatch 로그의 보안: CloudWatch Logs에는 앱 로그가 저장된다. 로그에 실수로 사용자 비밀번호, API 키, 개인정보가 포함될 수 있다. 로그에 민감 정보가 남지 않도록 로깅 코드를 점검하고, CloudWatch Logs의 데이터 보호(Data Protection) 기능으로 민감 데이터를 자동 마스킹하라.

7. CloudWatch 비용: 무료로 쓰는 법과 함정

무료 티어

CloudWatch에는 **항상 무료(Free Tier)**인 부분이 있다:

항목무료 범위
기본 메트릭무료 (5분 간격)
알람10개 무료
대시보드3개 무료 (50 메트릭 이내)
API 요청 (GetMetricData 등)100만 건/월 무료
Logs 수집5GB/월 무료
Logs 저장5GB/월 무료
Logs Insights 쿼리스캔 데이터 5GB 무료

비용 함정

⚠️
가장 흔한 비용 폭탄 — 로그 저장: CloudWatch Logs는 기본적으로 영구 보관이다. 보존 기간을 설정하지 않으면 로그가 무한정 쌓여 월 수백~수천 달러가 과금될 수 있다. 로그 그룹 생성 시 보존 기간을 반드시 설정하라 (7일, 30일, 90일 등). 장기 보관이 필요한 로그는 S3로 내보내면 1/10 비용에 저장할 수 있다.

비용 최적화 전략

전략효과
로그 보존 기간 설정가장 큰 비용 절감. 무제한→30일만으로도 대폭 절감
불필요한 로그 필터링DEBUG 레벨 로그를 프로덕션에서 제거
S3로 로그 내보내기장기 보관은 S3 (CloudWatch의 1/10 비용)
커스텀 메트릭 최소화메트릭당 월 $0.30. 불필요한 메트릭 삭제
상세 모니터링 선별 적용EC2 1분 간격은 필요한 인스턴스만

8. CloudWatch 대안들: 언제 다른 도구를 써야 하나

CloudWatch만으로 충분한가?

소규모~중간 규모에서는 CloudWatch만으로 충분하다. 하지만 대규모 서비스나 특수한 요구사항에서는 전문 도구가 필요할 수 있다.

도구강점CloudWatch 대비비용
Datadog올인원 관측성, 아름다운 UI더 풍부한 시각화, APM높음 (호스트당 $15~23/월)
Prometheus + Grafana오픈소스, K8s 표준커스터마이징 자유, 비용 낮음운영 비용 (인프라)
New RelicAPM, 코드 수준 추적더 깊은 앱 성능 분석중간
Splunk로그 분석 전문더 강력한 로그 검색·분석높음
AWS X-Ray분산 트레이싱CloudWatch에 없는 트레이싱AWS 네이티브, 추가 비용
CloudWatch만으로 충분한 경우
AWS 서비스 위주의 인프라
기본 메트릭 + 알람 + 로그면 충분
팀이 작고 도구 관리에 시간을 쓰기 어려움
비용을 최소화하고 싶음
추가 도구가 필요한 경우
APM(코드 수준 성능 분석)이 필요
멀티클라우드/온프레미스 통합 모니터링
K8s 환경 (Prometheus가 사실상 표준)
복잡한 로그 분석 (Splunk, OpenSearch)
실전 조합: 가장 흔한 패턴은 CloudWatch(기본) + 한 가지 전문 도구다. CloudWatch로 AWS 인프라 메트릭과 알람을 처리하고, Datadog이나 Grafana로 앱 수준의 고급 시각화와 APM을 보강한다. 모든 것을 하나의 도구로 하려 하지 마라.

9. 실전 대시보드 구성

서비스별 대시보드 템플릿

웹 서비스 대시보드 (필수 위젯):

위젯메트릭목적
요청 수ALB RequestCount트래픽 추이
응답 시간ALB TargetResponseTime p50/p99성능 모니터링
5xx 에러율ALB HTTPCode_Target_5XX / 전체에러 감지
CPU 사용률EC2/ECS CPUUtilization포화도
메모리 사용률CW Agent mem_used_percent포화도
활성 커넥션RDS DatabaseConnectionsDB 부하
예상 비용Billing EstimatedCharges비용 관리

Infrastructure as Code로 대시보드 관리

CloudFormation이나 Terraform으로 대시보드를 코드로 관리하면, 환경마다 동일한 대시보드를 자동 생성할 수 있다.


10. 실제 사례

Netflix: 관측성의 교과서

Netflix는 자체 모니터링 도구 Atlas를 운영하지만, 기반 인프라에는 CloudWatch를 활용한다. 하루에 수십억 개의 메트릭 데이터 포인트를 수집하며, 이상 감지 알고리즘으로 장애를 자동 탐지한다.

Netflix의 Chaos Monkey는 프로덕션에서 임의로 인스턴스를 죽여 시스템의 복원력을 테스트하는 도구다. CloudWatch 알람이 이 "의도적 장애"를 즉시 감지하고 자동 복구가 작동하는지 검증한다.

Airbnb: 커스텀 메트릭으로 비즈니스 모니터링

Airbnb는 인프라 메트릭뿐 아니라 비즈니스 메트릭(예약 수, 검색 전환율, 결제 성공률)도 CloudWatch 커스텀 메트릭으로 추적한다. "예약 수가 평소 대비 30% 감소"하면 기술 장애가 아니더라도 알람이 발동한다.

한국 기업 사례

  • 쿠팡: CloudWatch + Datadog 조합. 로켓배송 시스템의 주문 처리 지연시간을 실시간 모니터링
  • 토스: CloudWatch + Grafana. 금융 거래의 성공/실패율, 지연시간을 초 단위로 추적
  • 배달의민족: CloudWatch 알람으로 주문 폭주 시 자동 스케일링 트리거

마치며: "모니터링은 나중에"의 함정

많은 팀이 이렇게 말한다: "일단 서비스부터 만들고, 모니터링은 나중에." 하지만 "나중"은 보통 장애가 터진 후가 된다.

모니터링은 서비스 론칭과 동시에 설정해야 한다. 아니, 론칭 전에 설정해야 한다. 모니터링 없는 서비스는 계기판 없는 비행기다 — 이륙은 할 수 있지만, 안전하게 착륙할 수 있을지는 운에 달려 있다.

이 시리즈 전체에서 다룬 서비스들을 CloudWatch 관점에서 모으면:

서비스CloudWatch로 모니터링할 것
EC2CPU, 메모리(Agent), 디스크, 네트워크
EBSIOPS, 처리량, 큐 길이
RDS커넥션 수, 여유 메모리, 쿼리 지연
Lambda실행 시간, 에러, 스로틀, 콜드 스타트
ECS/FargateCPU, 메모리, 러닝 태스크 수
API Gateway요청 수, 지연시간, 4xx/5xx 에러
CloudFront캐시 히트율, 에러율, 원본 지연
DynamoDB읽기/쓰기 소비 용량, 스로틀
S3요청 수, 에러, 버킷 크기

코어닷투데이의 AI 서비스에서도 CloudWatch는 "언제나 켜져 있는 감시자"다. AI 추론 서버의 응답 시간, 모델 서빙의 에러율, 데이터 파이프라인의 처리량 — 이 모든 지표가 CloudWatch 대시보드에서 실시간으로 확인되고, 이상이 감지되면 즉시 알람이 울린다. 서비스가 죽기 전에 우리가 먼저 안다 — 그것이 모니터링의 가치다.