

# 실시간 액세스 로그 사용
<a name="real-time-logs"></a>

CloudFront 실시간 액세스 로그를 사용하여 배포에 대해 이루어진 요청에 대한 정보를 실시간으로 제공합니다(로그는 요청을 받은 후 몇 초 내에 전달됨). 실시간 액세스 로그를 사용하여 콘텐츠 전송 성능을 모니터링 및 분석하고 이에 기초해 조치를 취할 수 있습니다.

CloudFront 실시간 액세스 로그는 구성 가능합니다. 선택 항목:
+ 실시간 로그에 대한 *샘플링 비율*(즉, 실시간 액세스 로그 레코드를 수신하려는 요청의 백분율).
+ 로그 레코드에서 수신하려는 특정 필드
+ 실시간 로그를 수신하려는 특정 캐시 동작(경로 패턴)

CloudFront 실시간 액세스 로그는 Amazon Kinesis Data Streams에서 선택한 데이터 스트림으로 전송됩니다. 자체 [Kinesis 데이터 스트림 소비자](https://docs.aws.amazon.com/streams/latest/dev/amazon-kinesis-consumers.html)를 생성하거나 Amazon Data Firehose를 사용하여 로그 데이터를 Amazon Simple Storage Service(S3), Amazon Redshift, Amazon OpenSearch Service(OpenSearch Service) 또는 서드 파티 로그 처리 서비스로 전송할 수 있습니다.

CloudFront는 Kinesis Data Streams 사용 요금 외에도, 실시간 액세스 로그에 대한 요금을 청구합니다. 비용에 대한 자세한 내용은 [Amazon CloudFront 요금](https://aws.amazon.com/cloudfront/pricing/) 및 [Amazon Kinesis Data Streams 요금](https://aws.amazon.com/kinesis/data-streams/pricing/) 단원을 참조하십시오.

**중요**  
모든 요청을 완전히 살펴보기 보다는 콘텐츠에 대한 요청 특성을 이해하는 데 로그를 사용하는 것이 좋습니다. CloudFront는 최대 효과에 기초하여 실시간 액세스 로그를 전송합니다. 요청에 따라서는 실제로 요청이 처리된 지 한참 후에 로그 레코드가 전송되거나 아예 전송되지 않을 수도 있습니다. 로그 항목이 실시간 액세스 로그에서 생략되는 경우 실시간 액세스 로그의 항목 수가 AWS 결제 및 사용 보고서에 표시되는 사용량과 일치하지 않습니다.

**Topics**
+ [실시간 액세스 로그 구성 생성 및 사용](#create-real-time-log-config)
+ [실시간 액세스 로그 구성 이해](#understand-real-time-log-config)
+ [Kinesis Data Streams 소비자 생성](#real-time-log-consumer-guidance)
+ [실시간 액세스 로그 문제 해결](#real-time-log-troubleshooting)

## 실시간 액세스 로그 구성 생성 및 사용
<a name="create-real-time-log-config"></a>

배포에 대한 요청 관련 정보를 실시간으로 확인하도록 실시간 액세스 로그 구성을 사용할 수 있습니다. 로그는 요청 수신 후 몇 초 이내에 전달됩니다. AWS Command Line Interface(AWS CLI) 또는 CloudFront API를 사용하여 CloudFront 콘솔에서 실시간 액세스 로그 구성을 생성할 수 있습니다.

실시간 액세스 로그 구성을 사용하려면 CloudFront 배포의 하나 이상의 캐시 동작에 해당 로그 구성을 연결합니다.

------
#### [ Console ]

**실시간 액세스 로그 구성을 생성하려는 경우**

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/cloudfront/v4/home?#/logs](https://console.aws.amazon.com/cloudfront/v4/home?#/logs)의 CloudFront 콘솔에서 **로그** 페이지를 엽니다.

1. **실시간 로그 구성** 탭을 선택합니다.

1. **구성 생성**을 선택합니다.

1. **이름**에 구성용 이름을 입력합니다.

1. **샘플링 비율**은 로그 기록을 수신할 요청의 백분율을 입력합니다.

1. **필드**의 경우 실시간 액세스 로그에서 수신할 필드를 선택합니다.
   + 로그에 모든 [CMCD 필드](#CMCD-real-time-logging-fields)를 포함하려면 **CMCD all key**를 선택합니다.

1. **엔드포인트**의 경우 실시간 액세스 로그를 수신할 Kinesis 데이터 스트림을 하나 이상 선택합니다.
**참고**  
CloudFront 실시간 액세스 로그는 Kinesis 데이터 스트림에서 지정한 데이터 스트림으로 전달됩니다. 실시간 액세스 로그를 읽고 분석하기 위해 자신만의 Kinesis 데이터 스트림 소비자를 구축할 수 있습니다. Firehose를 사용하여 로그 데이터를 Amazon S3, Amazon Redshift, Amazon OpenSearch Service 또는 서드 파티 로그 처리 서비스에 전송할 수 있습니다.

1. **IAM 역할**의 경우, **새 서비스 역할 만들기**를 선택하거나 기존 역할을 선택합니다. IAM 역할을 생성할 권한이 있어야 합니다.

1. (선택 사항) **배포**의 경우, 실시간 액세스 로그 구성에 첨부할 CloudFront 배포 및 캐시 동작을 선택합니다.

1. **구성 생성**을 선택합니다.

성공하면 콘솔에 방금 만든 실시간 액세스 로그 구성의 세부 정보가 표시됩니다.

자세한 내용은 [실시간 액세스 로그 구성 이해](#understand-real-time-log-config) 섹션을 참조하세요.

------
#### [ AWS CLI ]

AWS CLI를 사용하여 실시간 액세스 로그 구성을 생성하려면 **aws cloudfront create-realtime-log-config** 명령을 사용합니다. 각 개별 파라미터를 명령줄 입력으로 지정하는 대신 입력 파일을 사용하여 명령의 입력 파라미터를 제공할 수 있습니다.

**실시간 액세스 로그 구성을 만드는 방법(입력 파일이 있는 CLI)**

1. 다음 명령을 사용하여 `rtl-config.yaml` 명령에 대한 모든 입력 파라미터가 포함된 **create-realtime-log-config**이라는 파일을 만듭니다.

   ```
   aws cloudfront create-realtime-log-config --generate-cli-skeleton yaml-input > rtl-config.yaml
   ```

1. 방금 생성한 `rtl-config.yaml`이라는 파일을 엽니다. 파일을 편집하여 원하는 실시간 액세스 로그 구성 설정을 지정한 다음 파일을 저장합니다. 다음 사항에 유의하세요.
   + `StreamType`의 유일한 유효 값은 `Kinesis`입니다.

   실시간 긴 구성 설정에 대한 자세한 내용은 [실시간 액세스 로그 구성 이해](#understand-real-time-log-config) 단원을 참조하십시오.

1. 다음 명령을 사용하여 `rtl-config.yaml` 파일의 입력 파라미터로 실시간 액세스 로그 구성을 만듭니다.

   ```
   aws cloudfront create-realtime-log-config --cli-input-yaml file://rtl-config.yaml
   ```

성공하면 명령 출력에 방금 만든 실시간 액세스 로그 구성의 세부 정보가 표시됩니다.

**기존 배포에 실시간 액세스 로그 구성을 연결하는 방법(입력 파일이 있는 CLI)**

1. 다음 명령을 사용하여 업데이트할 CloudFront 배포에 대한 배포 구성을 저장합니다. *distribution\$1ID*를 배포 ID로 바꿉니다.

   ```
   aws cloudfront get-distribution-config --id distribution_ID --output yaml > dist-config.yaml
   ```

1. 방금 생성한 `dist-config.yaml`이라는 파일을 엽니다. 실시간 액세스 로그 구성을 사용하도록 업데이트하려는 각 캐시 동작을 다음과 같이 변경하여 파일을 편집합니다.
   + 캐시 동작에서 `RealtimeLogConfigArn`이라는 필드를 추가합니다. 필드 값에는 이 캐시 동작에 연결할 실시간 액세스 로그 구성의 ARN을 사용합니다.
   + `ETag` 필드의 이름을 `IfMatch`로 바꾸지만 필드 값은 변경하지 마세요.

   완료되면 파일을 저장합니다.

1. 실시간 액세스 로그 구성을 사용하도록 배포를 업데이트하려면 다음 명령을 사용합니다. *distribution\$1ID*를 배포 ID로 바꿉니다.

   ```
   aws cloudfront update-distribution --id distribution_ID --cli-input-yaml file://dist-config.yaml
   ```

성공하면 명령 출력에 방금 만든 배포의 세부 정보가 표시됩니다.

------
#### [ API ]

CloudFront API를 사용하여 실시간 액세스 로그 구성을 생성하려면 [CreateRealTimeLogConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateRealtimeLogConfig.html) API 작업을 사용합니다. 이 API 호출에서 지정하는 파라미터에 대한 자세한 내용은 [실시간 액세스 로그 구성 이해](#understand-real-time-log-config) 및 AWS SDK 또는 기타 API 클라이언트에 대한 API 참조 설명서를 참조하세요.

실시간 액세스 로그 구성을 생성한 후 다음 API 작업 중 하나를 사용하여 캐시 동작에 연결할 수 있습니다.
+ 기존 배포의 캐시 동작에 연결하려면 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)을 사용합니다.
+ 새 배포의 캐시 동작에 연결하려면 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)을 사용합니다.

이 두 API 작업에 대해 캐시 동작 내의 `RealtimeLogConfigArn` 필드에 실시간 액세스 로그 구성의 ARN을 입력합니다. 이러한 API 호출에서 지정하는 다른 필드에 대한 자세한 내용은 [모든 배포 설정 참조](distribution-web-values-specify.md)와 AWS SDK 또는 기타 API 클라이언트에 대한 API 참조 설명서를 참조하세요.

------

## 실시간 액세스 로그 구성 이해
<a name="understand-real-time-log-config"></a>

CloudFront 실시간 액세스 로그를 사용하려면 먼저 실시간 액세스 로그 구성을 만듭니다. 실시간 액세스 로그 구성에는 수신할 로그 필드, 로그 레코드의 *샘플링 비율* 및 로그를 전달할 Kinesis 데이터 스트림에 대한 정보가 포함됩니다.

특히 실시간 액세스 로그 구성에는 다음 설정이 포함되어 있습니다.

**Contents**
+ [이름](#real-time-logs-name)
+ [샘플링 비율](#real-time-logs-sampling-rate)
+ [Fields](#real-time-logs-fields)
+ [엔드포인트(Kinesis Data Streams)](#real-time-logs-endpoint)
+ [IAM 역할](#real-time-logs-IAM)

### 이름
<a name="real-time-logs-name"></a>

실시간 액세스 로그 구성을 식별하는 이름입니다.

### 샘플링 비율
<a name="real-time-logs-sampling-rate"></a>

샘플링 비율은 실시간 액세스 로그 레코드인 Kinesis Data Streams로 전송되는 뷰어 요청 비율을 결정하는 1\$1100의 정수입니다. 실시간 액세스 로그에 모든 뷰어 요청을 포함하려면 샘플링 비율을 100으로 지정합니다. 낮은 샘플링 비율을 선택하면 실시간 액세스 로그에서 요청 데이터의 대표 샘플을 수신하면서 비용을 줄일 수 있습니다.

### Fields
<a name="real-time-logs-fields"></a>

각 실시간 액세스 로그 레코드에 포함된 필드 목록입니다. 각 로그 레코드는 최대 40개의 필드를 포함할 수 있으며 사용 가능한 모든 필드를 수신하도록 선택하거나 성능 모니터링 및 분석에 필요한 필드만 수신하도록 선택할 수 있습니다.

다음 목록에는 각 필드 이름과 해당 필드의 정보에 대한 설명이 포함되어 있습니다. 필드는 Kinesis Data Streams에 전달된 로그 레코드에 나타나는 순서대로 나열됩니다.

필드 46-63은 미디어 플레이어 클라이언트가 각 요청과 함께 CDN에 보낼 수 있는 [일반 미디어 클라이언트 데이터(CMCD)](#CMCD-real-time-logging-fields)입니다. 이 데이터를 사용하여 미디어 유형(오디오, 비디오), 재생 속도, 스트리밍 길이와 같은 각 요청을 이해할 수 있습니다. 이러한 필드는 CloudFront로 전송된 경우에만 실시간 액세스 로그에 표시됩니다.

1. **`timestamp`**

   엣지 서버에서 요청에 대한 응답을 완료한 날짜 및 시간입니다.

1. **`c-ip`**

   요청을 한 최종 사용자의 IP 주소(예: `192.0.2.183` 또는 `2001:0db8:85a3::8a2e:0370:7334`)입니다. 최종 사용자가 HTTP 프록시 또는 로드 밸런서를 사용하여 요청을 전송하는 경우, 해당 필드 값은 프록시 또는 로드 밸런서의 IP 주소입니다. `x-forwarded-for` 필드도 참조하십시오.

1. **`s-ip`**

   요청을 처리한 CloudFront 서버의 IP 주소(예: `192.0.2.183` 또는 `2001:0db8:85a3::8a2e:0370:7334`).

1. **`time-to-first-byte`**

   요청을 수신한 후 응답의 첫 바이트를 쓸 때까지의 시간(초)이며 서버에서 측정합니다.

1. **`sc-status`**

   서버 응답의 HTTP 상태 코드(예: `200`)입니다.

1. **`sc-bytes`**

   요청에 대한 응답으로 서버가 최종 사용자에게 보낸 총 바이트 수(헤더 포함)입니다. WebSocket 및 gRPC 연결의 경우, 연결을 통해 서버에서 클라이언트로 전송된 총 바이트 수입니다.

1. **`cs-method`**

   최종 사용자로부터 수신된 HTTP 요청 메서드입니다.

1. **`cs-protocol`**

   최종 사용자 요청 프로토콜(`http`, `https`, `grpcs`, `ws` 또는 `wss`)입니다.

1. **`cs-host`**

   최종 사용자가 이 요청에 대한 `Host` 헤더에 포함한 값입니다. 객체 URL에 CloudFront 도메인 이름(예: d111111abcdef8.cloudfront.net)을 사용하는 경우, 이 필드에는 도메인 이름이 포함됩니다. 객체 URL(예: www.example.com)에 대체 도메인 이름(CNAME)을 사용하는 경우, 이 필드에 대체 도메인 이름이 포함됩니다.

1. **`cs-uri-stem`**

   쿼리 문자열(있는 경우)을 포함하지만 도메인 이름은 포함하지 않는 전체 요청 URL입니다. 예를 들어 `/images/cat.jpg?mobile=true`입니다.
**참고**  
[표준 로그](AccessLogs.md)에서 `cs-uri-stem` 값에 쿼리 문자열이 포함되지 않습니다.

1. **`cs-bytes`**

   최종 사용자가 요청에 포함한 데이터의 바이트 수(헤더 포함)입니다. WebSocket 및 gRPC 연결의 경우, 연결에서 클라이언트로부터 서버로 전송된 총 바이트 수입니다.

1. **`x-edge-location`**

   요청을 처리한 엣지 로케이션입니다. 각 엣지 로케이션은 3자 코드와 임의로 배정된 번호로 식별됩니다(예: DFW3). 3자 코드는 일반적으로 엣지 로케이션의 지리적 위치 부근 공항을 나타내는 국제 항공 수송 협회(IATA) 공항 코드에 상응합니다. (이러한 약어는 향후에 변경될 수 있습니다.)

1. **`x-edge-request-id`**

   요청을 고유하게 식별하는 불투명 문자열입니다. CloudFront는 `x-amz-cf-id` 응답 헤더에도 이 문자열을 전송합니다.

1. **`x-host-header`**

   CloudFront 배포의 도메인 이름(예: d111111abcdef8.cloudfront.net)입니다.

1. **`time-taken`**

   서버가 최종 사용자 요청을 수신한 시점부터 서버에서 출력 대기열에 대한 응답의 최종 바이트를 쓰는 시점 간의 시간 차이(1/1,000초 단위, 예: 0.082)로, 서버에서 측정됩니다. 최종 사용자 관점에서 보면 전체 응답을 가져오는 데 걸리는 총 시간은 네트워크 지연 시간과 TCP 버퍼링으로 인해 이 값보다 큽니다.

1. **`cs-protocol-version`**

   최종 사용자가 요청에서 지정한 HTTP 버전입니다. 가능한 값은 `HTTP/0.9`, `HTTP/1.0`, `HTTP/1.1`, `HTTP/2.0` 및 `HTTP/3.0`입니다.

1. **`c-ip-version`**

   요청의 IP 버전(IPv4 또는 IPv6)입니다.

1. **`cs-user-agent`**

   요청의 `User-Agent` 헤더 값입니다. `User-Agent` 헤더는 요청을 제출한 디바이스 유형 및 브라우저 등의 요청 소스를 식별하고 검색 엔진에서 요청이 온 경우에는 어느 검색 엔진인지 식별합니다.

1. **`cs-referer`**

   요청의 `Referer` 헤더 값입니다. 다음은 요청을 시작한 도메인 이름입니다. 일반적인 참조자에는 검색 엔진, 객체에 직접 연결하는 기타 웹 사이트 및 자체 웹 사이트가 포함됩니다.

1. **`cs-cookie`**

   이름-값 페어 및 관련 속성을 포함한 요청의 `Cookie` 헤더입니다.
**참고**  
이 필드는 800바이트로 잘립니다.

1. **`cs-uri-query`**

   요청 URL의 쿼리 문자열 부문(있는 경우)입니다.

1. **`x-edge-response-result-type`**

   최종 사용자에게 응답을 반환하기 직전에 서버에서 응답을 분류한 방식입니다. `x-edge-result-type` 필드도 참조하십시오. 가능한 값은 다음과 같습니다.
   + `Hit` - 서버가 캐시에서 최종 사용자에게 객체를 제공했습니다.
   + `RefreshHit` - 서버가 캐시에서 객체를 찾았지만 객체가 만료되었기 때문에 서버가 오리진에 접속하여 캐시에 최신 버전의 객체가 있는지 확인했습니다.
   + `Miss` - 캐시의 객체로는 요청을 충족할 수 없어서 서버가 요청을 오리진 서버로 전달했으며 결과가 최종 사용자에게 반환되었습니다.
   + `LimitExceeded` - CloudFront 할당량(이전에는 제한이라고 함)이 초과되어 요청이 거부되었습니다.
   + `CapacityExceeded` - 객체 제공을 요청하는 시점에 엣지 로케이션의 용량이 충분하지 않아 서버에서 503 오류가 반환되었습니다.
   + `Error` - 일반적으로 이는 요청으로 인해 클라이언트 오류(`sc-status` 필드 값이 `4xx` 범위에 있음) 또는 서버 오류(`sc-status` 필드 값이 `5xx` 범위에 있음)가 발생했음을 의미합니다.

     `x-edge-result-type` 필드의 값이 `Error`이고 이 필드의 값이 `Error`가 아닌 경우 다운로드를 완료하기 전에 클라이언트 연결이 끊어졌습니다.
   + `Redirect` - 서버는 배포 설정에 따라 최종 사용자를 HTTP에서 HTTPS로 리디렉션했습니다.
   + `LambdaExecutionError` - 잘못된 연결, 함수 시간 초과, AWS 종속성 문제 또는 기타 일반 가용성 문제로 인해 배포와 연결된 Lambda@Edge 함수가 완료되지 않았습니다.

1. **`x-forwarded-for`**

   최종 사용자가 HTTP 프록시 또는 로드 밸런서를 사용하여 요청을 전송하는 경우, `c-ip` 필드의 값은 프록시 또는 로드 밸런서의 IP 주소입니다. 이 경우 이 필드는 요청을 시작한 최종 사용자의 IP 주소입니다. 이 필드에는 여러 개의 쉼표로 구분된 IP 주소가 포함될 수 있습니다. 각 IP 주소는 IPv4 주소(예:`192.0.2.183`) 또는 IPv6 주소(예: `2001:0db8:85a3::8a2e:0370:7334`)일 수 있습니다.

1. **`ssl-protocol`**

   요청에 HTTPS가 사용된 경우, 이 필드에는 최종 사용자 및 서버가 요청 및 응답 전송을 위해 협상한 SSL/TLS 프로토콜이 포함됩니다. 가능한 값 목록은 [최종 사용자와 CloudFront 간에 지원되는 프로토콜 및 암호](secure-connections-supported-viewer-protocols-ciphers.md)에서 지원되는 SSL/TLS 프로토콜을 참조하세요.

1. **`ssl-cipher`**

   요청에 HTTPS가 사용되는 경우, 이 필드에는 최종 사용자 및 서버가 요청 및 응답 암호화를 위해 협상한 SSL/TLS 암호가 포함됩니다. 가능한 값 목록은 [최종 사용자와 CloudFront 간에 지원되는 프로토콜 및 암호](secure-connections-supported-viewer-protocols-ciphers.md)에서 지원되는 SSL/TLS 암호를 참조하세요.

1. **`x-edge-result-type`**

   마지막 바이트가 서버를 떠난 후 서버가 응답을 분류한 방식입니다. 경우에 따라 서버가 응답을 전송할 준비가 된 시간과 가 응답 전송을 완료한 시간 사이에 결과 유형이 변경될 수 있습니다. `x-edge-response-result-type` 필드도 참조하십시오.

   예를 들어 HTTP 스트리밍에서 서버가 캐시 스트림의 한 세그먼트를 찾는다고 가정해 보십시오. 이 시나리오에서 이 필드의 값은 보통 `Hit`입니다. 그러나 서버가 전체 세그먼트를 전달하기 전에 최종 사용자가 연결을 종료하면 최종 결과 유형(및 이 필드 값)은 `Error`가 됩니다.

   콘텐츠가 캐시 가능하지 않고 오리진으로 직접 프록시 처리되므로 WebSocket 및 gRPC 연결에서 이 필드의 값이 `Miss`가 됩니다.

   가능한 값은 다음과 같습니다.
   + `Hit` - 서버가 캐시에서 최종 사용자에게 객체를 제공했습니다.
   + `RefreshHit` - 서버가 캐시에서 객체를 찾았지만 객체가 만료되었기 때문에 서버가 오리진에 접속하여 캐시에 최신 버전의 객체가 있는지 확인했습니다.
   + `Miss` - 캐시의 객체로는 요청을 충족할 수 없어서 서버가 요청을 오리진으로 전달했으며 결과가 최종 사용자에게 반환되었습니다.
   + `LimitExceeded` - CloudFront 할당량(이전에는 제한이라고 함)이 초과되어 요청이 거부되었습니다.
   + `CapacityExceeded` - 객체 제공을 요청하는 시점에 용량이 충분하지 않아 서버에서 HTTP 503 상태 코드가 반환되었습니다.
   + `Error` - 일반적으로 이는 요청으로 인해 클라이언트 오류(`sc-status` 필드 값이 `4xx` 범위에 있음) 또는 서버 오류(`sc-status` 필드 값이 `5xx` 범위에 있음)가 발생했음을 의미합니다. `sc-status` 필드의 값이 `200`인 경우 또는 이 필드의 값이 `Error`이고 `x-edge-response-result-type` 필드의 값이 `Error`가 아닌 경우, HTTP 요청이 성공했지만 모든 바이트를 수신하기 전에 클라이언트의 연결이 끊어졌음을 의미합니다.
   + `Redirect` - 서버는 배포 설정에 따라 최종 사용자를 HTTP에서 HTTPS로 리디렉션했습니다.
   + `LambdaExecutionError` - 잘못된 연결, 함수 시간 초과, AWS 종속성 문제 또는 기타 일반 가용성 문제로 인해 배포와 연결된 Lambda@Edge 함수가 완료되지 않았습니다.

1. **`fle-encrypted-fields`**

   서버가 암호화하여 오리진에 전달한 [필드 레벨 암호화](field-level-encryption.md)의 수입니다. CloudFront 서버는 데이터를 암호화하면서 처리된 요청을 오리진으로 스트리밍합니다. 따라서 `fle-status` 값이 오류인 경우에도 이 필드에 값이 있을 수 있습니다.

1. **`fle-status`**

   배포에 대해 [필드 레벨 암호화](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html)가 구성될 때, 요청 본문이 처리되었는지를 나타내는 코드가 이 필드에 포함됩니다. 서버가 성공적으로 요청 본문을 처리하고, 지정된 필드 값을 암호화하고, 요청을 오리진으로 전달할 때 이 필드 값은 `Processed`입니다. 이 경우 `x-edge-result-type` 값은 계속해서 클라이언트 측 또는 서버 측 오류를 나타낼 수 있습니다.

   이 필드에 가능한 값은 다음과 같습니다.
   + `ForwardedByContentType` - 어떠한 콘텐츠 유형도 구성되지 않았기 때문에 서버가 요청을 구문 분석 또는 암호화 없이 오리진에 전달했습니다.
   + `ForwardedByQueryArgs` - 요청에 필드 레벨 암호화 구성에 없는 쿼리 인수가 포함되기 때문에 서버가 요청을 구문 분석 또는 암호화 없이 오리진에 전달했습니다.
   + `ForwardedDueToNoProfile` - 필드 레벨 암호화 구성에 어떠한 프로필도 지정되지 않았기 때문에 서버가 요청을 구문 분석 또는 암호화 없이 오리진에 전달했습니다.
   + `MalformedContentTypeClientError` - `Content-Type` 헤더 값이 유효하지 않은 형식이기 때문에 서버가 요청을 거부하고 최종 사용자에게 HTTP 400 상태 코드를 반환했습니다.
   + `MalformedInputClientError` - 요청 본문이 유효하지 않은 형식이기 때문에 서버가 요청을 거부하고 최종 사용자에게 HTTP 400 상태 코드를 반환했습니다.
   + `MalformedQueryArgsClientError` - 쿼리 인수가 비어 있거나 유효하지 않은 형식이기 때문에 서버가 요청을 거부하고 최종 사용자에게 HTTP 400 상태 코드를 반환했습니다.
   + `RejectedByContentType` - 필드 레벨 암호화 구성에 어떠한 콘텐츠 유형도 지정되지 않았기 때문에 서버가 요청을 거부하고 최종 사용자에게 HTTP 400 상태 코드를 반환했습니다.
   + `RejectedByQueryArgs` - 필드 레벨 암호화 구성에 어떠한 쿼리 인수도 지정되지 않았기 때문에 서버가 요청을 거부하고 최종 사용자에게 HTTP 400 상태 코드를 반환했습니다.
   + `ServerError` - 오리진 서버가 오류를 반환했습니다.

   요청이 필드 레벨 암호화 할당량(이전에는 제한이라고 함) 을 초과하면 이 필드에 다음 오류 코드 중 하나가 포함되고 서버는 HTTP 상태 코드 400을 최종 사용자에게 반환합니다. 필드 레벨 암호화의 현재 할당량에 대한 목록은 [필드 레벨 암호화에 대한 할당량](cloudfront-limits.md#limits-field-level-encryption) 단원을 참조하세요.
   + `FieldLengthLimitClientError` - 암호화되도록 구성된 필드가 허용되는 최대 길이를 초과했습니다.
   + `FieldNumberLimitClientError` - 배포가 암호화하도록 구성된 요청에 허용된 필드 수보다 많은 필드가 있습니다.
   + `RequestLengthLimitClientError` - 필드 레벨 암호화 구성 시 요청 본문의 길이가 허용되는 최대 길이를 초과했습니다.

1. **`sc-content-type`**

   응답의 HTTP `Content-Type` 헤더 값입니다.

1. **`sc-content-len`**

   응답의 HTTP `Content-Length` 헤더 값입니다.

1. **`sc-range-start`**

   응답에 HTTP `Content-Range` 헤더가 포함되어 있으면 이 필드에 범위 시작 값이 포함됩니다.

1. **`sc-range-end`**

   응답에 HTTP `Content-Range` 헤더가 포함되어 있으면 이 필드에 범위 끝 값이 포함됩니다.

1. **`c-port`**

   최종 사용자가 보낸 요청의 포트 번호입니다.

1. **`x-edge-detailed-result-type`**

   이 필드에는 `x-edge-result-type` 필드와 동일한 값이 포함됩니다. 단, 다음과 같은 경우는 예외입니다.
   + 객체가 [Origin Shield](origin-shield.md) 계층에서 최종 사용자에게 제공된 경우 이 필드에 `OriginShieldHit`가 포함합니다.
   + 객체가 CloudFront 캐시에 없고 [오리진 요청 Lambda @Edge 함수](lambda-at-the-edge.md)에 의해 응답이 생성된 경우 이 필드에는 `MissGeneratedResponse`가 포함됩니다.
   + `x-edge-result-type` 필드의 값이 `Error`인 경우 이 필드에는 오류에 대한 추가 정보를 제공하는 다음 값 중 하나가 포함됩니다.
     + `AbortedOrigin` - 서버에 오리진 관련된 문제가 발생했습니다.
     + `ClientCommError` - 서버와 최종 사용자 간의 통신 문제로 인해 최종 사용자에게 대한 응답이 중단되었습니다.
     + `ClientGeoBlocked` - 최종 사용자의 지리적 위치에서 요청을 거부하도록 배포가 구성됩니다.
     + `ClientHungUpRequest` - 요청을 보내는 동안 최종 사용자가 중간에 중지했습니다.
     + `Error` - 오류 유형이 기타 모든 카테고리에 적합하지 않아 오류가 발생했습니다. 이러한 오류 유형은 서버가 캐시에서 오류 응답을 제공할 때 발생할 수 있습니다.
     + `InvalidRequest` - 서버가 최종 사용자로부터 잘못된 요청을 받았습니다.
     + `InvalidRequestBlocked` - 요청한 리소스에 대한 액세스가 차단됩니다.
     + `InvalidRequestCertificate` - 배포가 HTTPS 연결이 설정된 SSL/TLS 인증서와 일치하지 않습니다.
     + `InvalidRequestHeader` - 요청에 잘못된 헤더가 포함되어 있습니다.
     + `InvalidRequestMethod` - 사용되었던 HTTP 요청 메서드를 처리하도록 배포가 구성되지 않았습니다. 이러한 문제는 배포에서 캐시 가능한 요청만 지원하는 경우 발생할 수 있습니다.
     + `OriginCommError` - 오리진에 연결하거나 오리진에서 데이터를 읽는 동안 요청 시간이 초과되었습니다.
     + `OriginConnectError` - 서버를 오리진에 연결할 수 없습니다.
     + `OriginContentRangeLengthError` - 오리진 응답의 `Content-Length` 헤더가 `Content-Range` 헤더의 길이와 일치하지 않습니다.
     + `OriginDnsError` - 서버에서 오리진의 도메인 이름을 확인할 수 없습니다.
     + `OriginError` - 오리진에서 잘못된 응답을 반환했습니다.
     + `OriginHeaderTooBigError` - 오리진에서 반환한 헤더가 너무 커서 엣지 서버가 처리할 수 없습니다.
     + `OriginInvalidResponseError` - 오리진에서 잘못된 응답을 반환했습니다.
     + `OriginReadError` - 오리진에서 서버를 읽을 수 없습니다.
     + `OriginWriteError` - 오리진에 서버를 쓸 수 없습니다.
     + `OriginZeroSizeObjectError` - 오리진에서 전송된 크기가 0인 객체로 인해 오류가 발생했습니다.
     + `SlowReaderOriginError` - 최종 사용자가 오리진 오류를 일으킨 메시지를 느리게 읽었습니다.

1. **`c-country`**

   최종 사용자의 IP 주소로 결정되는 최종 사용자의 지리적 위치를 나타내는 국가 코드입니다. 국가 코드 목록은 [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) 단원을 참조하세요.

1. **`cs-accept-encoding`**

    최종 사용자 요청의 `Accept-Encoding` 헤더 값입니다.

1. **`cs-accept`**

   최종 사용자 요청의 `Accept` 헤더 값입니다.

1. **`cache-behavior-path-pattern`**

   최종 사용자 요청과 일치하는 캐시 동작을 식별하는 경로 패턴입니다.

1. **`cs-headers`**

   최종 사용자 요청의 HTTP 헤더(이름 및 값)입니다.
**참고**  
이 필드는 800바이트로 잘립니다.

1. **`cs-header-names`**

   최종 사용자 요청의 HTTP 헤더 이름(값 아님)입니다.
**참고**  
이 필드는 800바이트로 잘립니다.

1. **`cs-headers-count`**

    최종 사용자 요청의 HTTP 헤더 수입니다.

1. **`primary-distribution-id`**

   연속 배포가 활성화된 경우 이 ID는 현재 배포의 기본 배포를 식별하는 데 사용됩니다.

1. **`primary-distribution-dns-name`**

   연속 배포가 활성화된 경우 이 값에는 현재 CloudFront 배포와 연결된 기본 도메인 이름(예: d111111abcdef8.cloudfront.net)이 표시됩니다.

1. **`origin-fbl`**

   CloudFront와 오리진 간의 첫 바이트 지연 시간(초)입니다.

1. **`origin-lbl`**

   CloudFront와 오리진 간의 마지막 바이트 지연 시간(초)입니다.

1. **`asn`**

   최종 사용자의 Autonomous System Number(ASN)입니다.

1. <a name="CMCD-real-time-logging-fields"></a>
**실시간 액세스 로그의 CMCD 필드**  
이러한 필드에 대한 자세한 내용은 [CTA 사양 웹 애플리케이션 비디오 에코시스템 - 일반 미디어 클라이언트 데이터 CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf) 문서를 참조합니다.

1. **`cmcd-encoded-bitrate`**

   요청된 오디오 또는 비디오 객체의 인코딩된 비트레이트입니다.

1. **`cmcd-buffer-length`**

   요청된 미디어 객체의 버퍼 길이입니다.

1. **`cmcd-buffer-starvation`**

   이전 요청과 객체 요청 사이의 특정 시점에서 버퍼가 부족했는지 여부. 이로 인해 플레이어가 리버퍼링 상태에 빠져 비디오 또는 오디오 재생이 중단될 수 있습니다.

1. **`cmcd-content-id`**

   현재 콘텐츠를 식별하는 고유한 문자열입니다.

1. **`cmcd-object-duration`**

   요청된 객체의 재생 시간(밀리초).

1. **`cmcd-deadline`**

   버퍼 언더런 상태나 기타 재생 문제를 방지하기 위해 이 객체의 첫 번째 샘플을 사용할 수 있어야 하는 요청 시점으로부터의 기한.

1. **`cmcd-measured-throughput`**

   클라이언트가 측정한 클라이언트와 서버 간 처리량.

1. **`cmcd-next-object-request`**

   다음 요청된 객체의 상대 경로.

1. **`cmcd-next-range-request`**

   다음 요청이 부분 객체 요청인 경우 이 문자열은 요청될 바이트 범위를 나타냅니다.

1. **`cmcd-object-type`**

   요청 중인 현재 객체의 미디어 유형.

1. **`cmcd-playback-rate`**

   실시간이면 1, 배속이면 2, 재생되지 않는 경우 0.

1. **`cmcd-requested-maximum-throughput`**

   요청된 최대 처리량 중 클라이언트가 자산 전달에 충분하다고 간주하는 최대 처리량.

1. **`cmcd-streaming-format`**

   현재 요청을 정의하는 스트리밍 형식.

1. **`cmcd-session-id`**

   현재 재생 세션을 식별하는 GUID.

1. **`cmcd-stream-type`**

   세그먼트 가용성을 식별하는 토큰. `v`= 모든 세그먼트를 사용할 수 있습니다. `l`= 시간이 지나면 세그먼트를 사용할 수 있게 됩니다.

1. **`cmcd-startup`**

   버퍼가 비어있는 이벤트 이후 스타트 업, 검색 또는 복구 중에 객체가 긴급하게 필요한 경우 키는 값 없이 포함됩니다.

1. **`cmcd-top-bitrate`**

   클라이언트가 재생할 수 있는 최고 비트레이트 렌디션입니다.

1. **`cmcd-version`**

   정의된 키 이름 및 값을 해석하는 데 사용되는 이 사양의 버전입니다. 이 키를 생략하면 클라이언트와 서버는 값을 버전 1에 정의된 것으로 해석해야 합니다.**

1. **`r-host`**

   이 필드는 오리진 요청에 대해 전송되며 객체를 제공하는 데 사용되는 오리진 서버의 도메인을 나타냅니다. 오류가 발생하는 경우 이 필드를 사용하여 마지막으로 시도한 오리진을 찾을 수 있습니다(예: `cd8jhdejh6a.mediapackagev2.us-east-1.amazonaws.com`).

1. **`sr-reason`**

   이 필드를 통해 오리진을 선택한 이유를 알 수 있습니다. 기본 오리진에 대한 요청이 성공하면 비어 있습니다.

   오리진 장애 조치가 발생하면 필드에 `Failover:403` 또는 `Failover:502`와 같이 장애 조치로 이어진 HTTP 오류 코드가 포함됩니다. 오리진 장애 조치의 경우 재시도된 요청도 실패하고 사용자 지정 오류 페이지를 구성하지 않으면 `r-status`에서 두 번째 오리진의 응답을 나타냅니다. 그러나 오리진 장애 조치와 함께 사용자 지정 오류 페이지를 구성하면 요청이 실패하고 사용자 지정 오류 페이지가 대신 반환된 경우 두 번째 오리진의 응답이 포함됩니다.

   오리진 장애 조치가 발생하지 않지만 미디어 품질 인식 복원력(MQAR) 오리진 옵션이 발생하는 경우 `MediaQuality`로 로그됩니다. 자세한 내용은 [미디어 품질 인식 복원력](media-quality-score.md) 섹션을 참조하세요.

1. **`x-edge-mqcs`**

   이 필드는 CloudFront가 MediaPackage v2의 CMSD 응답 헤더에서 검색한 미디어 세그먼트의 미디어 품질 신뢰도 점수(MQCS)(범위: 0\$1100)를 나타냅니다. 이 필드는 MQAR 지원 오리진 그룹이 있는 캐시 동작과 일치하는 요청에 사용할 수 있습니다. CloudFront는 오리진 요청 외에도 캐시에서 제공되는 미디어 세그먼트에 대해 이 필드를 로그합니다. 자세한 내용은 [미디어 품질 인식 복원력](media-quality-score.md) 섹션을 참조하세요.

1. **`distribution-tenant-id`**

   배포 테넌트의 ID입니다.

1. **`connection-id`**

   TLS 연결의 고유 식별자입니다.

   이 필드에 대한 정보를 가져오려면 먼저 배포에 대해 mTLS를 활성화해야 합니다. 자세한 내용은 [CloudFront에 대한 상호 TLS 인증(뷰어 mTLS)CloudFront에 대한 오리진 상호 TLS](mtls-authentication.md) 섹션을 참조하세요.

### 엔드포인트(Kinesis Data Streams)
<a name="real-time-logs-endpoint"></a>

엔드포인트에는 실시간 로그를 전송하려는 Kinesis Data Streams에 대한 정보가 포함되어 있습니다. 데이터 스트림의 Amazon 리소스 이름(ARN)을 제공합니다.

Kinesis Data Streams 생성에 대한 자세한 내용은 **Amazon Kinesis Data Streams 개발자 안내서의 다음 주제를 참조하세요.
+ [스트림 생성 및 관리](https://docs.aws.amazon.com/streams/latest/dev/working-with-streams.html)
+ [를 사용하여 기본 Kinesis Data Streams 작업 수행AWS CLI](https://docs.aws.amazon.com/streams/latest/dev/fundamental-stream.html)
+ [스트림 생성](https://docs.aws.amazon.com/streams/latest/dev/kinesis-using-sdk-java-create-stream.html)(AWS SDK for Java 사용)

데이터 스트림을 생성할 때 샤드 수를 지정해야 합니다. 다음 정보를 사용하여 필요한 샤드 수를 예측할 수 있습니다.

**Kinesis 데이터 스트림의 샤드 수를 추정하는 방법**

1. CloudFront 배포에서 수신하는 초당 요청 수를 계산(또는 예측)합니다.

   [CloudFront 사용 보고서](https://console.aws.amazon.com/cloudfront/v4/home#/usage)(CloudFront 콘솔)와 [CloudFront 지표](viewing-cloudfront-metrics.md#monitoring-console.distributions)(CloudFront 및 Amazon CloudWatch 콘솔)를 사용하여 초당 요청 수를 계산할 수 있습니다.

1. 단일 실시간 액세스 로그 레코드의 일반적인 크기를 확인합니다.

   일반적으로 단일 로그 레코드는 약 500바이트입니다. 사용 가능한 모든 필드를 포함하는 큰 레코드 하나는 보통 약 1KB입니다.

   로그 레코드 크기가 확실하지 않으면 샘플링 비율을 낮게 설정하여(예: 1%) 실시간 로그를 활성화한 다음 Kinesis Data Streams의 모니터링 데이터를 사용해 레코드의 평균 크기를 계산할 수 있습니다(수신되는 총 바이트 수를 총 레코드 수로 나눔).

1. [Amazon Kinesis Data Streams 요금 페이지](https://aws.amazon.com/kinesis/data-streams/pricing/)의 AWS Pricing Calculator 아래에서 **지금 사용자 지정 예상 비용 생성**을 선택합니다.
   + 계산기에 초당 요청(레코드) 수를 입력합니다.
   + 단일 로그 레코드의 평균 레코드 크기를 입력합니다.
   + 그런 다음, **계산 표시**를 선택합니다.

   요금 계산기는 필요한 샤드 수와 예상 비용을 보여줍니다.

### IAM 역할
<a name="real-time-logs-IAM"></a>

Kinesis 데이터 스트림에 실시간 액세스 로그를 전달하는 CloudFront 권한을 부여하는 AWS Identity and Access Management(IAM) 역할입니다.

CloudFront 콘솔을 사용하여 실시간 액세스 로그 구성을 만들 때 **새 서비스 역할 만들기**를 선택하여 콘솔에서 IAM 역할을 만들 수 있습니다.

AWS CloudFormation 또는 CloudFront API(AWS CLI 또는 SDK)를 사용하여 실시간 액세스 로그 구성을 생성하는 경우 직접 IAM 역할을 생성하고 역할 ARN을 입력해야 합니다. IAM 역할을 직접 만들려면 다음 정책을 사용하세요.

**IAM 역할 신뢰 정책**

다음 IAM 역할 신뢰 정책을 사용하려면 *111122223333*을 해당 AWS 계정 번호로 바꿉니다. CloudFront가 AWS 계정의 배포를 대신하여 이 역할만 맡을 수 있기 때문에 이 정책의 `Condition` 요소는 [혼동된 대리자 문제](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)를 방지하는 데 도움이 됩니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

------

**암호화되지 않은 데이터 스트림에 대한 IAM 역할 권한 정책**

다음 정책을 사용하려면 *arn:aws:kinesis:us-east-2:123456789012:stream/StreamName*을 Kinesis 데이터 스트림의 ARN으로 바꿉니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:DescribeStreamSummary",
                "kinesis:DescribeStream",
                "kinesis:PutRecord",
                "kinesis:PutRecords"
            ],
            "Resource": [
                "arn:aws:kinesis:us-east-2:123456789012:stream/StreamName"
            ]
        }
    ]
}
```

------

**암호화된 데이터 스트림에 대한 IAM 역할 권한 정책**

다음 정책을 사용하려면 *arn:aws:kinesis:us-east-2:123456789012:stream/StreamName*을 Kinesis 데이터 스트림의 ARN으로 교체하고 *arn:aws:kms:us-east-2:123456789012:key/e58a3d0b-fe4f-4047-a495-ae03cc73d486*을 본인 AWS KMS key의 ARN으로 교체합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:DescribeStreamSummary",
                "kinesis:DescribeStream",
                "kinesis:PutRecord",
                "kinesis:PutRecords"
            ],
            "Resource": [
                "arn:aws:kinesis:us-east-2:123456789012:stream/StreamName"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey"
            ],
            "Resource": [
                "arn:aws:kms:us-east-2:123456789012:key/e58a3d0b-fe4f-4047-a495-ae03cc73d486"
            ]
        }
    ]
}
```

------

****  

## Kinesis Data Streams 소비자 생성
<a name="real-time-log-consumer-guidance"></a>

실시간 액세스 로그를 읽고 분석하려면 Kinesis Data Streams *소비자*를 생성하거나 사용합니다. CloudFront 실시간 로그의 소비자를 생성할 때는 모든 실시간 액세스 로그 레코드의 필드가 항상 [Fields](#real-time-logs-fields) 섹션에 나열된 것과 동일한 순서로 전달된다는 것을 알고 있어야 합니다. 이 고정된 순서를 적용하도록 소비자를 빌드해야 합니다.

예를 들어 세 개의 필드(`time-to-first-byte`, `sc-status` 및 `c-country`)만 포함하는 실시간 액세스 로그 구성을 가정해 보겠습니다. 이 시나리오에서 마지막 필드인 `c-country`는 항상 모든 로그 레코드의 필드 번호 3입니다. 그러나 나중에 실시간 액세스 로그 구성에 필드를 추가하면 각 레코드 필드의 배치가 변경될 수 있습니다.

예를 들어 `sc-bytes` 및 `time-taken` 필드를 실시간 액세스 로그 구성에 추가하는 경우, 이 필드는 [Fields](#real-time-logs-fields) 단원에 표시된 순서에 따라 각 로그 레코드에 삽입됩니다. 다섯 필드의 결과 순서는 `time-to-first-byte`, `sc-status`, `sc-bytes`, `time-taken` 및 `c-country`입니다. 원래 `c-country` 필드는 필드 번호 3이었지만 이제는 필드 번호 5입니다. 실시간 액세스 로그 구성에 필드를 추가하는 경우, 소비자 애플리케이션이 로그 레코드에서 위치를 변경하는 필드를 처리할 수 있는지 확인합니다.

## 실시간 액세스 로그 문제 해결
<a name="real-time-log-troubleshooting"></a>

실시간 액세스 로그 구성을 생성한 후에는 모든 레코드(또는 일부 레코드)가 Kinesis Data Streams에 전달되지 않을 수 있습니다. 이 경우 먼저 CloudFront 배포가 최종 사용자 요청을 수신하고 있는지 확인해야 합니다. 이 경우 다음 설정을 확인하여 문제 해결을 계속할 수 있습니다.

**IAM 역할 권한**  
Kinesis 데이터 스트림에 실시간 액세스 로그 레코드를 전달하기 위해 CloudFront에서는 실시간 액세스 로그 구성에 IAM 역할을 사용합니다. 역할 신뢰 정책과 역할 권한 정책이 [IAM 역할](#real-time-logs-IAM)에 표시된 정책과 일치하는지 확인합니다.

**Kinesis Data Streams 조절**  
CloudFront가 스트림이 처리할 수 있는 것보다 더 빠르게 Kinesis 데이터 스트림에 실시간 액세스 로그 레코드를 쓰는 경우, Kinesis Data Streams에서 CloudFront의 요청을 조절할 수 있습니다. 이 경우 Kinesis 데이터 스트림의 샤드 수를 늘릴 수 있습니다. 각 샤드는 초당 최대 1,000개의 레코드 쓰기를 지원할 수 있으며 최대 데이터 쓰기는 초당 1MB입니다.