CloudWatch Logs Insights로 로그 조회
CloudWatch Logs Insights로 로그 조회
CloudWatch Logs Insights를 사용하면 서버 접근 로그 데이터를 대화형으로 검색하고 분석할 수 있어요. 쿼리는 로그가 전달되는 로그 그룹에 대해 실행되며 몇 초 안에 결과를 반환해요.
참고: 일반 용도 Amazon S3 버킷으로 전달된 로그를 조회하려면 "Amazon Athena로 요청 접근 로그 조회"를 참고하세요. S3 Tables 미러를 SQL로 조회하려면 "S3 Tables에서 접근 로그 조회"를 참고하세요.
출처: 문서
본문
시작하기
- https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.
- 탐색 창에서 Logs, Logs Insights를 차례로 선택합니다.
- 로그 그룹 선택기에서 서버 접근 로그 그룹을 선택합니다.
- 쿼리할 시간 범위를 선택합니다.
- 쿼리를 입력하고 Run query를 선택합니다.
트래픽 분석
다음 쿼리는 요청 볼륨과 트래픽 패턴을 이해하는 데 도움을 줘요.
시간 경과에 따른 요청 볼륨 예시
stats count(*) as requests by bin(5m) as interval
| sort interval asc
작업 유형별 요청 구성 예시
stats count(*) as cnt by operation
| sort cnt desc
버킷별 트래픽 예시
stats count(*) as requests, sum(bytes_sent_size) as bytes_out by bucket_arn
| sort requests desc
오류 문제 해결
다음 쿼리는 오류를 식별하고 진단하는 데 도움을 줘요.
오류율 분석 예시
filter http_status >= 400
| stats count(*) as error_count by http_status, error_code, operation
| sort error_count desc
403 Access Denied 요청 예시
filter http_status = 403
| stats count(*) as denied_count by key_name, remote_ip, requester
| sort denied_count desc
404 Not Found 요청 예시
filter http_status = 404
| stats count(*) as miss_count by key_name, error_code, remote_ip
| sort miss_count desc
503 SlowDown(스로틀링) 이벤트 예시
filter http_status = 503
| stats count(*) as throttle_count by key_name, remote_ip
| sort throttle_count desc
접근 패턴
다음 쿼리는 누가 어떻게 데이터에 접근하는지 이해하는 데 도움을 줘요.
소스 IP별 트래픽 예시
stats count(*) as total_requests,
sum(http_status >= 400) as errors,
sum(bytes_sent_size) as bytes_transferred
by remote_ip
| sort total_requests desc
요청자별 작업 예시
stats count(*) as requests by requester, operation
| sort requests desc
가장 많이 접근한 키 예시
filter operation like /REST\.(GET|PUT)\.OBJECT/
| stats count(*) as access_count, sum(bytes_sent_size) as bytes_out by key_name
| sort access_count desc
| limit 10
대기 시간 분석
다음 쿼리는 느린 요청과 대기 시간 추세를 식별하는 데 도움을 줘요.
작업 유형별 대기 시간 예시
filter operation like /REST\.(GET|PUT)\.OBJECT/
| stats avg(total_duration) as avg_ms,
pct(total_duration, 50) as p50_ms,
pct(total_duration, 95) as p95_ms,
max(total_duration) as max_ms,
count(*) as requests
by operation
p95 대기 시간 기준 가장 느린 키 예시
filter operation like /REST\.GET\.OBJECT/
| stats avg(total_duration) as avg_ms,
pct(total_duration, 95) as p95_ms,
count(*) as requests
by key_name
| sort p95_ms desc
| limit 10
시간 경과에 따른 대기 시간 예시
filter operation like /REST\.(GET|PUT)\.OBJECT/
| stats avg(total_duration) as avg_ms, pct(total_duration, 95) as p95_ms by bin(5m) as interval
| sort interval asc
비용 배분
다음 쿼리는 데이터 전송을 이해하고 비용 요인을 식별하는 데 도움을 줘요.
작업별 데이터 전송 예시
filter operation like /REST\.(GET|PUT|DELETE)\.OBJECT/
| stats sum(bytes_sent_size) as total_bytes_out,
sum(object_size) as total_object_bytes,
count(*) as request_count
by operation
| sort total_bytes_out desc
서비스 중인 가장 큰 객체 예시
filter operation like /REST\.GET\.OBJECT/ and bytes_sent_size > 0
| stats max(object_size) as max_size, avg(object_size) as avg_size, count(*) as reads by key_name
| sort max_size desc
| limit 10
보안 분석
다음 쿼리는 의심스러운 접근 패턴을 감지하는 데 도움을 줘요.
오류율이 높은 IP 예시
stats count(*) as total,
sum(http_status >= 400) as errors
by remote_ip
| filter errors > 10
| sort errors desc
키별 실패한 접근 시도 예시
filter http_status >= 400
| stats count(*) as attempts by remote_ip, key_name, operation, http_status
| sort attempts desc
| limit 20
TLS 버전 분포 예시
stats count(*) as cnt by tls_version
| sort cnt desc