View a markdown version of this page

함수 문제 해결 및 모니터링 - AWS Elemental MediaTailor

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

함수 문제 해결 및 모니터링

이 페이지에서는 일반적인 함수 오류를 진단하고 프로덕션 환경에서 함수 성능을 모니터링할 수 있습니다. 문제 해결 섹션은 증상별로 구성되어 있습니다. 관찰한 내용부터 시작한 다음 원인을 따르고 수정합니다.

모니터링

CloudWatch 지표

MediaTailor는 함수 실행에 대한 지표를 Amazon CloudWatch에 게시합니다. 옵트인이 필요하지 않습니다.

후크 수준 지표 - 수명 주기 후크 실행당 하나의 데이터 포인트:

지표설명측정 기준
PreSessionInitHook.Invocations후크 실행 수ConfigurationName
PreSessionInitHook.Errors후크 오류 수ConfigurationName
PreSessionInitHook.Latency후크 실행 시간(ms)ConfigurationName
PreAdsRequestHook.Invocations후크 실행 수ConfigurationName
PreAdsRequestHook.Errors후크 오류 수ConfigurationName
PreAdsRequestHook.Latency후크 실행 시간(ms)ConfigurationName

함수 수준 지표 - 개별 함수 실행당 하나의 데이터 포인트:

지표설명측정 기준
Function.Invocations함수 실행 수ConfigurationName, FunctionId, FunctionType, HookType
Function.Errors함수 오류 수ConfigurationName, FunctionId, FunctionType, HookType
Function.Latency함수 실행 시간(ms)ConfigurationName, FunctionId, FunctionType, HookType

경보 설정 및 이러한 지표 작업에 대한 자세한 내용은 섹션을 참조하세요Amazon CloudWatch 지표 AWS Elemental MediaTailor 를 사용한 모니터링.

로그 이벤트

MediaTailor는 함수 실행을 위해 로그 이벤트를 내보냅니다. 오류 이벤트는 기본적으로 내보내집니다. 완료된 이벤트와 요약 이벤트는 옵트인됩니다.

이벤트 유형기본 / 옵트인로그 그룹:설명
PRE_SESSION_INIT_HOOK_SUMMARY옵트인매니페스트 로그후크 실행 요약(성공/오류)
PRE_SESSION_INIT_HOOK_ERROR기본값매니페스트 로그errorType 및 원인과 함께 후크 실패
PRE_SESSION_INIT_FUNCTION_COMPLETED옵트인매니페스트 로그입력/출력으로 완료된 개별 함수
PRE_SESSION_INIT_FUNCTION_ERROR기본값매니페스트 로그개별 함수 실패
PRE_ADS_REQUEST_HOOK_SUMMARY옵트인ADS 상호 작용 로그후크 실행 요약(성공/오류)
PRE_ADS_REQUEST_HOOK_ERROR기본값ADS 상호 작용 로그errorType 및 원인과 함께 후크 실패
PRE_ADS_REQUEST_FUNCTION_COMPLETED옵트인ADS 상호 작용 로그입력/출력으로 완료된 개별 함수
PRE_ADS_REQUEST_FUNCTION_ERROR기본값ADS 상호 작용 로그개별 함수 실패

옵트인 로그 이벤트를 활성화하려면 섹션을 참조하세요Amazon CloudWatch 지표 AWS Elemental MediaTailor 를 사용한 모니터링.

eventId 필드를 사용하여 동일한 실행에 대한 후크 수준 이벤트와 함수 수준 이벤트를 상호 연관시킵니다.

다음 Amazon CloudWatch Logs Insights 쿼리는 함수 오류 이벤트를 로 필터링eventId하여 단일 실행을 추적합니다.

fields @timestamp, eventType, functionId, errorType, cause | filter eventId = "5dc6f040-0f72-4e8c-a64e-25eeef62708c" | sort @timestamp asc

문제 해결

함수가 실패하면 MediaTailor는 오류 이벤트에 errorType 필드를 기록합니다. 이 필드를 사용하여 실패 클래스를 식별합니다.

오류 유형설명
SYNTAX_ERROR표현식이 컴파일되지 않았거나 런타임 유형 오류가 발생했습니다.
RESOURCE_LIMIT_ERROR표현식이 CPU 시간, 메모리 또는 스택 깊이 제한을 초과함
RESTRICTION_ERROR표현식이 차단된 함수를 사용했거나 입력 페이로드 크기 제한을 초과했습니다.
TIMEOUT_ERROR함수 실행이 시간 제한을 초과했습니다.
VALIDATION_ERROR출력 경로는 현재 후크의 범위에서 쓸 수 없는 필드를 대상으로 합니다.
INTERNAL_ERROR함수와 관련이 없는 인프라 장애

항목은 증상별로 구성되며 해당하는 경우 이러한 오류 유형을 참조합니다.

표현식이 예기치 않게 null을 반환합니다.

