CloudWatch Logs Insights로 로그 조회

CloudWatch Logs Insights로 로그 조회

CloudWatch Logs Insights를 사용하면 서버 접근 로그 데이터를 대화형으로 검색하고 분석할 수 있어요. 쿼리는 로그가 전달되는 로그 그룹에 대해 실행되며 몇 초 안에 결과를 반환해요.

참고: 일반 용도 Amazon S3 버킷으로 전달된 로그를 조회하려면 "Amazon Athena로 요청 접근 로그 조회"를 참고하세요. S3 Tables 미러를 SQL로 조회하려면 "S3 Tables에서 접근 로그 조회"를 참고하세요.

출처: 문서

본문

시작하기

  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.
  2. 탐색 창에서 Logs, Logs Insights를 차례로 선택합니다.
  3. 로그 그룹 선택기에서 서버 접근 로그 그룹을 선택합니다.
  4. 쿼리할 시간 범위를 선택합니다.
  5. 쿼리를 입력하고 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

더 알아보기 (Learn more)