API Management 정책에서 오류 처리

적용 대상: 모든 API Management 계층

Azure API Management ProxyError 개체를 제공하여 게시자가 요청을 처리하는 동안 발생할 수 있는 오류 조건에 응답할 수 있도록 합니다. context.LastError 속성을 통해 ProxyError 객체에 액세스합니다. on-error 정책 섹션의 정책은 ProxyError 개체를 사용할 수 있습니다. 이 문서에서는 Azure API Management에서 오류 처리 기능에 대한 참조를 제공합니다.

API Management에서 오류 처리

Azure API Management의 정책은 다음 예에 표시된 것처럼 inbound, backend, outboundon-error 섹션으로 나뉩니다.

<policies>
    <inbound>
        <!-- statements to be applied to the request go here -->
    </inbound>
    <backend>
        <!-- statements to be applied before the request is
             forwarded to the backend service go here -->
    </backend>
    <outbound>
        <!-- statements to be applied to the response go here -->
    </outbound>
    <on-error>
        <!-- statements to be applied if there is an error
             condition go here -->
    </on-error>
</policies>

요청을 처리하는 동안 기본 제공 단계는 요청에 대한 범위에 있는 모든 정책과 함께 실행됩니다. 오류가 발생하는 경우 처리가 on-error 정책 섹션으로 즉시 이동합니다.

on-error 정책 섹션은 모든 범위에서 사용할 수 있습니다. API 게시자는 오류를 Azure Event Hubs 로깅하거나 호출자에게 반환할 새 응답을 만드는 등 사용자 지정 동작을 구성할 수 있습니다.

참고

섹션은 on-error 기본적으로 정책에 없습니다. on-error 섹션을 정책에 추가하려면 정책 편집기에서 원하는 정책을 찾아 추가합니다. 정책 구성에 대한 자세한 내용은 API Management에서 정책을 참조하세요.

섹션이 없 on-error 으면 오류 조건이 발생하는 경우 호출자는 400 또는 500 HTTP 응답 메시지를 받습니다.

오류 발생 시 허용되는 정책

다음 정책을 on-error 정책 섹션에서 사용할 수 있습니다.

마지막 오류

오류가 발생하여 컨트롤이 on-error 정책 섹션으로 이동하면, 오류는 context.LastError 속성에 저장됩니다. on-error 섹션의 정책은 context.LastError에 액세스할 수 있습니다. LastError 에는 다음 속성이 있습니다.

이름 유형 설명 필수
Source 문자열 오류가 발생한 요소의 이름입니다. 정책 또는 기본 제공 파이프라인 단계 이름일 수 있습니다.
Reason 문자열 오류 처리에 사용될 수 있는 컴퓨터에 익숙한 오류 코드입니다. 아니요
Message 문자열 사람이 읽을 수 있는 오류 설명입니다.
Scope 문자열 오류가 발생한 범위이름입니다. 아니요
Section 문자열 오류가 발생한 섹션 이름입니다. 가능한 값: inbound, backend, outbound또는 on-error. 아니요
Path 문자열 예를 들어 choose[3]\\when[2]중첩된 정책 계층 구조를 지정합니다. 중첩된 정책의 여러 인스턴스는 1에서 인덱싱됩니다. 아니요
PolicyId 문자열 오류가 발생한 정책에서 id 특성 값(고객이 지정한 경우) 아니요

를 통해 context.Response.StatusCode상태 코드에 액세스할 수 있습니다.

참고

모든 정책에는 정책의 루트 요소에 추가할 수 있는 선택적 id 특성이 포함됩니다. 오류 조건이 발생할 때 이 특성이 정책에 포함되어 있는 경우, context.LastError.PolicyId 속성을 사용하여 특성 값을 검색할 수 있습니다.

기본 제공 단계에 대해 미리 정의된 오류

기본 제공 처리 단계를 평가하는 동안 발생할 수 있는 오류 조건에 대해 다음 오류가 미리 정의됩니다.

원본 조건 원인 메시지
구성 URI가 API 또는 작업과 일치하지 않음 OperationNotFound 들어오는 요청을 작업과 일치시킬 수 없습니다.
허가 구독 키가 제공되지 않음 구독 키를 찾을 수 없음 구독 키가 누락되어 액세스가 거부되었습니다. 이 API에 요청을 수행할 때 구독 키를 포함해야 합니다.
권한 구독 키 값이 잘못됨 구독 키 유효하지 않음 잘못된 구독 키로 인해 액세스가 거부되었습니다. 활성 구독에 대해 유효한 키를 제공해야 합니다.
여러 가지 요청이 보류 중인 동안 클라이언트가 다운스트림 연결(클라이언트에서 API Management 게이트웨이로)을 중단했습니다. 클라이언트 연결 실패 여러 가지
여러 가지 백 엔드가 중단되었거나 업스트림 연결을 설정할 수 없습니다(API Management 게이트웨이에서 백 엔드 서비스로) 백엔드 연결 실패 여러 가지
여러 가지 특정 식을 평가하는 동안 런타임 예외가 발생했습니다. 표현 값 평가 실패 여러 가지

