

# CloudWatch Logs Insights로 로그 쿼리
<a name="sal-cw-querying-insights"></a>

CloudWatch Logs Insights를 사용하면 서버 액세스 로그 데이터를 대화식으로 검색해 분석할 수 있습니다. 쿼리는 로그가 전송되는 로그 그룹에 대해 실행되며 몇 초 만에 결과를 반환합니다.

**참고**  
Amazon S3 범용 버킷으로 전송된 로그를 쿼리하려면 [Amazon Athena를 사용하여 요청에 대한 액세스 로그 쿼리](using-s3-access-logs-to-identify-requests.md#querying-s3-access-logs-for-requests) 섹션을 참조하세요. SQL을 사용하여 S3 Tables 미러를 쿼리하려면 [S3 Tables에서 액세스 로그 쿼리](sal-cw-querying-s3tables.md) 섹션을 참조하세요.

## 시작하기
<a name="sal-cw-insights-getting-started"></a>

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **Logs**를 선택한 다음, **Logs Insights**를 선택합니다.

1. 로그 그룹 선택기에서 서버 액세스 로그 그룹을 선택합니다.

1. 쿼리의 시간 범위를 선택합니다.

1. 쿼리를 입력하고 **Run query**를 선택합니다.

## 트래픽 분석
<a name="sal-cw-insights-traffic"></a>

다음 쿼리는 요청 볼륨 및 트래픽 패턴을 이해하는 데 도움이 됩니다.

**Example 시간 경과에 따른 요청 볼륨**  

```
stats count(*) as requests by bin(5m) as interval
| sort interval asc
```

**Example 작업 유형별 요청 혼합**  

```
stats count(*) as cnt by operation
| sort cnt desc
```

**Example 버킷별 트래픽**  

```
stats count(*) as requests, sum(bytes_sent_size) as bytes_out by bucket_arn
| sort requests desc
```

## 오류 해결
<a name="sal-cw-insights-errors"></a>

다음 쿼리는 오류를 식별하고 진단하는 데 도움이 됩니다.

**Example 오류율 분석**  

```
filter http_status >= 400
| stats count(*) as error_count by http_status, error_code, operation
| sort error_count desc
```

**Example 403 액세스 거부 요청**  

```
filter http_status = 403
| stats count(*) as denied_count by key_name, remote_ip, requester
| sort denied_count desc
```

**Example 404 요청을 찾을 수 없음**  

```
filter http_status = 404
| stats count(*) as miss_count by key_name, error_code, remote_ip
| sort miss_count desc
```

**Example 503 속도 저하(스로틀링) 이벤트**  

```
filter http_status = 503
| stats count(*) as throttle_count by key_name, remote_ip
| sort throttle_count desc
```

## 액세스 패턴
<a name="sal-cw-insights-access"></a>

다음 쿼리는 데이터에 액세스하는 사람과 방법을 이해하는 데 도움이 됩니다.

**Example 소스 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
```

**Example 요청자별 작업**  

```
stats count(*) as requests by requester, operation
| sort requests desc
```

**Example 가장 많이 액세스한 키**  

```
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
```

## 지연 시간 분석
<a name="sal-cw-insights-latency"></a>

다음 쿼리는 느린 요청 및 지연 시간 추세를 식별하는 데 도움이 됩니다.

**Example 작업 유형별 지연 시간**  

```
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
```

**Example 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
```

**Example 시간 경과에 따른 지연 시간**  

```
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
```

## 비용 분담
<a name="sal-cw-insights-cost"></a>

다음 쿼리는 데이터 전송을 이해하고 비용 발생 요인을 파악하는 데 도움이 됩니다.

**Example 작업별 데이터 전송**  

```
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
```

**Example 제공되는 가장 큰 객체**  

```
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
```

## 보안 분석
<a name="sal-cw-insights-security"></a>

다음 쿼리는 의심스러운 액세스 패턴을 감지하는 데 도움이 됩니다.

**Example 오류율이 높은 IP**  

```
stats count(*) as total,
  sum(http_status >= 400) as errors
  by remote_ip
| filter errors > 10
| sort errors desc
```

**Example 키별 액세스 시도 실패**  

```
filter http_status >= 400
| stats count(*) as attempts by remote_ip, key_name, operation, http_status
| sort attempts desc
| limit 20
```

**Example TLS 버전 배포**  

```
stats count(*) as cnt by tls_version
| sort cnt desc
```