

# Amazon S3에 저장된 Internet Information Server(IIS) 로그 쿼리
<a name="querying-iis-logs"></a>

Amazon Athena를 사용하여 Amazon S3 계정에 저장된 Microsoft Internet Information Services(IIS) 웹 서버 로그를 쿼리합니다. IIS는 [다양한](https://docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms525807(v%3Dvs.90)) 로그 파일 형식을 사용하지만 이 주제에서는 Athena에서 테이블 스키마를 생성하여 W3C 확장 로그 및 IIS 로그 파일 형식의 로그를 쿼리하는 방법을 보여줍니다.

W3C 확장 로그 및 IIS 로그 파일 형식은 단일 문자 구분 기호(각각 공백 및 쉼표)를 사용하고 따옴표로 값을 둘러싸지 않으므로 [LazySimpleSerDe](lazy-simple-serde.md)를 사용해 이에 대한 Athena 테이블을 생성할 수 있습니다.

**Topics**
+ [W3C 확장 로그 파일 형식 쿼리](querying-iis-logs-w3c-extended-log-file-format.md)
+ [IIS 로그 파일 형식 쿼리](querying-iis-logs-iis-log-file-format.md)
+ [NCSA 로그 파일 형식 쿼리](querying-iis-logs-ncsa-log-file-format.md)

# W3C 확장 로그 파일 형식 쿼리
<a name="querying-iis-logs-w3c-extended-log-file-format"></a>

[W3C 확장](https://docs.microsoft.com/en-us/windows/win32/http/w3c-logging) 로그 파일 데이터 형식은 공백으로 구분된 필드를 가집니다. W3C 확장 로그에 나타나는 필드는 포함할 로그 필드를 선택하는 웹 서버 관리자가 결정합니다. 다음 로그 데이터 예제에는 `date, time`, `c-ip`, `s-ip`, `cs-method`, `cs-uri-stem`, `sc-status`, `sc-bytes`, `cs-bytes`, `time-taken`, `cs-version` 필드가 있습니다.

```
2020-01-19 22:48:39 203.0.113.5 198.51.100.2 GET /default.html 200 540 524 157 HTTP/1.0
2020-01-19 22:49:40 203.0.113.10 198.51.100.12 GET /index.html 200 420 324 164 HTTP/1.0
2020-01-19 22:50:12 203.0.113.12 198.51.100.4 GET /image.gif 200 324 320 358 HTTP/1.0
2020-01-19 22:51:44 203.0.113.15 198.51.100.16 GET /faq.html 200 330 324 288 HTTP/1.0
```

## Athena에서 W3C 확장 로그용 테이블 생성
<a name="querying-iis-logs-creating-a-table-in-athena-for-w3c-extended-logs"></a>

W3C 확장 로그를 쿼리하기 전에 먼저 용 테이블 스키마를 생성해야 Athena가 로그 데이터를 읽을 수 있습니다.

**Athena에서 W3C 확장 로그에 대한 테이블을 만들려면**

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

1. 다음과 같은 DDL 문을 Athena 콘솔에 붙여 넣습니다. 다음 사항에 유의하세요.

   1. 예제에서 쿼리할 로그의 필드에 해당하는 열을 추가하거나 제거합니다.

   1. W3C 확장 로그 파일 형식의 열 이름에는 하이픈(`-`)이 있습니다. 그러나 `CREATE TABLE` 문 예제는 [Athena 이름 지정 규칙](tables-databases-columns-names.md)에 따라 이를 밑줄(`_`)로 바꿉니다.

   1. 공백 구분 기호를 지정하려면 `FIELDS TERMINATED BY ' '`를 사용합니다.

   1. Amazon S3의 W3C 확장 로그를 가리키도록 `LOCATION 's3://amzn-s3-demo-bucket/w3c-log-folder/'`의 값을 수정합니다.

   ```
   CREATE EXTERNAL TABLE `iis_w3c_logs`( 
     date_col string, 
     time_col string, 
     c_ip string,
     s_ip string,
     cs_method string, 
     cs_uri_stem string, 
     sc_status string,
     sc_bytes string,
     cs_bytes string,
     time_taken string,
     cs_version string
     ) 
   ROW FORMAT DELIMITED  
     FIELDS TERMINATED BY ' '  
   STORED AS INPUTFORMAT  
     'org.apache.hadoop.mapred.TextInputFormat'  
   OUTPUTFORMAT  
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
   LOCATION   's3://amzn-s3-demo-bucket/w3c-log-folder/'
   ```

1. Athena 콘솔에서 `iis_w3c_logs` 테이블을 등록하는 쿼리를 실행합니다. 이 쿼리가 완료되면 로그를 Athena에서 쿼리할 수 있습니다.

## W3C 확장 로그 셀렉트 쿼리 예제
<a name="querying-iis-logs-example-w3c-extended-log-select-query"></a>

다음 쿼리 예제는 `iis_w3c_logs` 테이블에서 날짜, 시간, 요청 대상, 요청에 걸린 시간을 선택합니다. `WHERE` 절은 HTTP 메서드가 `GET`이고 HTTP 상태 코드가 `200`(성공)인 경우를 필터링합니다.

```
SELECT date_col, time_col, cs_uri_stem, time_taken
FROM iis_w3c_logs
WHERE cs_method = 'GET' AND sc_status = '200'
```

다음 이미지는 Athena 쿼리 편집기의 쿼리 결과를 보여줍니다.

![\[Amazon S3에 저장된 W3C 확장 로그 파일에 대한 Athena의 쿼리 결과 예시.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/querying-iis-logs-1.png)


## 날짜 필드와 시간 필드 결합
<a name="querying-iis-logs-example-w3c-extended-log-combining-date-and-time"></a>

공백으로 구분된 `date` 및 `time` 필드는 로그 소스 데이터에서 분리된 항목들이지만 원할 경우 이들을 타임스탬프로 결합할 수 있습니다. [SELECT](select.md) 또는 [CREATE TABLE AS SELECT](create-table-as.md) 쿼리에서 [concat()](https://prestodb.io/docs/current/functions/string.html#concat) 및 [date\$1parse()](https://prestodb.io/docs/current/functions/datetime.html#date_parse) 함수를 사용하여 날짜 및 시간 열을 타임스탬프 형식으로 연결하고 변환합니다. 다음 예제에서는 CTAS 쿼리를 사용하여 `derived_timestamp` 열을 가진 새 테이블을 만듭니다.

```
CREATE TABLE iis_w3c_logs_w_timestamp AS
SELECT 
  date_parse(concat(date_col,' ', time_col),'%Y-%m-%d %H:%i:%s') as derived_timestamp, 
  c_ip, 
  s_ip, 
  cs_method, 
  cs_uri_stem, 
  sc_status, 
  sc_bytes, 
  cs_bytes, 
  time_taken, 
  cs_version
FROM iis_w3c_logs
```

다음 예제와 같이 테이블을 생성하면 새 타임스탬프 열을 직접 쿼리할 수 있습니다.

```
SELECT derived_timestamp, cs_uri_stem, time_taken
FROM iis_w3c_logs_w_timestamp
WHERE cs_method = 'GET' AND sc_status = '200'
```

다음 이미지는 쿼리의 결과를 보여줍니다.

![\[파생된 타임스탬프 열을 가진 테이블에 대한 W3C 확장 로그 파일 쿼리 결과.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/querying-iis-logs-1a.png)


# IIS 로그 파일 형식 쿼리
<a name="querying-iis-logs-iis-log-file-format"></a>

W3C 확장 형식과 달리 [IIS 로그 파일 형식](https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc728311(v%3dws.10))에는 고정된 필드 집합이 있으며 구분 기호로 쉼표를 포함합니다. LazySimpleSerDe는 쉼표를 구분 기호로 처리하고 쉼표 뒤의 공백을 다음 필드의 시작으로 처리합니다.

다음 예제에서는 IIS 로그 파일 형식의 샘플 데이터를 보여 줍니다.

```
203.0.113.15, -, 2020-02-24, 22:48:38, W3SVC2, SERVER5, 198.51.100.4, 254, 501, 488, 200, 0, GET, /index.htm, -, 
203.0.113.4, -, 2020-02-24, 22:48:39, W3SVC2, SERVER6, 198.51.100.6, 147, 411, 388, 200, 0, GET, /about.html, -, 
203.0.113.11, -, 2020-02-24, 22:48:40, W3SVC2, SERVER7, 198.51.100.18, 170, 531, 468, 200, 0, GET, /image.png, -, 
203.0.113.8, -, 2020-02-24, 22:48:41, W3SVC2, SERVER8, 198.51.100.14, 125, 711, 868, 200, 0, GET, /intro.htm, -,
```

## Athena에서 IIS 로그 파일용 테이블 생성
<a name="querying-iis-logs-creating-a-table-in-athena-for-iis-log-files"></a>

Amazon S3의 IIS 로그를 쿼리하려면 먼저 테이블 스키마를 생성해야 Athena가 로그 데이터를 읽을 수 있습니다.

**Athena에서 IIS 로그 파일 형식 로그에 대한 테이블 생성**

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

1. 다음의 DDL 문을 Athena 콘솔에 붙여 넣습니다. 다음 사항에 유의하세요.

   1. 쉼표 구분 기호를 지정하려면 `FIELDS TERMINATED BY ','`를 사용합니다.

   1. LOCATION 's3://amzn-s3-demo-bucket/*iis-log-file-folder*/'의 값을 Amazon S3의 IIS 로그 형식 로그 파일을 가리키도록 수정합니다.

   ```
   CREATE EXTERNAL TABLE `iis_format_logs`(
   client_ip_address string,
   user_name string,
   request_date string,
   request_time string,
   service_and_instance string,
   server_name string,
   server_ip_address string,
   time_taken_millisec string,
   client_bytes_sent string,
   server_bytes_sent string,
   service_status_code string,
   windows_status_code string,
   request_type string,
   target_of_operation string,
   script_parameters string
      )
   ROW FORMAT DELIMITED
     FIELDS TERMINATED BY ','
   STORED AS INPUTFORMAT
     'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/iis-log-file-folder/'
   ```

1. Athena 콘솔에서 `iis_format_logs` 테이블을 등록하는 쿼리를 실행합니다. 이 쿼리가 완료되면 로그를 Athena에서 쿼리할 수 있습니다.

## IIS 로그 형식 셀렉트 쿼리 예제
<a name="querying-iis-logs-example-iis-log-format-select-query"></a>

다음 쿼리 예제는 `iis_format_logs` 테이블에서 요청 날짜, 요청 시간, 요청 대상, 걸린 시간(밀리초 단위)을 선택합니다. `WHERE` 절은 요청 유형이 `GET`이고 HTTP 상태 코드가 `200`(성공)인 경우를 필터링합니다. 쿼리가 성공하려면 쿼리에서 `' GET'` 및 `' 200'`에 선행하는 공백이 필요합니다.

```
SELECT request_date, request_time, target_of_operation, time_taken_millisec
FROM iis_format_logs
WHERE request_type = ' GET' AND service_status_code = ' 200'
```

다음 이미지는 샘플 데이터에 대한 쿼리 결과를 보여줍니다.

![\[Amazon S3에 저장된 IIS 로그 형식의 로그 파일에 대한 Athena의 쿼리 결과 예시.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/querying-iis-logs-2.png)


# NCSA 로그 파일 형식 쿼리
<a name="querying-iis-logs-ncsa-log-file-format"></a>

IIS는 [NCSA 로깅](https://docs.microsoft.com/en-us/windows/win32/http/ncsa-logging) 형식도 사용합니다. 이 형식은 공백으로 구분된 ASCII 텍스트 형식의 고정된 필드 수를 갖습니다. 구조는 Apache 액세스 로그에 사용되는 일반적인 로그 형식과 유사합니다. NCSA 일반 로그 형식의 필드에는 클라이언트 IP 주소, 클라이언트 ID(일반적으로 사용되지 않음), 도메인\$1사용자 ID, 요청 수신 타임스탬프, 클라이언트 요청의 텍스트, 서버 상태 코드, 클라이언트로 반환된 개체의 크기가 포함됩니다.

다음 예제는 IIS에서 설명한 것과 같은 NCSA 일반 로그 형식의 데이터를 보여 줍니다.

```
198.51.100.7 - ExampleCorp\Li [10/Oct/2019:13:55:36 -0700] "GET /logo.gif HTTP/1.0" 200 232
198.51.100.14 - AnyCompany\Jorge [24/Nov/2019:10:49:52 -0700] "GET /index.html HTTP/1.1" 200 2165
198.51.100.22 - ExampleCorp\Mateo [27/Dec/2019:11:38:12 -0700] "GET /about.html HTTP/1.1" 200 1287
198.51.100.9 - AnyCompany\Nikki [11/Jan/2020:11:40:11 -0700] "GET /image.png HTTP/1.1" 404 230
198.51.100.2 - ExampleCorp\Ana [15/Feb/2019:10:12:22 -0700] "GET /favicon.ico HTTP/1.1" 404 30
198.51.100.13 - AnyCompany\Saanvi [14/Mar/2019:11:40:33 -0700] "GET /intro.html HTTP/1.1" 200 1608
198.51.100.11 - ExampleCorp\Xiulan [22/Apr/2019:10:51:34 -0700] "GET /group/index.html HTTP/1.1" 200 1344
```

## Athena에서 IIS NCSA 로그용 테이블 생성
<a name="querying-iis-logs-ncsa-creating-a-table-in-athena"></a>

`CREATE TABLE` 문에는 [Apache 웹 서버 로그](querying-apache-logs.md)의 경우와 비슷한 [Grok SerDe](grok-serde.md) 및 grok 패턴을 사용할 수 있습니다. Apache 로그와 달리, grok 패턴은 `domain\user_id`에서 백슬래시의 존재를 설명하기 위해 세 번째 필드에 대해 `%{USERNAME:user_id}` 대신 `%{DATA:user_id}`를 사용합니다. Grok SerDe를 사용하는 방법에 대한 자세한 내용은 *AWS Glue 개발자 안내서*의 [Grok 사용자 지정 분류자 작성](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#custom-classifier-grok)을 참조하세요.

**Athena에서 IIS NCSA 웹 서버 로그에 대한 테이블 생성**

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

1. 다음의 DDL 문을 Athena 쿼리 편집기에 붙여 넣습니다. Amazon S3의 IIS NCSA 로그를 가리키도록 `LOCATION 's3://amzn-s3-demo-bucket/iis-ncsa-logs/'`의 값을 수정합니다.

   ```
   CREATE EXTERNAL TABLE iis_ncsa_logs(
     client_ip string,
     client_id string,
     user_id string,
     request_received_time string,
     client_request string,
     server_status string,
     returned_obj_size string
     )
   ROW FORMAT SERDE
      'com.amazonaws.glue.serde.GrokSerDe'
   WITH SERDEPROPERTIES (
      'input.format'='^%{IPV4:client_ip} %{DATA:client_id} %{DATA:user_id} %{GREEDYDATA:request_received_time} %{QUOTEDSTRING:client_request} %{DATA:server_status} %{DATA: returned_obj_size}$'
      )
   STORED AS INPUTFORMAT
      'org.apache.hadoop.mapred.TextInputFormat'
   OUTPUTFORMAT
      'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
      's3://amzn-s3-demo-bucket/iis-ncsa-logs/';
   ```

1. Athena 콘솔에서 `iis_ncsa_logs` 테이블을 등록하는 쿼리를 실행합니다. 이 쿼리가 완료되면 로그를 Athena에서 쿼리할 수 있습니다.

## IIS NCSA 로그에 대한 선택 쿼리 예제
<a name="querying-iis-logs-ncsa-example-select-queries"></a>

**Example - 404 오류에 대한 필터링**  
다음 쿼리 예제는 `iis_ncsa_logs` 테이블에서 요청 수신 시간, 클라이언트 요청의 텍스트 및 서버 상태 코드를 선택합니다. `WHERE` 절은 HTTP 상태 코드 `404`(페이지를 찾을 수 없음)를 필터링합니다.  

```
SELECT request_received_time, client_request, server_status
FROM iis_ncsa_logs
WHERE server_status = '404'
```
다음 이미지는 Athena 쿼리 편집기의 쿼리 결과를 보여줍니다.  

![\[Athena에서 HTTP 404 항목에 대해 IIS NCSA 로그 쿼리.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/querying-iis-logs-3.png)


**Example - 특정 도메인의 성공적인 요청에 대한 필터링**  
다음 쿼리 예제는 `iis_ncsa_logs` 테이블에서 사용자 ID, 요청 수신 시간, 클라이언트 요청의 텍스트 및 서버 상태 코드를 선택합니다. `WHERE` 절은 HTTP 상태 코드 `200`(성공)을 가진 `AnyCompany` 도메인의 사용자 요청을 필터링합니다.  

```
SELECT user_id, request_received_time, client_request, server_status
FROM iis_ncsa_logs
WHERE server_status = '200' AND user_id LIKE 'AnyCompany%'
```
다음 이미지는 Athena 쿼리 편집기의 쿼리 결과를 보여줍니다.  

![\[Athena에서 HTTP 200 항목에 대해 IIS NCSA 로그 쿼리.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/querying-iis-logs-4.png)
