

# Amazon CloudFront 로그 쿼리
<a name="cloudfront-logs"></a>

Amazon CloudFront CDN을 구성하여 웹 배포 액세스 로그를 Amazon Simple Storage Service로 내보낼 수 있습니다. 이러한 로그를 사용하여 CloudFront가 제공하는 웹 속성 전반에 걸쳐 사용자의 서핑 패턴을 탐색합니다.

로그 쿼리를 시작하기 전에 기본 CloudFront 배포에 따라 웹 배포에서 로그에 액세스할 수 있도록 설정합니다. 자세한 내용은 *Amazon CloudFront 개발자 안내서*의 [액세스 로그](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html)를 참조하세요. 이 로그를 저장할 Amazon S3 버킷을 기록해 둡니다.

**Topics**
+ [CloudFront 표준 로그용 테이블 생성(레거시)](create-cloudfront-table-standard-logs.md)
+ [JSON을 사용한 수동 파티셔닝을 통해 Athena에서 CloudFront 로그용 테이블 생성](create-cloudfront-table-manual-json.md)
+ [Parquet을 사용한 수동 파티셔닝을 통해 Athena에서 CloudFront 로그용 테이블 생성](create-cloudfront-table-manual-parquet.md)
+ [JSON 사용 파티션 프로젝션을 통해 Athena에서 CloudFront 로그용 테이블 생성](create-cloudfront-table-partition-json.md)
+ [Parquet 사용 파티션 프로젝션을 통해 Athena에서 CloudFront 로그용 테이블 생성](create-cloudfront-table-partition-parquet.md)
+ [CloudFront 실시간 로그용 테이블 생성](create-cloudfront-table-real-time-logs.md)
+ [추가 리소스](cloudfront-logs-additional-resources.md)

# CloudFront 표준 로그용 테이블 생성(레거시)
<a name="create-cloudfront-table-standard-logs"></a>

**참고**  
다음 절차는 CloudFront의 웹 배포 액세스 로그에 적용됩니다. RTMP 배포의 스트리밍 로그에는 적용되지 않습니다.

**CloudFront 표준 로그 파일 필드의 테이블 생성**