증상: 채워질 것으로 예상되는 출력 값이 플레이어 파라미터에서 null 이거나 누락되었습니다.

가능한 원인:

원인식별 방법수정
이 수명 주기 후크에는 입력 필드가 없습니다. PRE_SESSION_INITIALIZATION 함수adsRequest.url에서를 참조했습니다. 세션 시작 시 ADS 요청 데이터를 사용할 수 없습니다. 함수를 PRE_ADS_REQUEST 수명 주기 후크로 이동하거나 다른 입력 필드를 사용합니다. 수명 주기 후크을(를) 참조하세요.
세션 데이터에서 입력 필드가 누락되었습니다. 를 참조player_params.campaign_id했지만 플레이어가 세션 초기화 시 해당 파라미터를 전달하지 않았습니다. $exists()를 사용하여에 액세스하기 전에 확인합니다{%$exists(player_params.campaign_id) ? player_params.campaign_id : 'default'%}.
플레이어 파라미터 또는 ADS 요청에 객체 또는 배열을 작성했습니다. 이러한 네임스페이스는 문자열, 숫자 및 부울만 허용합니다. 객체와 배열이 필터링됩니다. 복잡한 데이터를에 저장temp.*하고 후속 단계에서 문자열, 숫자 또는 부울을 추출합니다.

RESOURCE_LIMIT_ERROR: 스택 오버플로

증상: errorType: "RESOURCE_LIMIT_ERROR" 및에서 함수가 실패합니다cause: "Stack overflow error".

원인: 표현식이 100 레벨의 최대 스택 깊이를 초과했습니다. 이는 일반적으로 깊이 중첩된 조건부(if/then/else) 표현식 또는 복잡한 변수 할당에서 발생합니다.

즉, 표현식의 중첩 수준이 너무 많아 MediaTailor에서 처리할 수 없습니다.

수정: 표현식을 간소화합니다. 복잡한 로직을 순차적 실행기에서 여러 출력 항목 또는 여러 단계로 나눕니다.

RESOURCE_LIMIT_ERROR: CPU 제한 시간

증상: errorType: "RESOURCE_LIMIT_ERROR" 및에서 함수가 실패합니다cause: "Expression evaluation timeout: Check for infinite loop".

원인: 표현식이 100ms CPU 시간 제한을 초과했습니다. 이는 대규모 데이터 구조에 대해 비용이 많이 드는 계산을 수행하는 표현식에서 발생할 수 있습니다.

수정: 표현식의 복잡성을 줄입니다. 큰 배열을 처리하는 경우 해당 로직을 외부 서비스로 이동하고 HTTP_REQUEST 함수를 사용하여 호출하는 것이 좋습니다.

RESTRICTION_ERROR: 함수가 허용되지 않음

증상: errorType: "RESTRICTION_ERROR" 및에서 함수가 실패합니다cause: "Function '<name>' is not allowed".

원인: 표현식이 허용되는 38개 함수 목록에 없는 JSONata 함수를 호출합니다. 일반적인 예로는 $filter, $reduce, $eval, 및 $split가 있습니다$join.

수정: cause 필드에 차단된 함수 이름이 있는지 확인합니다. 이를 허용된 대안으로 바꿉니다. 허용되는 함수 38개의 전체 목록은 섹션을 참조JSONata 표현식 참조하세요.

일반적으로 사용되는 허용되는 함수는 $string, $number, $substring, 및 $contains입니다$encodeUrlComponent.

RESTRICTION_ERROR: 표현식이 너무 깁니다.

증상: 함수가를 사용하여 생성하거나 업데이트하지 못합니다cause: "Expression length <actual> exceeds limit <limit>".

원인: 단일 표현식이 1,000자를 초과합니다.

수정: 표현식을 더 작은 부분으로 나눕니다. 여러 출력 항목을 사용하거나 순차적 실행기에서 여러 단계로 로직을 분할합니다. 변수 바인딩(:=)을 사용하여 긴 하위 표현식이 반복되지 않도록 합니다.

HTTP 오류: 상태 코드가 null입니다.

증상: HTTP_REQUEST 함수의 출력에서는 response.statusCode입니다null.

원인: 외부 API에 연결할 수 없거나, 연결 시간이 초과되었거나, 네트워크 오류가 발생했습니다. 이 경우 MediaTailor는 response.statusCodenull, response.bodynull,를 response.text로 설정합니다"Internal Error".

수정: 응답 데이터에 액세스response.statusCode하기 전에 항상 확인하세요.

{%response.statusCode = 200 ? response.body.value : 'default'%}

이 표현식은 HTTP 호출이 200 상태 코드를 반환했는지 확인합니다. 그렇다면 응답 값을 사용합니다. 그렇지 않으면 기본값으로 돌아갑니다.

이 문제가 자주 발생하면 외부 API가 정상인지 확인합니다. API가 느린 RequestTimeoutMilliseconds 경우 늘리고 빠른 실패를 원하는 경우 줄이는 것이 좋습니다.

