AWS 기반 운영 모니터링 환경 구축기 (EC2 + CloudWatch + Grafana) - 1편
프로젝트에서 인프라를 담당하면서,
단순히 서버를 배포하는 것을 넘어 운영 관점의 모니터링 환경을 직접 구축해보았다.
이번 글에서는 EC2 서버에서 실행 중인 Spring 백엔드 애플리케이션을 기준으로,
CloudWatch와 Grafana를 활용해 인프라 및 로그 모니터링 환경을 구성한 과정을 정리한다.
1. 환경 구성
- AWS EC2 (Ubuntu)
- Spring Boot 백엔드 (EC2에서 직접 실행)
- 로그 파일: /var/log/be/be.log
- CloudWatch (Metrics + Logs)
- Grafana (EC2에서 실행)
목표는 다음 두 가지였다.
- EC2 인프라 상태를 시각화
- 서버 로그를 중앙 수집하고, 에러를 모니터링
2. 인프라 모니터링 구성
2-1. Grafana 설치 및 CloudWatch 연동
EC2 서버에 Grafana를 실행하고,
Data Source로 AWS CloudWatch를 연결했다.
CloudWatch Metrics를 통해 EC2 지표를 가져와 대시보드를 구성했다.
2-2. 구성한 인프라 패널
🔹 CPU Utilization (Time Series)
- EC2의 CPU 사용률을 시각화
- 순간적인 부하 및 지속적인 고부하 여부 확인 가능
🔹 Network In / Network Out (Time Series)
- 네트워크 유입/유출 트래픽 확인
- 특정 시점의 트래픽 급증 여부 파악 가능
🔹 StatusCheckFailed (Stat Panel)
- EC2 인스턴스 헬스 체크 상태
- 0이면 정상, 1이면 장애
이를 통해 서버 리소스 상태를 한 화면에서 확인 가능한 인프라 대시보드를 구성했다.
3. 로그 중앙 수집 시스템 구축
기존에는 로그가 EC2 내부 파일에만 남아 있었다.
/var/log/be/be.log
이 상태에서는:
- 서버에 직접 접속해야 로그 확인 가능
- 장애 발생 시 빠른 대응이 어려움
이를 해결하기 위해 CloudWatch Logs로 로그를 중앙 수집하도록 구성했다.
3-1. CloudWatch Agent 설치
Ubuntu 환경에서는 apt로 바로 설치되지 않기 때문에
공식 .deb 패키지를 다운로드하여 설치했다.
설치 후, 로그 수집 설정 파일을 구성하여 다음 파일을 수집 대상으로 지정했다.
{
"logs":{
"logs_collected":{
"files":{
"collect_list":[
{
"file_path":"/var/log/be/be.log",
"log_group_name":"qroad-backend-log",
"log_stream_name":"{instance_id}",
"retention_in_days":14
}
]
}
}
}
}
IAM Role에는 CloudWatchAgentServerPolicy를 부여했다.
설정 적용 후, CloudWatch Logs에 qroad-backend-log 로그 그룹이 생성되고
서버 로그가 정상적으로 수집되는 것을 확인했다.
4. Grafana에서 로그 시각화
CloudWatch Logs를 Grafana에서 Data Source로 활용하여
Logs Insights 쿼리를 통해 로그를 시각화했다.
4-1. 전체 로그 패널
최근 로그를 확인할 수 있도록 구성했다.
fields @timestamp, @message
| sort @timestampdesc
| limit 100
초기에는 Hibernate DEBUG 로그가 과도하게 출력되어 가독성이 떨어졌다.
이를 정리하여 INFO 이상 로그만 보이도록 필터링했다.
4-2. ERROR 개수 추이 그래프
단순 로그 조회를 넘어,
로그를 “지표화”하기 위해 ERROR 발생 개수를 시간 단위로 집계했다.
fields @timestamp, @message
|filter@messagelike/ERROR/
| stats count() as error_count by bin(5m)
이를 통해:
- 특정 시점에 에러가 급증하는지
- 장애 패턴이 있는지
시각적으로 확인할 수 있도록 구성했다.
4-3. 500 에러 로그 패널
사용자 영향이 큰 500 에러를 별도로 필터링하여
최근 로그를 확인할 수 있는 패널을 추가했다.
fields @timestamp, @message
|filter@messagelike/500/
| sort @timestampdesc
| limit 50
이를 통해 내부 예외와 사용자 영향 장애를 구분해 확인할 수 있도록 했다.
5. 최종 대시보드 구조
현재 대시보드는 다음과 같이 구성되어 있다.
🔹 Infra 영역
- CPU Utilization
- Network In / Out
- Instance Health (StatusCheck)
🔹 Service 영역
- ERROR 개수 추이 그래프
- 500 에러 로그 패널
- 최근 로그 패널
즉,
인프라 지표 + 애플리케이션 로그를 한 화면에서 통합 확인 가능한 구조
를 완성했다.
완성화면

- 아직은 서버 운영을 본격적으로 시작하지 않아 데이터가 많지않다.
- 그러나 서버 운영을 시작하면 큰 도움을 줄것으로 예상하고 있다.
마무리
이번 작업을 통해 단순히 “서버를 운영한다”는 개념을 넘어,
- 인프라 상태 모니터링
- 로그 중앙 수집
- 로그 기반 지표화
- 인프라 + 서비스 통합 대시보드 구성
까지 직접 설계하고 구축해볼 수 있었다.
운영 환경을 경험해보니, 코드 작성과는 또 다른 영역의 고민이 필요하다는 것을 느꼈다.
다음 단계에서는 API 요청 수 및 응답 시간 지표와 비용 데이터를 추가로 시각화하여, 인프라·로그 중심의 모니터링을 서비스 운영 지표까지 확장할 계획이다.