1. 다음 예제 DDL 문을 복사하여 Athena 콘솔의 쿼리 편집기에 붙여 넣습니다. 예제 명령문은 **Amazon CloudFront 개발자 안내서의 [표준 로그 파일 필드](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat) 섹션에 설명된 로그 파일 필드를 사용합니다. 로그를 저장하는 Amazon S3 버킷의 `LOCATION`을 수정합니다. 쿼리 편집기 사용에 대한 자세한 내용은 [시작하기](getting-started.md) 단원을 참조하세요.

   이 쿼리는 `ROW FORMAT DELIMITED` 및 `FIELDS TERMINATED BY '\t'`를 지정하여 필드가 탭 문자로 구분됨을 나타냅니다. `ROW FORMAT DELIMITED`의 경우 Athena는 기본적으로 [LazySimpleSerDe](lazy-simple-serde.md)를 사용합니다. `date` 열은 Athena에서 예약어이기 때문에 백틱(`) 키를 사용하여 이스케이프됩니다. 자세한 내용은 [쿼리에서 예약어 이스케이프](reserved-words.md) 섹션을 참조하세요.

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_standard_logs (
     `date` DATE,
     time STRING,
     x_edge_location STRING,
     sc_bytes BIGINT,
     c_ip STRING,
     cs_method STRING,
     cs_host STRING,
     cs_uri_stem STRING,
     sc_status INT,
     cs_referrer STRING,
     cs_user_agent STRING,
     cs_uri_query STRING,
     cs_cookie STRING,
     x_edge_result_type STRING,
     x_edge_request_id STRING,
     x_host_header STRING,
     cs_protocol STRING,
     cs_bytes BIGINT,
     time_taken FLOAT,
     x_forwarded_for STRING,
     ssl_protocol STRING,
     ssl_cipher STRING,
     x_edge_response_result_type STRING,
     cs_protocol_version STRING,
     fle_status STRING,
     fle_encrypted_fields INT,
     c_port INT,
     time_to_first_byte FLOAT,
     x_edge_detailed_result_type STRING,
     sc_content_type STRING,
     sc_content_len BIGINT,
     sc_range_start BIGINT,
     sc_range_end BIGINT
   )
   ROW FORMAT DELIMITED 
   FIELDS TERMINATED BY '\t'
   LOCATION 's3://amzn-s3-demo-bucket/'
   TBLPROPERTIES ( 'skip.header.line.count'='2' )
   ```

1. Athena 콘솔에서 쿼리를 실행합니다. 쿼리가 완료된 후 Athena는 `cloudfront_standard_logs` 테이블을 등록하여 쿼리를 실행할 수 있도록 데이터를 준비합니다.

## 예제 쿼리
<a name="query-examples-cloudfront-logs"></a>

다음 쿼리는 2018년 6월 9일부터 6월 11일까지 CloudFront가 제공한 바이트 수를 합산합니다. 날짜 열 이름은 예약된 단어이므로 큰따옴표로 묶습니다.

```
SELECT SUM(bytes) AS total_bytes
FROM cloudfront_standard_logs
WHERE "date" BETWEEN DATE '2018-06-09' AND DATE '2018-06-11'
LIMIT 100;
```

쿼리 결과에서 중복 행(예: 중복된 빈 행)을 제거하려면 다음 예제와 같이 `SELECT DISTINCT` 문을 사용할 수 있습니다.

```
SELECT DISTINCT * 
FROM cloudfront_standard_logs 
LIMIT 10;
```

# JSON을 사용한 수동 파티셔닝을 통해 Athena에서 CloudFront 로그용 테이블 생성
<a name="create-cloudfront-table-manual-json"></a>

**JSON 형식을 사용해 CloudFront 표준 로그 파일 필드의 테이블 생성**

1. 다음 예제 DDL 문을 복사하여 Athena 콘솔의 쿼리 편집기에 붙여 넣습니다. 예제 명령문은 **Amazon CloudFront 개발자 안내서의 [표준 로그 파일 필드](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat) 섹션에 설명된 로그 파일 필드를 사용합니다. 로그를 저장하는 Amazon S3 버킷의 `LOCATION`을 수정합니다.

   이 쿼리는 다음 SerDe 속성과 함께 OpenX JSON SerDe를 사용하여 Athena에서 JSON 필드를 올바르게 읽습니다.

   ```
   CREATE EXTERNAL TABLE `cf_logs_manual_partition_json`(
     `date` string , 
     `time` string , 
     `x-edge-location` string , 
     `sc-bytes` string , 
     `c-ip` string , 
     `cs-method` string , 
     `cs(host)` string , 
     `cs-uri-stem` string , 
     `sc-status` string , 
     `cs(referer)` string , 
     `cs(user-agent)` string , 
     `cs-uri-query` string , 
     `cs(cookie)` string , 
     `x-edge-result-type` string , 
     `x-edge-request-id` string , 
     `x-host-header` string , 
     `cs-protocol` string , 
     `cs-bytes` string , 
     `time-taken` string , 
     `x-forwarded-for` string , 
     `ssl-protocol` string , 
     `ssl-cipher` string , 
     `x-edge-response-result-type` string , 
     `cs-protocol-version` string , 
     `fle-status` string , 
     `fle-encrypted-fields` string , 
     `c-port` string , 
     `time-to-first-byte` string , 
     `x-edge-detailed-result-type` string , 
     `sc-content-type` string , 
     `sc-content-len` string , 
     `sc-range-start` string , 
     `sc-range-end` string )
   ROW FORMAT SERDE 
     'org.openx.data.jsonserde.JsonSerDe' 
   WITH SERDEPROPERTIES ( 
     'paths'='c-ip,c-port,cs(Cookie),cs(Host),cs(Referer),cs(User-Agent),cs-bytes,cs-method,cs-protocol,cs-protocol-version,cs-uri-query,cs-uri-stem,date,fle-encrypted-fields,fle-status,sc-bytes,sc-content-len,sc-content-type,sc-range-end,sc-range-start,sc-status,ssl-cipher,ssl-protocol,time,time-taken,time-to-first-byte,x-edge-detailed-result-type,x-edge-location,x-edge-request-id,x-edge-response-result-type,x-edge-result-type,x-forwarded-for,x-host-header') 
   STORED AS INPUTFORMAT 
     'org.apache.hadoop.mapred.TextInputFormat' 
   OUTPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/'
   ```

1. Athena 콘솔에서 쿼리를 실행합니다. 쿼리가 완료된 후 Athena는 `cf_logs_manual_partition_json` 테이블을 등록하여 쿼리를 실행할 수 있도록 데이터를 준비합니다.

## 예제 쿼리
<a name="query-examples-cloudfront-logs-manual-json"></a>

다음 쿼리는 2025년 1월 15일까지 CloudFront가 제공한 바이트 수를 합산합니다.

```
SELECT sum(cast("sc-bytes" as BIGINT)) as sc
FROM cf_logs_manual_partition_json
WHERE "date"='2025-01-15'
```

쿼리 결과에서 중복 행(예: 중복된 빈 행)을 제거하려면 다음 예제와 같이 `SELECT DISTINCT` 문을 사용할 수 있습니다.

```
SELECT DISTINCT * FROM cf_logs_manual_partition_json
```

# Parquet을 사용한 수동 파티셔닝을 통해 Athena에서 CloudFront 로그용 테이블 생성
<a name="create-cloudfront-table-manual-parquet"></a>

**Parquet 형식을 사용해 CloudFront 표준 로그 파일 필드의 테이블 생성**

1. 다음 예제 DDL 문을 복사하여 Athena 콘솔의 쿼리 편집기에 붙여 넣습니다. 예제 명령문은 **Amazon CloudFront 개발자 안내서의 [표준 로그 파일 필드](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#BasicDistributionFileFormat) 섹션에 설명된 로그 파일 필드를 사용합니다.

   이 쿼리는 다음 SerDe 속성과 함께 ParquetHiveSerDe를 사용하여 Athena에서 Parquet 필드를 올바르게 읽습니다.

   ```
   CREATE EXTERNAL TABLE `cf_logs_manual_partition_parquet`(
     `date` string, 
     `time` string, 
     `x_edge_location` string, 
     `sc_bytes` string, 
     `c_ip` string, 
     `cs_method` string, 
     `cs_host` string, 
     `cs_uri_stem` string, 
     `sc_status` string, 
     `cs_referer` string, 
     `cs_user_agent` string, 
     `cs_uri_query` string, 
     `cs_cookie` string, 
     `x_edge_result_type` string, 
     `x_edge_request_id` string, 
     `x_host_header` string, 
     `cs_protocol` string, 
     `cs_bytes` string, 
     `time_taken` string, 
     `x_forwarded_for` string, 
     `ssl_protocol` string, 
     `ssl_cipher` string, 
     `x_edge_response_result_type` string, 
     `cs_protocol_version` string, 
     `fle_status` string, 
     `fle_encrypted_fields` string, 
     `c_port` string, 
     `time_to_first_byte` string, 
     `x_edge_detailed_result_type` string, 
     `sc_content_type` string, 
     `sc_content_len` string, 
     `sc_range_start` string, 
     `sc_range_end` string)
   ROW FORMAT SERDE 
     'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
   STORED AS INPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
   OUTPUTFORMAT 
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
   LOCATION
     's3://amzn-s3-demo-bucket/'
   ```

1. Athena 콘솔에서 쿼리를 실행합니다. 쿼리가 완료된 후 Athena는 `cf_logs_manual_partition_parquet` 테이블을 등록하여 쿼리를 실행할 수 있도록 데이터를 준비합니다.

## 예제 쿼리
<a name="query-examples-cloudfront-logs-manual-parquet"></a>

다음 쿼리는 2025년 1월 19일까지 CloudFront가 제공한 바이트 수를 합산합니다.

```
SELECT sum(cast("sc_bytes" as BIGINT)) as sc
FROM cf_logs_manual_partition_parquet
WHERE "date"='2025-01-19'
```

쿼리 결과에서 중복 행(예: 중복된 빈 행)을 제거하려면 다음 예제와 같이 `SELECT DISTINCT` 문을 사용할 수 있습니다.

```
SELECT DISTINCT * FROM cf_logs_manual_partition_parquet
```

# JSON 사용 파티션 프로젝션을 통해 Athena에서 CloudFront 로그용 테이블 생성
<a name="create-cloudfront-table-partition-json"></a>

Athena 파티션 프로젝션 기능을 사용하여 쿼리 런타임을 줄이고 파티션 관리를 자동화할 수 있습니다. 새 데이터가 추가되면 파티션 프로젝션은 자동으로 새 파티션을 추가합니다. 따라서 `ALTER TABLE ADD PARTITION`을 사용해 파티션을 수동으로 추가할 필요가 없습니다.

다음 CREATE TABLE 문 예제에서는 하나의 AWS 리전에 대해 지정된 날짜부터 현재까지의 CloudFront 로그에 파티션 프로젝션을 자동으로 사용합니다. 쿼리가 성공적으로 실행되면 테이블을 쿼리할 수 있습니다.

```
CREATE EXTERNAL TABLE `cloudfront_logs_pp`(
  `date` string, 
  `time` string, 
  `x-edge-location` string, 
  `sc-bytes` string, 
  `c-ip` string, 
  `cs-method` string, 
  `cs(host)` string, 
  `cs-uri-stem` string, 
  `sc-status` string, 
  `cs(referer)` string, 
  `cs(user-agent)` string, 
  `cs-uri-query` string, 
  `cs(cookie)` string, 
  `x-edge-result-type` string, 
  `x-edge-request-id` string, 
  `x-host-header` string, 
  `cs-protocol` string, 
  `cs-bytes` string, 
  `time-taken` string, 
  `x-forwarded-for` string, 
  `ssl-protocol` string, 
  `ssl-cipher` string, 
  `x-edge-response-result-type` string, 
  `cs-protocol-version` string, 
  `fle-status` string, 
  `fle-encrypted-fields` string, 
  `c-port` string, 
  `time-to-first-byte` string, 
  `x-edge-detailed-result-type` string, 
  `sc-content-type` string, 
  `sc-content-len` string, 
  `sc-range-start` string, 
  `sc-range-end` string)
  PARTITIONED BY(
         distributionid string,
         year int,
         month int,
         day int,
         hour int )
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 
  'paths'='c-ip,c-port,cs(Cookie),cs(Host),cs(Referer),cs(User-Agent),cs-bytes,cs-method,cs-protocol,cs-protocol-version,cs-uri-query,cs-uri-stem,date,fle-encrypted-fields,fle-status,sc-bytes,sc-content-len,sc-content-type,sc-range-end,sc-range-start,sc-status,ssl-cipher,ssl-protocol,time,time-taken,time-to-first-byte,x-edge-detailed-result-type,x-edge-location,x-edge-request-id,x-edge-response-result-type,x-edge-result-type,x-forwarded-for,x-host-header') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/'
TBLPROPERTIES (
  'projection.distributionid.type'='enum',
  'projection.distributionid.values'='E2Oxxxxxxxxxxx',
  'projection.day.range'='01,31', 
  'projection.day.type'='integer', 
  'projection.day.digits'='2', 
  'projection.enabled'='true', 
  'projection.month.range'='01,12', 
  'projection.month.type'='integer', 
  'projection.month.digits'='2', 
  'projection.year.range'='2025,2026', 
  'projection.year.type'='integer', 
  'projection.hour.range'='00,23',
  'projection.hour.type'='integer',
  'projection.hour.digits'='2',
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/${distributionid}/${year}/${month}/${day}/${hour}/')
```

다음은 이전 예제에서 사용된 속성에 대한 몇 가지 고려 사항입니다.
+ **테이블 이름** - 테이블 이름 *`cloudfront_logs_pp`*을 바꿀 수 있습니다. 원하는 이름으로 변경할 수 있습니다.
+ **위치** - `s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/`가 Amazon S3 버킷을 가리키도록 수정합니다.
+ **배포 ID** - `projection.distributionid.values`의 경우 여러 배포 ID를 쉼표로 구분하여 지정할 수 있습니다. 예: *<distributionID1>*, *<distributionID2>*.
+ **연도 범위** - `projection.year.range`에서 데이터를 기반으로 연도 범위를 정의할 수 있습니다. 예를 들어 *2025년*, *2026년*과 같은 기간으로 조정할 수 있습니다.
**참고**  
미래 날짜(예: 2025\$12040)와 같은 빈 파티션을 포함하면 쿼리 성능에 영향을 미칠 수 있습니다. 그러나 파티션 프로젝션은 향후 날짜를 효과적으로 처리하도록 설계되었습니다. 최적의 성능을 유지하려면 파티션을 신중하게 관리하고 가능한 경우 과도한 빈 파티션을 피해야 합니다.
+ **스토리지 위치 템플릿** - 다음 CloudFront 파티셔닝 구조 및 S3 경로를 기반으로 `storage.location.template`를 올바르게 업데이트해야 합니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/create-cloudfront-table-partition-json.html)

  CloudFront 파티셔닝 구조와 S3 구조가 필요한 패턴과 일치하는지 확인한 후 `storage.location.template`을 다음과 같이 업데이트합니다.

  ```
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account_id/CloudFront/${distributionid}/folder2/${year}/${month}/${day}/${hour}/folder3/'
  ```
**참고**  
올바른 데이터 스토리지 및 검색을 보장하려면 `storage.location.template`을 적절히 구성하는 것이 중요합니다.

# Parquet 사용 파티션 프로젝션을 통해 Athena에서 CloudFront 로그용 테이블 생성
<a name="create-cloudfront-table-partition-parquet"></a>

다음 CREATE TABLE 문 예제에서는 하나의 AWS 리전에 대해 Parquet의 지정된 날짜부터 현재까지의 CloudFront 로그에 파티션 프로젝션을 자동으로 사용합니다. 쿼리가 성공적으로 실행되면 테이블을 쿼리할 수 있습니다.

```
CREATE EXTERNAL TABLE `cloudfront_logs_parquet_pp`(
`date` string, 
`time` string, 
`x_edge_location` string, 
`sc_bytes` string, 
`c_ip` string, 
`cs_method` string, 
`cs_host` string, 
`cs_uri_stem` string, 
`sc_status` string, 
`cs_referer` string, 
`cs_user_agent` string, 
`cs_uri_query` string, 
`cs_cookie` string, 
`x_edge_result_type` string, 
`x_edge_request_id` string, 
`x_host_header` string, 
`cs_protocol` string, 
`cs_bytes` string, 
`time_taken` string, 
`x_forwarded_for` string, 
`ssl_protocol` string, 
`ssl_cipher` string, 
`x_edge_response_result_type` string, 
`cs_protocol_version` string, 
`fle_status` string, 
`fle_encrypted_fields` string, 
`c_port` string, 
`time_to_first_byte` string, 
`x_edge_detailed_result_type` string, 
`sc_content_type` string, 
`sc_content_len` string, 
`sc_range_start` string, 
`sc_range_end` string)
PARTITIONED BY(
 distributionid string,
 year int,
 month int,
 day int,
 hour int )
ROW FORMAT SERDE 
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/'
TBLPROPERTIES (
'projection.distributionid.type'='enum',
'projection.distributionid.values'='E3OK0LPUNWWO3',
'projection.day.range'='01,31',
'projection.day.type'='integer',
'projection.day.digits'='2',
'projection.enabled'='true',
'projection.month.range'='01,12',
'projection.month.type'='integer',
'projection.month.digits'='2',
'projection.year.range'='2019,2025',
'projection.year.type'='integer',
'projection.hour.range'='01,12',
'projection.hour.type'='integer',
'projection.hour.digits'='2',
'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/${distributionid}/${year}/${month}/${day}/${hour}/')
```

다음은 이전 예제에서 사용된 속성에 대한 몇 가지 고려 사항입니다.
+ **테이블 이름** - 테이블 이름 *`cloudfront_logs_pp`*을 바꿀 수 있습니다. 원하는 이름으로 변경할 수 있습니다.
+ **위치** - `s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/`가 Amazon S3 버킷을 가리키도록 수정합니다.
+ **배포 ID** - `projection.distributionid.values`의 경우 여러 배포 ID를 쉼표로 구분하여 지정할 수 있습니다. 예: *<distributionID1>*, *<distributionID2>*.
+ **연도 범위** - `projection.year.range`에서 데이터를 기반으로 연도 범위를 정의할 수 있습니다. 예를 들어 *2025년*, *2026년*과 같은 기간으로 조정할 수 있습니다.
**참고**  
미래 날짜(예: 2025\$12040)와 같은 빈 파티션을 포함하면 쿼리 성능에 영향을 미칠 수 있습니다. 그러나 파티션 프로젝션은 향후 날짜를 효과적으로 처리하도록 설계되었습니다. 최적의 성능을 유지하려면 파티션을 신중하게 관리하고 가능한 경우 과도한 빈 파티션을 피해야 합니다.
+ **스토리지 위치 템플릿** - 다음 CloudFront 파티셔닝 구조 및 S3 경로를 기반으로 `storage.location.template`를 올바르게 업데이트해야 합니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/create-cloudfront-table-partition-parquet.html)

  CloudFront 파티셔닝 구조와 S3 구조가 필요한 패턴과 일치하는지 확인한 후 `storage.location.template`을 다음과 같이 업데이트합니다.

  ```
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account_id/CloudFront/${distributionid}/folder2/${year}/${month}/${day}/${hour}/folder3/'
  ```