정책에 대해 미리 정의된 오류

정책 평가 중에 발생할 수 있는 오류 조건에 대해 다음 오류가 미리 정의됩니다.

원본 조건 원인 메시지
속도 제한 속도 제한 초과 RateLimitExceeded 속도 제한을 초과했습니다.
할당량 할당량이 초과됨 할당량 초과 호출 볼륨 할당량을 초과했습니다. 할당량이 xx:xx:xx에서 보충됩니다. 또는 대역폭 할당량을 초과했습니다. 할당량이 xx:xx:xx에서 보충됩니다.
jsonp 콜백 매개 변수 값이 잘못되었습니다(잘못된 문자 포함). 콜백 매개변수 유효하지 않음 콜백 매개 변수 {callback-parameter-name} 값이 올바른 JavaScript 식별자가 아닙니다.
IP 필터링 요청에서 호출자 IP를 파싱하는 데 실패했습니다. FailedToParseCallerIP 호출자에 대한 IP 주소를 설정하지 못했습니다. 액세스가 거부되었습니다.
IP 필터링 호출자 IP가 허용 목록에 없습니다. 전화 발신자 IP가 허용되지 않음 호출자 IP 주소 {ip-address}이(가) 허용되지 않습니다. 액세스가 거부되었습니다.
IP 필터링 호출자 IP가 차단 목록에 있음 발신자 IP 차단됨 호출자 IP 주소가 차단되었습니다. 액세스가 거부되었습니다.
검사 헤더 필수 헤더가 없거나 값이 누락됨 헤더를 찾을 수 없음 헤더 {header-name}이(가) 요청에 없습니다. 액세스가 거부되었습니다.
검사 헤더 필수 헤더가 없거나 값이 누락됨 헤더 값 허용되지 않음 {header-value}의 헤더 {header-name} 값이 허용되지 않습니다. 액세스가 거부되었습니다.
JWT 유효성 검사 요청에 JWT(JSON 웹 토큰)가 없습니다. TokenNotPresent JWT가 없습니다.
JWT 유효성 검사 서명 유효성 검사에 실패 토큰 서명이 올바르지 않음 <jwt 라이브러리의 메시지>. 액세스가 거부되었습니다.
JWT 유효성 검사 잘못된 대상 TokenAudienceNotAllowed <jwt 라이브러리의 메시지>. 액세스가 거부되었습니다.
JWT 유효성 검사 잘못된 발급자 토큰 발급자가 허용되지 않음 <jwt 라이브러리의 메시지>. 액세스가 거부되었습니다.
JWT 유효성 검사 토큰이 만료됨 토큰 만료 <jwt 라이브러리의 메시지>. 액세스가 거부되었습니다.
JWT 유효성 검사 서명 키가 ID로 확인되지 않음 TokenSignatureKeyNotFound <jwt 라이브러리의 메시지>. 액세스가 거부되었습니다.
JWT 유효성 검사 토큰에서 필수 클레임이 누락됨 토큰 클레임을 찾을 수 없음 JWT에는 다음 클레임이 없습니다. <c1>, <c2>, ... 액세스가 거부되었습니다.
JWT 유효성 검사 클레임 값이 일치하지 않음 토큰 클레임 값 허용되지 않음 클레임 {claim-name}의 값 {claim-value}는 허용되지 않습니다. 액세스가 거부되었습니다.
JWT 유효성 검사 기타 유효성 검사 실패 JWT 유효하지 않음 <jwt 라이브러리의 메시지>
요청 전달 또는 요청 보내기 구성된 시간 제한 내에 백 엔드에서 HTTP 응답 상태 코드 및 헤더를 받지 못했습니다. 시간 제한 여러 가지

예시

API 정책을 다음 값으로 설정합니다.

<policies>
    <inbound>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <set-header name="ErrorSource" exists-action="override">
            <value>@(context.LastError.Source)</value>
        </set-header>
        <set-header name="ErrorReason" exists-action="override">
            <value>@(context.LastError.Reason)</value>
        </set-header>
        <set-header name="ErrorMessage" exists-action="override">
            <value>@(context.LastError.Message)</value>
        </set-header>
        <set-header name="ErrorScope" exists-action="override">
            <value>@(context.LastError.Scope)</value>
        </set-header>
        <set-header name="ErrorSection" exists-action="override">
            <value>@(context.LastError.Section)</value>
        </set-header>
        <set-header name="ErrorPath" exists-action="override">
            <value>@(context.LastError.Path)</value>
        </set-header>
        <set-header name="ErrorPolicyId" exists-action="override">
            <value>@(context.LastError.PolicyId)</value>
        </set-header>
        <set-header name="ErrorStatusCode" exists-action="override">
            <value>@(context.Response.StatusCode.ToString())</value>
        </set-header>
        <base />
    </on-error>
</policies>

승인되지 않은 요청을 보내면 다음 응답이 발생합니다.

스크린샷은 오류 메시지가 포함된 예제에 대한 응답을 보여줍니다.

정책 작업에 대한 자세한 내용은 다음을 참조하세요.