Part 1에서 기본 모니터링과 CPU 알람을, Part 2에서 CloudWatch Agent로 메모리/디스크 모니터링을 설정했습니다. 이제 CPU, 메모리, 디스크, 네트워크 메트릭을 수집하고 있지만 확인하려면 여기저기 클릭해야 합니다.
이번 글에서는 CloudWatch 대시보드로 모든 메트릭을 한 화면에 정리하고, CloudWatch Logs로 서버 로그까지 수집해서 EC2 모니터링 시스템을 완성합니다.
CloudWatch 대시보드 만들기
대시보드는 여러 메트릭을 위젯 형태로 배치해서 한눈에 볼 수 있는 화면입니다. EC2 인스턴스 상태를 파악하기 위해 꼭 필요한 메트릭들을 모아보겠습니다.
대시보드 생성
AWS 콘솔에서 CloudWatch 서비스로 이동
좌측 메뉴에서 대시보드 클릭
대시보드 생성 버튼 클릭
대시보드 이름 입력: EC2-Monitoring (알아보기 쉬운 이름)
대시보드 생성 클릭
위젯 종류
대시보드에 추가할 수 있는 위젯 종류입니다.
위젯
용도
추천 상황
라인
시간에 따른 변화 추적
CPU, 메모리 사용률 추이
숫자
현재 값 표시
현재 디스크 사용률
게이지
임계값 대비 현재 상태
메모리 사용률 경고 수준
막대
비교 분석
여러 인스턴스 비교
텍스트
설명, 링크 추가
대시보드 안내문
로그 테이블
로그 쿼리 결과
최근 에러 로그
이 글에서는 라인 위젯을 주로 사용합니다. 시간에 따른 추이를 보기 좋고, 가장 범용적입니다.
CPU 사용률 위젯 추가
위젯 추가 또는 + 버튼 클릭
라인 선택 > 다음
지표 탭 선택
EC2 > 인스턴스별 지표 클릭
대상 인스턴스의 CPUUtilization 체크
위젯 생성 클릭
메모리 가용률 위젯 추가
위젯 추가 > 라인 > 다음
CWAgent > InstanceId 클릭
mem_available_percent 체크
위젯 생성 클릭
💡 mem_used_percent vs mem_available_percent
Part 2에서 설명했듯이, mem_available_percent가 실제 사용 가능한 메모리를 더 정확하게 반영합니다. 대시보드에서도 이 메트릭을 사용하는 것을 권장합니다.
디스크 사용률 위젯 추가
위젯 추가 > 라인 > 다음
CWAgent > InstanceId, device, fstype, path 클릭
disk_used_percent 체크
위젯 생성 클릭
네트워크 I/O 위젯 추가
위젯 추가 > 라인 > 다음
EC2 > 인스턴스별 지표 클릭
NetworkIn, NetworkOut 체크 (같은 위젯에 두 메트릭)
위젯 생성 클릭
대시보드 레이아웃 정리
위젯들을 드래그해서 원하는 위치로 배치할 수 있습니다. 레이아웃 예시:
flowchart LR
subgraph DASH["📊 EC2-Monitoring 대시보드"]
subgraph L[" "]
direction TB
W1["디스크 사용률<br/>(CWAgent)"]
W2["네트워크 I/O<br/>(EC2)"]
end
subgraph R[" "]
direction TB
W3["CPU 사용률<br/>(EC2)"]
W4["메모리 가용률<br/>(CWAgent)"]
end
end
레이아웃 정리가 끝나면 우측 상단의 저장 버튼을 꼭 클릭하세요.
시간 범위 설정
대시보드 상단에서 시간 범위를 설정할 수 있습니다.
1h, 3h, 12h: 최근 이슈 확인
1d, 3d, 1w: 트렌드 분석
사용자 지정: 특정 기간 지정
기본값은 3시간(3h)입니다. 용도에 따라 조절하세요.
자동 새로고침
우측 상단의 새로고침 아이콘 옆 드롭다운에서 자동 새로고침 주기를 설정할 수 있습니다.
끔: 수동 새로고침만
10초, 1분, 2분, 5분, 15분: 자동 새로고침
실시간 모니터링이 필요하면 10초, 일반적인 용도면 5분을 권장합니다.
CloudWatch Logs 기초
대시보드로 메트릭은 한눈에 볼 수 있게 되었습니다. 이제 서버에서 발생하는 로그도 수집해보겠습니다.
왜 로그 수집이 필요한가?
메트릭만으로는 알 수 없는 정보들이 있습니다.
상황
메트릭
로그
“CPU가 갑자기 올랐는데 원인이 뭐지?”
CPU 100% 확인 가능
어떤 프로세스/요청이 원인인지 확인 가능
“서버에 누가 접속했지?”
확인 불가
SSH 로그인 기록 확인 가능
“애플리케이션 에러가 났는데…”
확인 불가
에러 메시지, 스택 트레이스 확인 가능
로그 그룹과 로그 스트림
CloudWatch Logs의 구조를 이해하면 설정이 쉬워집니다.
CloudWatch Logs
└── 로그 그룹 (Log Group): /ec2/syslog
├── 로그 스트림 (Log Stream): i-0abc123... (인스턴스 1)
├── 로그 스트림 (Log Stream): i-0def456... (인스턴스 2)
└── 로그 스트림 (Log Stream): i-0ghi789... (인스턴스 3)
로그 그룹: 같은 종류의 로그를 묶는 컨테이너 (예: syslog, nginx-access)
로그 스트림: 로그 그룹 내에서 소스별로 구분 (예: 인스턴스별)
보존 기간 설정
로그는 저장 용량에 따라 비용이 발생합니다. CloudWatch 콘솔에서 로그 그룹별로 보존 기간을 설정할 수 있습니다.
설정 위치: CloudWatch > 로그 > 로그 그룹 > 로그 그룹 선택 > 작업 > 보존 설정 편집
보존 기간
용도
1일 ~ 1주
디버깅, 임시 로그
1개월
일반 운영 로그
3개월 ~ 1년
감사, 컴플라이언스
무기한
장기 보관 필요 시 (비용 주의)
기본값은 무기한 (Never expire) 이므로, 비용 관리를 위해 적절한 보존 기간을 설정하는 것이 좋습니다.
Agent로 로그 수집 설정
Part 2에서 설치한 CloudWatch Agent로 로그도 수집할 수 있습니다. 기존 설정 파일에 logs 섹션을 추가하면 됩니다.
run_as_user를 지정하지 않으면 CloudWatch Agent는 기본값인 root 권한으로 실행됩니다. root로 실행하면 /var/log/syslog, /var/log/auth.log, Docker 로그 등 대부분의 로그 파일을 별도 권한 설정 없이 읽을 수 있습니다. (AWS 문서 참고↗)
Wizard로 설정하면 기본적으로 "run_as_user": "cwagent"가 설정되어 권한 문제가 생길 수 있습니다. 이 경우 트러블슈팅 섹션을 참고하세요.
로그 설정 항목 설명
항목
설명
예시
file_path
수집할 로그 파일 경로
/var/log/syslog
log_group_name
CloudWatch 로그 그룹 이름
/ec2/syslog
log_stream_name
로그 스트림 이름 ({instance_id}로 자동 설정)
i-0abc123def456
timestamp_format
로그의 타임스탬프 형식
%b %d %H:%M:%S
💡 timestamp_format
syslog의 타임스탬프는 Jan 5 14:30:00 형식입니다. 이를 파싱하기 위해 %b %d %H:%M:%S를 사용합니다.
Part 2에서 연결한 CloudWatchAgentServerPolicy에는 로그 쓰기 권한이 포함되어 있습니다. 역할이 제대로 연결되어 있는지 확인하세요.
3. 로그 파일 경로 확인
Terminal window
# 파일 존재 여부 확인
ls-la/var/log/syslog
# 최근 로그 확인
tail-10/var/log/syslog
Logs Insights 쿼리가 결과를 반환하지 않을 때
시간 범위 확인: 로그가 수집된 시간과 쿼리 시간 범위가 맞는지 확인
로그 그룹 확인: 올바른 로그 그룹을 선택했는지 확인
필터 조건 확인: filter 조건이 너무 제한적이지 않은지 확인
Wizard로 설정 시 로그 권한 문제
amazon-cloudwatch-agent-config-wizard로 config.json을 생성하면 기본적으로 "run_as_user": "cwagent"가 설정됩니다. cwagent 사용자는 시스템 로그나 Docker 로그를 읽을 권한이 없어서 로그 수집이 안 될 수 있습니다.
증상 확인
Agent 로그에서 piping log from 메시지가 해당 로그 파일에 대해 출력되지 않으면 권한 문제입니다.