**참고**  
올바른 데이터 스토리지 및 검색을 보장하려면 `storage.location.template`을 적절히 구성하는 것이 중요합니다.

# CloudFront 실시간 로그용 테이블 생성
<a name="create-cloudfront-table-real-time-logs"></a>

**CloudFront 실시간 로그 파일 필드의 테이블 생성**

1. 다음 예제 DDL 문을 복사하여 Athena 콘솔의 쿼리 편집기에 붙여 넣습니다. 예제 문에서는 **Amazon CloudFront 개발자 안내서의 [실시간 로그](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/real-time-logs.html) 섹션에 설명된 로그 파일 필드를 사용합니다. 로그를 저장하는 Amazon S3 버킷의 `LOCATION`을 수정합니다. 쿼리 편집기 사용에 대한 자세한 내용은 [시작하기](getting-started.md) 단원을 참조하세요.

   이 쿼리는 `ROW FORMAT DELIMITED` 및 `FIELDS TERMINATED BY '\t'`를 지정하여 필드가 탭 문자로 구분됨을 나타냅니다. `ROW FORMAT DELIMITED`의 경우 Athena는 기본적으로 [LazySimpleSerDe](lazy-simple-serde.md)를 사용합니다. `timestamp` 열은 Athena에서 예약어이기 때문에 백틱(`) 키를 사용하여 이스케이프됩니다. 자세한 내용은 [쿼리에서 예약어 이스케이프](reserved-words.md) 섹션을 참조하세요.

   다음 예제에는 사용 가능한 모든 필드가 포함되어 있습니다. 필요하지 않은 필드를 주석 처리하거나 제거할 수 있습니다.

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_real_time_logs ( 
   `timestamp` STRING,
   c_ip STRING,
   time_to_first_byte BIGINT,
   sc_status BIGINT,
   sc_bytes BIGINT,
   cs_method STRING,
   cs_protocol STRING,
   cs_host STRING,
   cs_uri_stem STRING,
   cs_bytes BIGINT,
   x_edge_location STRING,
   x_edge_request_id STRING,
   x_host_header STRING,
   time_taken BIGINT,
   cs_protocol_version STRING,
   c_ip_version STRING,
   cs_user_agent STRING,
   cs_referer STRING,
   cs_cookie STRING,
   cs_uri_query STRING,
   x_edge_response_result_type STRING,
   x_forwarded_for STRING,
   ssl_protocol STRING,
   ssl_cipher STRING,
   x_edge_result_type STRING,
   fle_encrypted_fields STRING,
   fle_status STRING,
   sc_content_type STRING,
   sc_content_len BIGINT,
   sc_range_start STRING,
   sc_range_end STRING,
   c_port BIGINT,
   x_edge_detailed_result_type STRING,
   c_country STRING,
   cs_accept_encoding STRING,
   cs_accept STRING,
   cache_behavior_path_pattern STRING,
   cs_headers STRING,
   cs_header_names STRING,
   cs_headers_count BIGINT,
   primary_distribution_id STRING,
   primary_distribution_dns_name STRING,
   origin_fbl STRING,
   origin_lbl STRING,
   asn STRING
   )
   ROW FORMAT DELIMITED 
   FIELDS TERMINATED BY '\t'
   LOCATION 's3://amzn-s3-demo-bucket/'
   TBLPROPERTIES ( 'skip.header.line.count'='2' )
   ```

1. Athena 콘솔에서 쿼리를 실행합니다. 쿼리가 완료된 후 Athena는 `cloudfront_real_time_logs` 테이블을 등록하여 쿼리를 실행할 수 있도록 데이터를 준비합니다.

# 추가 리소스
<a name="cloudfront-logs-additional-resources"></a>

Athena를 사용하여 CloudFront 로그를 쿼리하는 방법에 대한 자세한 내용은 [AWS Big Data Blog](https://aws.amazon.com/blogs/big-data/)의 다음 게시물을 참조하세요.

[Easily query AWS 서비스 logs using Amazon Athena](https://aws.amazon.com/blogs/big-data/easily-query-aws-service-logs-using-amazon-athena/)(2019년 5월 29일).

[Analyze your Amazon CloudFront access logs at scale](https://aws.amazon.com/blogs/big-data/analyze-your-amazon-cloudfront-access-logs-at-scale/)(대규모의 Amazon CloudFront 액세스 로그 분석)(2018년 12월 21일).

[Build a serverless architecture to analyze Amazon CloudFront access logs using AWS Lambda, Amazon Athena, and Amazon Managed Service for Apache Flink](https://aws.amazon.com/blogs/big-data/build-a-serverless-architecture-to-analyze-amazon-cloudfront-access-logs-using-aws-lambda-amazon-athena-and-amazon-kinesis-analytics/)(2017년 5월 26일).