실시간 로그 사용 - Amazon CloudFront

실시간 로그 사용

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

CloudFront 실시간 로그는 구성 가능합니다. 선택 항목:

  • 실시간 로그에 대한 샘플링 비율(즉, 실시간 로그 레코드를 수신하려는 요청의 백분율)

  • 로그 레코드에서 수신하려는 특정 필드

  • 실시간 로그를 수신하려는 특정 캐시 동작(경로 패턴)

CloudFront 실시간 로그는 Amazon Kinesis Data Streams에서 선택한 데이터 스트림으로 전송됩니다. 자체 Kinesis 데이터 스트림 소비자를 생성하거나 Amazon Data Firehose를 사용하여 로그 데이터를 Amazon Simple Storage Service(S3), Amazon Redshift, Amazon OpenSearch Service(OpenSearch Service) 또는 서드 파티 로그 처리 서비스로 전송할 수 있습니다.

CloudFront는 Kinesis Data Streams 사용 요금 외에도, 실시간 로그에 대한 요금을 청구합니다. 비용에 대한 자세한 내용은 Amazon CloudFront 요금Amazon Kinesis Data Streams 요금 단원을 참조하십시오.

중요

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

실시간 로그 구성 생성 및 사용

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

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

Console
실시간 로그 구성을 생성하려는 경우
  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/cloudfront/v4/home?#/logs의 CloudFront 콘솔에서 로그 페이지를 엽니다.

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

  3. 구성 생성을 선택합니다.

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

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

  6. 필드의 경우 실시간 로그에서 수신할 필드를 선택합니다.

    • 로그에 모든 CMCD 필드를 포함하려면 CMCD all key를 선택합니다.

  7. 엔드포인트의 경우 실시간 로그를 수신할 Kinesis 데이터 스트림을 하나 이상 선택합니다.

    참고

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

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

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

  10. 구성 생성을 선택합니다.

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

자세한 내용은 실시간 로그 구성 이해 단원을 참조하십시오.

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
  2. 방금 생성한 rtl-config.yaml이라는 파일을 엽니다. 파일을 편집하여 원하는 실시간 로그 구성 설정을 지정한 다음 파일을 저장합니다. 다음을 참조하십시오.

    • StreamType의 유일한 유효 값은 Kinesis입니다.

    실시간 긴 구성 설정에 대한 자세한 내용은 실시간 로그 구성 이해 단원을 참조하십시오.

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

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

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

기존 배포에 실시간 로그 구성을 연결하는 방법(입력 파일이 있는 CLI)
  1. 다음 명령을 사용하여 업데이트할 CloudFront 배포에 대한 배포 구성을 저장합니다. distribution_ID를 배포 ID로 바꿉니다.

    aws cloudfront get-distribution-config --id distribution_ID --output yaml > dist-config.yaml
  2. 방금 생성한 dist-config.yaml이라는 파일을 엽니다. 실시간 로그 구성을 사용하도록 업데이트하려는 각 캐시 동작을 다음과 같이 변경하여 파일을 편집합니다.

    • 캐시 동작에서 RealtimeLogConfigArn이라는 필드를 추가합니다. 필드 값에는 이 캐시 동작에 연결할 실시간 로그 구성의 ARN을 사용합니다.

    • ETag 필드의 이름을 IfMatch로 바꾸지만 필드 값은 변경하지 마세요.

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

  3. 실시간 로그 구성을 사용하도록 배포를 업데이트하려면 다음 명령을 사용합니다. distribution_ID를 배포 ID로 바꿉니다.

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

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

API

CloudFront API를 사용하여 실시간 로그 구성을 생성하려면 CreateRealTimeLogConfig API 작업을 사용합니다. 이 API 호출에서 지정하는 파라미터에 대한 자세한 내용은 실시간 로그 구성 이해 및 AWS SDK 또는 기타 API 클라이언트에 대한 API 참조 설명서를 참조하세요.

실시간 로그 구성을 생성한 후 다음 API 작업 중 하나를 사용하여 캐시 동작에 연결할 수 있습니다.

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

실시간 로그 구성 이해

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

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

이름

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

샘플링 비율

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

