실습 예제 · 12
CloudWatch 알람 + SNS 알림
알림 파이프라인의 목적은 사람이 대응해야 하는 순간에만 알리는 것입니다. 너무 자주 울리면 아무도 보지 않게 되고, 그 순간 감시는 없는 것과 같아집니다. 이 실습은 지표 알람과 로그 지표 필터를 만들고, 복합 알람으로 소음을 줄이는 구성까지 만듭니다.
학습 목표
- SNS 주제와 구독을 만들고 알람의 동작 대상으로 연결할 수 있습니다.
- 지표 알람의 평가 기간과 데이터 포인트 조건을 설계할 수 있습니다.
- 누락 데이터 처리 방식이 알람 상태를 어떻게 바꾸는지 설명할 수 있습니다.
- 로그 지표 필터로 로그 패턴을 지표로 만들 수 있습니다.
- 복합 알람으로 알림 수를 줄일 수 있습니다.
시나리오
실습 2의 웹 티어를 감시합니다. 알리고 싶은 상황은 셋입니다.
- 정상 대상 수가 기준 아래로 떨어졌다.
- 애플리케이션 로그에 오류가 급증했다.
- 두 조건이 동시에 성립했다 — 이때만 야간에도 호출한다.
마지막 조건이 복합 알람의 이유입니다. 개별 알람은 기록을 남기고, 사람을 부르는 것은 복합 알람만 하게 만듭니다.
아키텍처 개요
| 구성 요소 | 역할 |
|---|---|
| SNS 주제(운영) | 기록용 알림. 채팅이나 티켓 시스템으로 보낸다 |
| SNS 주제(호출) | 사람을 부르는 알림. 복합 알람만 연결한다 |
| 지표 알람 | 지표가 임계값을 넘는지 평가 |
| 로그 지표 필터 | 로그 패턴 발생 횟수를 지표로 변환 |
| 복합 알람 | 여러 알람의 조합을 하나의 조건으로 평가 |
구성 단계
1 · SNS 주제와 구독
OPS_TOPIC=$(aws sns create-topic --name lab12-ops \
--query 'TopicArn' --output text)
PAGE_TOPIC=$(aws sns create-topic --name lab12-page \
--query 'TopicArn' --output text)
aws sns subscribe \
--topic-arn "$OPS_TOPIC" \
--protocol email \
--notification-endpoint ops@example.com
aws sns subscribe \
--topic-arn "$PAGE_TOPIC" \
--protocol email \
--notification-endpoint oncall@example.com
# 구독은 확인 절차를 거쳐야 활성화됩니다.
aws sns list-subscriptions-by-topic \
--topic-arn "$OPS_TOPIC" \
--query 'Subscriptions[].[Protocol,Endpoint,SubscriptionArn]' \
--output table
2 · 지표 알람
aws cloudwatch put-metric-alarm \
--alarm-name lab12-healthy-hosts-low \
--alarm-description "정상 대상 수가 기준 아래로 떨어졌습니다" \
--namespace AWS/ApplicationELB \
--metric-name HealthyHostCount \
--dimensions Name=TargetGroup,Value=targetgroup/lab02-tg/0123456789abcdef \
Name=LoadBalancer,Value=app/lab02-alb/0123456789abcdef \
--statistic Minimum \
--period 60 \
--evaluation-periods 3 \
--datapoints-to-alarm 2 \
--threshold 2 \
--comparison-operator LessThanThreshold \
--treat-missing-data breaching \
--alarm-actions "$OPS_TOPIC" \
--ok-actions "$OPS_TOPIC"
| 설정 | 의미 | 정하는 기준 |
|---|---|---|
--period |
데이터 포인트 하나의 시간 폭 | 지표가 실제로 게시되는 주기보다 짧게 잡지 않는다 |
--evaluation-periods |
평가에 사용할 데이터 포인트 수 | 순간적인 튐에 반응하지 않을 만큼 |
--datapoints-to-alarm |
그중 몇 개가 위반이면 경보로 갈지 | "3개 중 2개"처럼 완화된 조건을 만들 때 쓴다 |
--statistic |
기간 안의 값을 어떻게 요약할지 | 가용성 지표는 Minimum, 부하 지표는 Average가 흔하다 |
--treat-missing-data |
데이터가 없을 때의 취급 | 아래 표 참조 |
| 값 | 동작 | 쓰는 상황 |
|---|---|---|
missing (기본) |
해당 데이터 포인트를 평가에서 제외 | 지표가 간헐적으로만 게시되는 경우 |
notBreaching |
정상으로 간주 | 데이터가 없는 것이 곧 무부하인 경우 |
breaching |
위반으로 간주 | 지표가 끊긴 것 자체가 이상인 경우 |
ignore |
현재 상태를 유지 | 상태가 흔들리는 것을 피하고 싶을 때 |
위 예시에서 breaching을 고른 이유는,
정상 대상 수 지표가 사라지는 상황이 대상 그룹 자체의 문제일 수 있기 때문입니다.
데이터가 없다고 안심하면 장애를 놓칩니다.
3 · 로그 지표 필터
aws logs put-metric-filter \
--log-group-name /app/lab12 \
--filter-name lab12-error-count \
--filter-pattern '?ERROR ?Exception' \
--metric-transformations \
metricName=AppErrorCount,metricNamespace=Lab12/App,metricValue=1,defaultValue=0
aws cloudwatch put-metric-alarm \
--alarm-name lab12-error-spike \
--alarm-description "애플리케이션 오류 로그가 급증했습니다" \
--namespace Lab12/App \
--metric-name AppErrorCount \
--statistic Sum \
--period 60 \
--evaluation-periods 5 \
--datapoints-to-alarm 3 \
--threshold 20 \
--comparison-operator GreaterThanThreshold \
--treat-missing-data notBreaching \
--alarm-actions "$OPS_TOPIC"
4 · 복합 알람
aws cloudwatch put-composite-alarm \
--alarm-name lab12-service-degraded \
--alarm-description "용량 부족과 오류 급증이 동시에 발생했습니다" \
--alarm-rule "ALARM(lab12-healthy-hosts-low) AND ALARM(lab12-error-spike)" \
--alarm-actions "$PAGE_TOPIC" \
--ok-actions "$PAGE_TOPIC"
규칙에는 ALARM(), OK(), INSUFFICIENT_DATA()와
AND, OR, NOT을 쓸 수 있습니다.
배포 중에는 알림을 억제하는 동작 억제기도 지정할 수 있어,
계획된 작업 때문에 사람이 불려 나가는 일을 막을 수 있습니다.
검증 방법
aws cloudwatch describe-alarms \
--alarm-names lab12-healthy-hosts-low lab12-error-spike \
--query 'MetricAlarms[].[AlarmName,StateValue,StateReason]' \
--output table
aws cloudwatch describe-alarms \
--alarm-types CompositeAlarm \
--query 'CompositeAlarms[].[AlarmName,StateValue,AlarmRule]' \
--output table
aws cloudwatch describe-alarm-history \
--alarm-name lab12-healthy-hosts-low \
--max-records 5 \
--query 'AlarmHistoryItems[].[Timestamp,HistoryItemType,HistorySummary]' \
--output table
알람을 일부러 울려 본다
알림 경로가 실제로 동작하는지는 울려 봐야 압니다. 상태를 강제로 바꾸면 지표를 건드리지 않고도 경로를 확인할 수 있습니다.
aws cloudwatch set-alarm-state \
--alarm-name lab12-error-spike \
--state-value ALARM \
--state-reason "알림 경로 점검"
# 사용자 지정 지표에 값을 직접 넣어 실제 평가를 확인할 수도 있습니다.
aws cloudwatch put-metric-data \
--namespace Lab12/App \
--metric-name AppErrorCount \
--value 50
# 확인이 끝나면 되돌립니다. 다음 평가 주기에 실제 상태로 복귀합니다.
aws cloudwatch set-alarm-state \
--alarm-name lab12-error-spike \
--state-value OK \
--state-reason "점검 완료"
| 항목 | 통과 기준 |
|---|---|
| 구독 확인 | 구독 ARN이 PendingConfirmation이 아니다 |
| 알림 전달 | 상태를 ALARM으로 바꾸면 메일이 온다 |
| 복구 알림 | OK로 돌아올 때도 알림이 온다 |
| 복합 알람 | 한쪽만 경보일 때는 호출 주제로 알림이 가지 않는다 |
| 로그 지표 | 패턴이 없을 때도 0이 게시된다 |
비용 고려
| 항목 | 성격 |
|---|---|
| 알람 | 알람 개수. 고해상도 알람은 별도로 계산된다 |
| 사용자 지정 지표 | 지표 개수. 차원 조합마다 별도의 지표가 된다 |
| 로그 수집과 저장 | 수집량과 보존 기간 |
| SNS | 게시와 전달 수 |
| 대시보드 | 대시보드 개수 |
비용이 예상보다 커지는 원인은 대개 차원 조합입니다. 사용자 지정 지표에 인스턴스 ID나 요청 ID처럼 값이 많은 차원을 넣으면 지표 수가 폭증합니다. 그리고 로그 보존 기간을 지정하지 않으면 무기한 쌓입니다.
프로덕션 고려사항
- 알림 등급을 나눕니다. 기록용과 호출용 주제를 분리하고, 사람을 부르는 조건은 최소로 유지합니다.
- 모든 알람에 대응 절차를 붙입니다. 무엇을 확인하고 무엇을 할지 적혀 있지 않은 알람은 소음이 됩니다.
- 배포 중 억제를 설계합니다. 계획된 작업으로 알람이 울리면 사람들이 알람을 무시하기 시작합니다.
- 주제 정책과 암호화를 설정합니다. 누가 게시할 수 있는지 제한하고, 필요하면 저장 데이터 암호화를 켭니다.
- SNS의 배달 못한 편지 대기열을 설정하면 전달 실패가 조용히 사라지지 않습니다.
- 로그 보존 기간을 반드시 지정합니다. 비용과 개인정보 양쪽 문제가 됩니다.
- 이상 탐지 기반 알람은 임계값을 정하기 어려운 지표에 유용합니다. 다만 학습 기간이 필요합니다.
정리 — 리소스 삭제
aws cloudwatch delete-alarms --alarm-names lab12-service-degraded
aws cloudwatch delete-alarms --alarm-names lab12-healthy-hosts-low lab12-error-spike
aws logs delete-metric-filter \
--log-group-name /app/lab12 \
--filter-name lab12-error-count
aws sns delete-topic --topic-arn "$OPS_TOPIC"
aws sns delete-topic --topic-arn "$PAGE_TOPIC"
# 실습용 로그 그룹도 정리합니다.
aws logs delete-log-group --log-group-name /app/lab12
자주 하는 실수
| 실수 | 증상 | 고치는 법 |
|---|---|---|
| 구독을 확인하지 않음 | 알람은 울리는데 메일이 오지 않는다 | 수신함에서 확인 링크를 누른다 |
| 차원을 빠뜨리거나 잘못 지정 | 알람이 계속 INSUFFICIENT_DATA다 |
지표의 실제 차원 이름과 값을 조회해 맞춘다 |
| 평가 기간이 지표 게시 주기보다 짧음 | 데이터가 없어 평가되지 않는다 | 게시 주기에 맞춰 --period를 정한다 |
| 누락 데이터 처리를 기본값으로 방치 | 지표가 끊긴 장애를 놓친다 | 지표 성격에 맞게 breaching 등을 지정한다 |
| EC2 메모리 지표를 기본으로 기대 | 지표가 존재하지 않는다 | CloudWatch 에이전트를 설치한다 |
| 평가 기간을 1로 두고 민감하게 설정 | 순간적인 튐마다 알림이 온다 | 평가 기간과 데이터 포인트 조건을 조정한다 |
| 모든 알람을 호출 주제에 연결 | 알림 피로로 아무도 보지 않게 된다 | 복합 알람으로 호출 조건을 좁힌다 |
| 로그 보존 기간 미설정 | 로그가 무기한 쌓인다 | 로그 그룹마다 보존 기간을 지정한다 |
이어서 볼 곳
- 17장 · 모니터링 · 운영 · 계정 관리 CloudWatch 지표·로그·알람의 관계, CloudTrail과 Config의 역할 구분을 다룹니다.
- 실습 2 · ALB + ASG 웹 티어 이 실습이 감시하는 대상을 먼저 만듭니다.
- 실습 7 · SQS + Lambda 비동기 처리 DLQ 적체에 알람을 걸어 실패를 조기에 잡는 구성으로 이어집니다.
- 케이스 5 · 단일 AZ 설계가 장애로 전면 중단됐다 정상 대상 수 지표가 왜 중요한 신호인지 장애 흐름으로 확인합니다.
- 케이스 10 · 규정 준수 감사에 대응하라 감시와 감사가 답하는 질문이 어떻게 다른지 정리합니다.
공식 문서 출처
- Amazon CloudWatch API 레퍼런스 — PutMetricAlarm — 기간·평가 기간·경보 데이터 포인트, 통계 값, 비교 연산자, 누락 데이터 처리
- Amazon CloudWatch API 레퍼런스 — PutCompositeAlarm — 알람 규칙 문법과 동작 억제기, 참조된 알람을 먼저 지울 수 없다는 제약
- Amazon CloudWatch API 레퍼런스 — SetAlarmState — 상태를 임시로 바꿔 알림 경로를 시험하는 방법
- Amazon CloudWatch Logs API 레퍼런스 — PutMetricFilter — 필터 패턴과 지표 변환, 기본값 설정
- Amazon SNS API 레퍼런스 — CreateTopic — 주제 생성과 속성
- Amazon SNS API 레퍼런스 — Subscribe — 프로토콜별 엔드포인트와 구독 확인 절차