HTTP 오류: 응답 본문이 null임

증상: response.statusCode는 200이지만 response.body입니다null.

원인: 응답 본문이 유효한 JSON이 아니거나 20,000자를 초과합니다. MediaTailor는 최대 20,000자의 JSON 응답만에 구문 분석합니다response.body.

수정:를 대체response.text로 사용합니다. response.text 필드에는 20,000자로 잘린 원시 응답 본문이 포함됩니다.

{%response.statusCode = 200 ? ($exists(response.body.id) ? response.body.id : $substring(response.text, 0, 100)) : 'error'%}

필요한 데이터가 20,000자 제한을 초과하는 경우 외부 API에 더 작은 응답을 반환하도록 요청하는 것이 좋습니다(예: 특정 필드 요청).

HTTP 오류: URL 검증 실패

증상: URL의 형식이 잘못되었거나 잘못된 체계를 사용하거나 최대 길이를 초과했다는 메시지와 함께 런타임 시 함수가 실패합니다.

가능한 원인:

원인수정
URL은 http 또는를 사용하지 않습니다https. URL 표현식이 http:// 또는 로 시작하는 URL을 생성하는지 확인합니다https://.
표현식 평가 후 URL이 2,048자를 초과합니다. URL을 줄입니다. POST 메서드를 사용하여 큰 파라미터 값을 요청 본문으로 이동합니다.
URL의 형식이 잘못되었습니다(유효한 URI가 아님). 표현식에 누락된 문자나 추가 문자가 있는지 확인합니다. 특수 문자를 포함할 수 있는 쿼리 파라미터 값에 $encodeUrlComponent()를 사용합니다.

VALIDATION_ERROR

증상: 함수가에서 실패합니다errorType: "VALIDATION_ERROR". 이 오류는 작성 시(함수를 생성하거나 업데이트할 때) 또는 실행 시(세션 중에 함수가 실행될 때) 발생할 수 있습니다.

가능한 원인:

원인예제수정
출력 키는 현재 후크에서 쓸 수 없는 네임스페이스를 대상으로 합니다. 에 연결된 함수adsRequest.url에서에 쓰기PRE_SESSION_INITIALIZATION. 수명 주기 후크에서 허용되는 출력 네임스페이스를 확인합니다.는 PRE_SESSION_INITIALIZATION만 허용합니다player_params.*. 함수를 올바른 후크로 이동하거나 출력 키를 변경합니다. 수명 주기 후크을(를) 참조하세요.
출력 키는 잘못된 문자를 사용합니다. 와 같은 출력 키player_params.device type(공백 포함). 문자, 숫자, 밑줄 및 하이픈만 허용됩니다. 유효한 문자만 사용하도록 출력 키의 이름을 바꿉니다. 예를 들어 player_params.device_type 대신를 사용합니다.
출력 키는 유효한 접두사로 시작하지 않습니다. player_params.myValue 또는 custom.myValue 대신와 같은 출력 키입니다temp.myValue. 유효한 출력 접두사 player_params.*, 또는 temp.*를 사용합니다adsRequest.*.
JSONata 표현식에 구문 오류가 있습니다. 닫는 따옴표가 누락되었거나 불완전한 조건부: {%session.id & %}. 표현식에서 누락된 따옴표, 일치하지 않는 괄호 또는 ?? 또는와 같은 지원되지 않는 연산자를 검토합니다?:.
HTTP_REQUEST 함수에 필수 필드가 누락되었습니다. URL 필드가 비어 있거나 메서드가 지정되지 않았습니다. URL 및 메서드 필드가 설정되어 있는지 확인합니다. 메서드는 GET 또는 여야 합니다POST.
표현식으로 빌드된 URL이 잘못되었습니다. 평가된 URL은와 같은 지원되지 않는 체계를 사용하거나ftp://, 2,048자를 초과하거나, 형식이 잘못되었습니다. URL 표현식이 유효한 http:// 또는 https:// URL을 생성하는지 확인합니다. 특수 문자를 포함할 수 있는 쿼리 파라미터 값에 $encodeUrlComponent()를 사용합니다.
HTTP 헤더에 잘못된 문자가 포함되어 있거나 제한된 이름을 사용합니다. 헤더 값에 줄 바꿈이 포함되거나 헤더 이름이 host 또는 입니다transfer-encoding. 헤더 값에서 잘못된 문자를 제거합니다. 제한된 헤더 이름을 사용하지 마세요. 헤더 제한은 섹션을 참조HTTP_REQUEST하세요.

오류 로그 이벤트의 cause 필드를 확인합니다. 즉, 검증에 실패한 필드 또는 표현식을 식별합니다.

INTERNAL_ERROR

증상: 함수가에서 실패합니다errorType: "INTERNAL_ERROR".

원인: 함수 구성과 관련이 없는 인프라 장애가 발생했습니다.

수정: 요청을 다시 시도합니다. 오류가 지속되면 AWS Support에 문의하십시오.