09 / 09
운영 모니터링
5계층 모니터링 설계, CloudWatch + Container Insights + Managed Grafana + ADOT/X-Ray, 서비스 품질 중심 알람
설계 배경
통합 포탈 서비스는 ECS Fargate 기반 마이크로서비스, ALB, CloudFront, ElastiCache, DB EC2 등 다양한 리소스로 구성되어 있습니다. 각 리소스의 상태를 개별적으로 확인하는 것은 비효율적이므로, Terraform 모듈 기반의 통합 모니터링 체계를 설계하여 Prod/Staging 환경에 동일한 알람과 대시보드를 일괄 배포했습니다.
모니터링 구조
공통 모니터링 모듈을 만들어 환경별 변수만 주입하면 동일한 알람 세트가 생성되도록 설계했습니다. CloudFront 알람은 us-east-1 리전에 별도 생성되며, 나머지 알람은 ap-northeast-2에 배치됩니다.
모니터링 대상 리소스
ECS 서비스
auth-service, tax-service — Task 수, CPU, Memory
Service Connect
서비스 간 내부 통신 — 5XX, 응답 시간, 커넥션
ALB
외부 트래픽 — 5XX 에러, 응답 시간, Unhealthy Host
CloudFront
Edge 계층 — 에러율, 캐시 히트율, Origin Latency
ElastiCache (Valkey)
캐시 계층 — Engine CPU, Memory 사용률
DB EC2
데이터베이스 — CPU, Memory, Disk, Swap (CWAgent)
CloudWatch 알람 구성 — 환경당 26개
Prod/Staging 각각 서울 22개 + 버지니아 4개, 총 52개 알람을 운영합니다. 모든 알람은 Terraform 모듈에서 환경 변수만 바꿔 동일하게 생성됩니다.
| 계층 | 알람 수 | 주요 메트릭 |
|---|---|---|
| ECS 서비스 헬스 | 2개 | RunningTaskCount < 1 (서비스 다운 감지) |
| ECS CPU/Memory | 4개 | CPUUtilization, MemoryUtilization > 80% |
| Service Connect (auth) | 5개 | 5XX, p99 응답 시간, 커넥션, 요청 수 |
| Service Connect (tax) | 5개 | 5XX, p99 응답 시간, 커넥션, 요청 수 |
| ALB | 3개 | 5XX 에러, p99 응답 시간, Unhealthy Host |
| ElastiCache Valkey | 2개 | EngineCPU > 70%, Memory > 80% |
| DB EC2 (기본) | 1개 | CPUUtilization > 80% |
| CloudFront (us-east-1) | 4개 | 5XX/4XX 에러율, 캐시 히트율, Origin Latency |
Service Connect 모니터링
ECS Service Connect를 통한 서비스 간 내부 통신을 모니터링합니다. ALB를 경유하지 않는 내부 트래픽이므로, Service Connect 전용 메트릭으로 별도 추적합니다.
5XX 에러
> 10건 / 5분내부 서비스 오류 급증 감지
p99 응답 시간
> 3초 / 15분서비스 간 통신 지연 감지
Active Connection
> 100 / 3분커넥션 과다 점유 감지
New Connection Spike
> 200/분 / 3분비정상 커넥션 급증 감지
CloudWatch Agent — DB EC2 심층 모니터링
DB EC2 인스턴스는 기본 CloudWatch 메트릭(CPU)만으로는 메모리, 디스크, Swap 상태를 파악할 수 없습니다. CloudWatch Agent를 설치하여 OS 수준 메트릭을 수집하고, 이를 기반으로 추가 알람을 구성했습니다.
구성 방식
Terraform으로 IAM Role, Instance Profile, SSM Parameter 사전 생성
EC2에 Instance Profile 연결 후 CloudWatch Agent 설치
SSM Parameter Store에서 Agent 설정을 가져와 적용 — 설정 중앙 관리
systemd 서비스로 등록되어 재부팅 후에도 자동 시작
| 메트릭 | 알람 임계값 | 평가 기간 |
|---|---|---|
| mem_used_percent | > 85% | 15분 (5분×3) |
| disk_used_percent (/) | > 85% | 10분 (5분×2) |
| disk_used_percent (/data) | > 85% | 10분 (5분×2) |
| swap_used_percent | > 50% | 15분 (5분×3) |
CloudWatch 대시보드
Prod/Staging 각각 전용 대시보드를 구성하여 전체 리소스 상태를 한눈에 파악할 수 있도록 했습니다. 6개 Row로 구성되며, 각 Row는 관련 리소스의 핵심 메트릭을 시각화합니다.
ECS RunningTaskCount, CPU/Memory 사용률
Service Connect auth — 요청/응답, 응답 시간, 커넥션
Service Connect tax — 요청/응답, 응답 시간, 커넥션
ALB — 요청/에러, 응답 시간, Healthy/Unhealthy Host
ElastiCache Valkey CPU/Memory, DB EC2 CPU/Network
CloudFront — 요청/에러율, 캐시 히트율, Origin Latency
SNS 알림 채널
CloudFront 알람은 us-east-1에서만 메트릭이 생성되므로, 리전별로 SNS Topic을 분리하여 구성했습니다. 이메일 구독은 Terraform 변수로 자동 생성됩니다.
Seoul (ap-northeast-2)
ECS 서비스 헬스/리소스 알람
Service Connect 알람
ALB 알람
ElastiCache 알람
DB EC2 알람
Virginia (us-east-1)
CloudFront 5XX/4XX 에러율 알람
CloudFront 캐시 히트율 알람
CloudFront Origin Latency 알람
Terraform 기반 IaC 구성
모니터링 전체를 Terraform으로 코드화하여, 환경 추가 시 변수만 변경하면 동일한 모니터링 세트가 자동 생성됩니다. Prod와 Staging은 각각 독립된 state를 가지며, 계정 공통 리소스(Config, CloudTrail)와 분리됩니다.
# Terraform 디렉토리 구조
modules/monitoring/
├── main.tf # 알람 (ECS, SC, ALB, ElastiCache, DB)
├── dashboard.tf # CloudWatch 대시보드
├── cwagent-iam.tf # CWAgent IAM Role/Profile
├── cwagent-ssm.tf # CWAgent 설정 SSM Parameter
└── variables.tf # 환경별 변수
environments/connect-portal/
├── prod/ # 운영 환경
└── staging/ # 스테이징 환경
Summary
CloudWatch 알람 (Prod 26 + Staging 26)
모니터링 범위 (ECS / SC / ALB / CF / Cache / DB)
CloudWatch 대시보드 (Prod + Staging)
Terraform 모듈 기반 — 환경 추가 시 변수만 변경