CloudWatch 로그 기본 구조
AWS CloudWatch Logs는 다양한 AWS 서비스 및 애플리케이션의 로그를 중앙에서 저장하고 분석할 수 있도록 지원하는 서비스입니다. 하지만 CloudWatch에서 수집하는 로그의 형식은 서비스별로 다르며, JSON, 텍스트, CSV 등 다양한 포맷을 가질 수 있습니다. 본 글에서는 CloudWatch 로그 포맷의 종류 및 구조를 상세히 분석하고, 효과적인 로그 필터링을 통해 비용을 절감하는 방법을 알아보겠습니다.
AWS CloudWatch Logs는 다양한 유형의 로그 데이터를 저장할 수 있으며, 각 로그는 로그 그룹(Log Group), 로그 스트림(Log Stream), 로그 이벤트(Log Event)의 구조를 가집니다.
- 로그 그룹(Log Group)
- 로그 그룹은 특정 애플리케이션 또는 서비스의 로그를 그룹화하는 가장 상위 단위입니다. 예를 들어, 웹 애플리케이션의 로그와 데이터베이스 로그를 별도의 로그 그룹으로 구분할 수 있는 방식입니다. 로그 그룹은 로그 데이터의 논리적 구분 및 관리를 돕습니다.
- 로그 스트림(Log Stream)
- 로그 스트림은 로그 그룹 내에서 특정 소스(예: EC2 인스턴스, Lambda 함수 등)에서 생성된 연속적인 로그 데이터 흐름을 나타내는 개념입니다. 각 로그 스트림은 고유 식별자를 가지며, 로그 데이터를 시간 순서대로 저장하는 역할을 합니다. 로그 스트림을 통해 동일 소스에서 생성된 로그 데이터를 쉽게 추적할 수 있는 구조입니다.
- 로그 이벤트(Log Event)
- 로그 이벤트는 로그 스트림 내에 저장되는 개별 로그 항목을 의미하는 단위입니다. 각 로그 이벤트는 타임스탬프, 로그 메시지, 소스 등의 정보를 포함하는 형태입니다. 로그 이벤트는 애플리케이션이나 시스템에서 발생한 특정 작업이나 이벤트를 기록하는 역할을 합니다
각 로그 이벤트는 일반적으로 타임스탬프(timestamp)와 메시지(message)를 포함하며, JSON, 텍스트, CSV 등의 형식으로 저장될 수 있습니다.
로그 설정
대부분의 AWS 서비스들은 CloudWatch 로그로 연동할 수 있는 기능을 쉽게 제공한다. AWS 콘솔 혹은 API를 통해서 해당 리소스에서 발생하는 에러와 같은 각종 이벤트 정보를 CloudWatch 로그로 저장할 수 있습니다. 그 외 어플리케이션 영역에서 발생하는 정보를 CloudWatch로 전송가능한데, 설정을 위해서는 AWS의 로그 에이전트와 설정 옵션을 이해해야 합니다.
1. EC2 인스턴스에서 로그 수집
AWS CloudWatch Logs 에이전트를 설치하여 EC2의 로그를 CloudWatch로 전송할 수 있습니다.
sudo yum install -y awslogs
sudo systemctl enable awslogsd
sudo systemctl start awslogsd
`/etc/awslogs/awslogs.conf` 파일을 수정하여 로그 전송 경로를 설정합니다.
2. Lambda의 CloudWatch Logs 연동
Lambda 함수 실행 시 자동으로 로그가 CloudWatch로 전송됩니다. console.log() 또는 print() 문을 사용하여 로그를 출력할 수 있습니다.
3. ECS, EKS에서 로그 중앙 관리
Fluent Bit 또는 FireLens를 활용하여 컨테이너 로그를 수집하고 CloudWatch로 전송할 수 있습니다.
4. VPC Flow Logs 및 API Gateway 로그 저장
네트워크 트래픽 로그를 CloudWatch에 저장하여 보안 및 성능을 모니터링할 수 있습니다.
Logs Insights 활용
CloudWatch Logs Insights는 로그 데이터를 빠르게 검색할 수 있는 강력한 도구입니다. 다음은 로그 인사이트의 쿼리 예제입니다.
- 최근 1시간 동안 발생한 모든 로그 조회
fields @timestamp, @message
| sort @timestamp desc
| limit 20
- 특정 오류 메시지 검색 (예: "ERROR")
filter @message like /ERROR/
| stats count(*) by bin(5m)
- IP별 요청 수 분석 (API 로그 예제)
filter @message like /200/
| parse @message "IP: * - UserAgent: *" as ip, user_agent
| stats count(*) by ip
| sort count(*) desc
- Lambda 실행 시간을 1시간 단위로 평균 계산
fields @timestamp, execution_time
| stats avg(execution_time) by bin(1h)
- 필터를 사용한 알람 설정
CloudWatch Logs를 활용하면 특정 이벤트 발생 시 알람을 생성할 수 있습니다.
? "Critical Error"
위 필터 패턴을 설정한 후, 필터 매칭 시 CloudWatch Alarm을 트리거하여 SNS를 통해 알람을 전송할 수 있습니다.
로그 데이터를 효과적으로 필터링하고 저장 비용을 최적화하려면 필요한 로그만 수집하고, 적절한 필터를 활용하며, 보관 기간을 조정하는 것이 중요합니다. CloudWatch Logs Insights 및 로그 필터 패턴을 적극 활용하여 운영 효율성을 극대화할 수 있습니다.