필드

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

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

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

  1. timestamp

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

  2. c-ip

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

  3. s-ip

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

  4. time-to-first-byte

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

  5. sc-status

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

  6. sc-bytes

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

  7. cs-method

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

  8. cs-protocol

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

  9. cs-host

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

  10. cs-uri-stem

    쿼리 문자열(있는 경우)을 포함하지만 도메인 이름은 포함하지 않는 전체 요청 URL입니다. 예: /images/cat.jpg?mobile=true.

    참고

    표준 로그에서 cs-uri-stem 값에 쿼리 문자열이 포함되지 않습니다.

  11. cs-bytes

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

  12. x-edge-location

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

  13. x-edge-request-id

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

  14. x-host-header

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

  15. time-taken

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

  16. cs-protocol-version

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

  17. c-ip-version

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

  18. cs-user-agent

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

  19. cs-referer

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

  20. cs-cookie

    이름-값 페어 및 관련 속성을 포함한 요청의 Cookie 헤더입니다.

    참고

    이 필드는 800바이트로 잘립니다.

  21. cs-uri-query

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

  22. 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로 리디렉션했습니다.

  23. x-forwarded-for

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

  24. ssl-protocol

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

  25. ssl-cipher

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

  26. x-edge-result-type

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

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

    콘텐츠가 캐시 가능하지 않고 오리진으로 직접 프록시되므로 WebSocket 연결에서 이 필드의 값이 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로 리디렉션했습니다.

  27. fle-encrypted-fields

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

  28. fle-status

    배포에 대해 필드 레벨 암호화가 구성될 때, 요청 본문이 처리되었는지를 나타내는 코드가 이 필드에 포함됩니다. 서버가 성공적으로 요청 본문을 처리하고, 지정된 필드 값을 암호화하고, 요청을 오리진으로 전달할 때 이 필드 값은 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을 최종 사용자에게 반환합니다. 필드 레벨 암호화의 현재 할당량에 대한 목록은 필드 레벨 암호화에 대한 할당량 단원을 참조하세요.

    • FieldLengthLimitClientError - 암호화되도록 구성된 필드가 허용되는 최대 길이를 초과했습니다.

    • FieldNumberLimitClientError - 배포가 암호화하도록 구성된 요청에 허용된 필드 수보다 많은 필드가 있습니다.

    • RequestLengthLimitClientError - 필드 레벨 암호화 구성 시 요청 본문의 길이가 허용되는 최대 길이를 초과했습니다.

  29. sc-content-type

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

  30. sc-content-len

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

  31. sc-range-start

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

  32. sc-range-end

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

  33. c-port

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

  34. x-edge-detailed-result-type

    이 필드에는 x-edge-result-type 필드와 동일한 값이 포함됩니다. 단, 다음과 같은 경우는 예외입니다.

    • 객체가 Origin Shield 계층에서 최종 사용자에게 제공된 경우 이 필드에 OriginShieldHit가 포함합니다.

    • 객체가 CloudFront 캐시에 없고 오리진 요청 Lambda @Edge 함수에 의해 응답이 생성된 경우 이 필드에는 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 - 최종 사용자가 오리진 오류를 일으킨 메시지를 느리게 읽었습니다.

  35. c-country

    최종 사용자의 IP 주소로 결정되는 최종 사용자의 지리적 위치를 나타내는 국가 코드입니다. 국가 코드 목록은 ISO 3166-1 alpha-2 단원을 참조하세요.

  36. cs-accept-encoding

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

  37. cs-accept

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

  38. cache-behavior-path-pattern

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

  39. cs-headers

    최종 사용자 요청의 HTTP 헤더(이름 및 값)입니다.

    참고

    이 필드는 800바이트로 잘립니다.

  40. cs-header-names

    최종 사용자 요청의 HTTP 헤더 이름(값 아님)입니다.

    참고

    이 필드는 800바이트로 잘립니다.

  41. cs-headers-count

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

  42. origin-fbl

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

  43. origin-lbl

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

  44. asn

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

  45. primary-distribution-id

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

  46. primary-distribution-dns-name

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

    실시간 로그의 CMCD 필드
  47. cmcd-encoded-bitrate

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

  48. cmcd-buffer-length

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

  49. cmcd-buffer-starvation

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

  50. cmcd-content-id

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

  51. cmcd-object-duration

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

  52. cmcd-deadline

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

  53. cmcd-measured-throughput

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

  54. cmcd-next-object-request

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

  55. cmcd-next-range-request

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

  56. cmcd-object-type

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

  57. cmcd-playback-rate

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

  58. cmcd-requested-maximum-throughput

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

  59. cmcd-streaming-format

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

  60. cmcd-session-id

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

  61. cmcd-stream-type

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

  62. cmcd-startup

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

  63. cmcd-top-bitrate

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

  64. cmcd-version

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

엔드포인트(Kinesis Data Streams)

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

Kinesis Data Streams 생성에 대한 자세한 내용은 Amazon Kinesis Data Streams 개발자 안내서의 다음 주제를 참조하세요.

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

Kinesis 데이터 스트림의 샤드 수를 추정하는 방법
  1. CloudFront 배포에서 수신하는 초당 요청 수를 계산(또는 예측)합니다.

    CloudFront 사용 보고서(CloudFront 콘솔)와 CloudFront 지표(CloudFront 및 Amazon CloudWatch 콘솔)를 사용하여 초당 요청 수를 계산할 수 있습니다.

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

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

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

  3. Amazon Kinesis Data Streams 요금 페이지의 AWS Pricing Calculator 아래에서 지금 사용자 지정 예상 비용 생성을 선택합니다.

    • 계산기에 초당 요청(레코드) 수를 입력합니다.

    • 단일 로그 레코드의 평균 레코드 크기를 입력합니다.

    • 그런 다음, 계산 표시를 선택합니다.

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

IAM 역할

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 요소는 혼동된 대리자 문제를 방지하는 데 도움이 됩니다.

{ "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으로 바꿉니다.

{ "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으로 교체합니다.

{ "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 소비자 생성

실시간 로그를 읽고 분석하려면 Kinesis Data Streams 소비자를 생성하거나 사용합니다. CloudFront 실시간 로그의 소비자를 생성할 때는 모든 실시간 로그 레코드의 필드가 항상 필드 단원에 나열된 것과 동일한 순서로 전달된다는 것을 알고 있어야 합니다. 이 고정된 순서를 적용하도록 소비자를 빌드해야 합니다.

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

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

실시간 로그 문제 해결

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

IAM 역할 권한

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

Kinesis Data Streams 조절

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