급증 저지 정책 런타임 오류 문제 해결

Apigee X 문서를 보고 계십니다.
Apigee Edge 문서 보기

InvalidMessageWeight

오류 코드

policies.ratelimit.InvalidMessageWeight

오류 응답 본문

{
    "fault": {jdoe
        "faultstring": "Invalid message weight value [invalid_value]",
        "detail": {
            "errorcode": "policies.ratelimit.InvalidMessageWeight"
        }
    }
}

오류 메시지 예시

{
    "fault": {
        "faultstring": "Invalid message weight value 1.5",
        "detail": {
            "errorcode": "policies.ratelimit.InvalidMessageWeight"
        }
    }
}

원인

이 오류는 흐름 변수를 통해 <MessageWeight> 요소에 지정된 값이 잘못된 경우에(정수가 아닌 값) 발생합니다.

예를 들어 이 오류는 <MessageWeight> 요소에 지정된 흐름 변수의 값이 1.5인 경우에(정수가 아닌 값) 발생합니다.

진단

  1. 급증 저지 정책의 <MessageWeight> 요소에 사용된 잘못된 값을 확인합니다. 이 정보는 오류 응답의 faultstring 요소에서 확인할 수 있습니다. 예를 들어 다음 오류에서 <MessageWeight> 요소에 사용된 잘못된 값은 1.5입니다.

    "faultstring": "Invalid message weight value 1.5"
    
  2. 오류가 발생한 특정 API 프록시의 모든 급증 저지 정책을 검사합니다. <MessageWeight> 요소가 지정된 급증 저지 정책이 하나 이상 있을 수 있습니다.

    예를 들어 다음 정책은 message_weight:라는 흐름 변수를 통해 <MessageWeight> 값을 지정합니다.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArrest_AuthProxy">
        <DisplayName>SpikeArrest_AuthProxy</DisplayName>
        <Properties/>
        <Identifier ref="request.header.some-header-name"/>
        <Rate>100ps</Rate>
        <MessageWeight ref="message_weight"/>
    </SpikeArrest>
    
  3. 식별된 급증 저지 정책의 <MessageWeight> 요소에 사용된 변수 값을 확인합니다. 흐름 변수의 값은 HTTP 헤더, 쿼리 매개변수, XML 또는 JSON 요청 페이로드에서 추출하거나 다른 정책에서 정의할 수 있습니다.

    1. 변수가 먼저 정의된 API 프록시 내에서 코드를 찾습니다.
    2. 변수가 먼저 정의되고 채워지는 정책을 확인한 후 변수의 값이 어떻게 설정되는지 확인합니다.
    3. 흐름 변수의 값이 위의 1단계에서 식별된 값과 일치한다면, 이는 오류의 원인이 됩니다.

    예를 들어 아래와 같아 요청 메서드에 따라 message_weight 변수를 설정하기 위해 급증 저지 정책 전에 자바스크립트 정책을 사용한다고 가정합니다.

    var verb = context.getVariable("request.verb");
    context.setVariable("message_weight", "1.5");
    if (verb == 'POST') {
      context.setVariable("message_weight", "2");
    }
    

    여기서 변수 message_weight의 값은 1.5이며 잘못된 값(정수가 아님)입니다.

해결 방법

MessageWeight 요소의 값이 유효한 값(정수 값)인지 확인합니다.

위에 표시된 예시를 수정하려면 자바스크립트의 변수 message_weight 값을 정수로 수정하면 됩니다.

var verb = context.getVariable("request.verb");
context.setVariable("message_weight", "1");
if (verb == 'POST') {
  context.setVariable("message_weight", "2");
}

FailedToResolveSpikeArrestRate

오류 코드

policies.ratelimit.FailedToResolveSpikeArrestRate

오류 응답 본문

{
    "fault": {
        "faultstring": "Failed to resolve Spike Arrest Rate reference [reference] in SpikeArrest policy [api_policy]",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveSpikeArrestRate"
        }
    }
}

오류 메시지 예시

{
    "fault": {
        "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveSpikeArrestRate"
        }
    }
}

원인

이 오류는 <Rate> 요소 내에 속도 설정이 포함된 변수의 참조를 급증 저지 정책에서의 값으로 확인할 수 없는 경우에 발생합니다. 이 요소는 필수이며 {int}pm 또는 {int}ps 형식으로 급증 저지 속도를 지정하는 데 사용됩니다. 예를 들어 {int}pm500pm일 수 있으며, 이는 분당 호출 500회을 의미합니다. 마찬가지로 10ps 값은 초당 호출 10회를 의미합니다.

진단

  1. 오류가 발생한 급증 저지 정책과 제대로 확인할 수 없는 참조의 이름을 확인합니다. 두 항목은 모두 오류 응답의 faultstring 요소에서 찾을 수 있습니다.

    예를 들어 다음 faultstring에서 정책 이름은 SpikeArrest_AuthProxy이고 참조는 request.header.rate입니다.

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. 실패한 급증 저지 정책 XML에서, 사용된 참조 이름이 오류 문자열(위의 1단계)에서 식별된 참조 이름과 일치하는지 확인합니다. ** **

    예를 들어 다음 정책은 faultstring에서 식별된 이름과 일치하는 request.header.rate라는 참조가 있는 요소를 설정합니다.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArrest_AuthProxy">
        <DisplayName>SpikeArrest_AuthProxy</DisplayName>
        <Properties/>
        <Identifier ref="request.header.some-header-name"/>
        <Rate ref="request.header.rate"/>
    </SpikeArrest>
    
    
  3. 변수가 급증 저지 정책이 실행되는 흐름에서 정의되고 사용 가능한지 확인합니다.

  4. 변수가 다음 중 하나인 경우

    • 범위를 벗어난 경우(정책이 실행 중인 특정 흐름에서 사용할 수 없음)
    • 확인할 수 없는 경우(정의되지 않음)

    이는 오류의 원인이 됩니다.

    위에 표시된 예시에서 <Rate> 요소의 급증 저지 속도 값은 rate라는 요청 헤더에서 검색되어야 합니다. 하지만 Apigee는 request.header.rate를 확인할 수 없습니다. 이 문제는 헤더 rate가 API 요청의 일부로 전달되지 않은 경우에 발생합니다.

    다음은 헤더 rate를 요청의 일부로 전달하지 않는 샘플 API 요청입니다.

      curl -v http://your_host_alias/check_spikearrest -H "Content-Type: application/json"
    

    여기서 your_host_alias는 재정의 파일의 virtualhosts.hostAliases 속성에 구성된 대로 API에 액세스하는 데 사용되는 공개 도메인입니다. 구성 재정의 지정을 참조하세요.

    헤더 rate는 요청의 일부로 전달되지 않으므로, 위의 급증 저지 정책의 <Rate> 요소에 사용된 참조 request.header.rate는 정의되지 않고 이에 따라 확인할 수 없습니다. 따라서 다음과 같은 오류 코드가 수신됩니다.

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

해결 방법

<Rate> 요소에서 참조된 변수가 존재하거나 정의되었으며 이를 급증 저지 정책이 실행되는 특정 흐름에서 사용 가능한지 확인합니다.

위에 표시된 예시를 수정하려면 아래와 같이 요청에 rate 헤더가 포함되도록 요청을 수정하면 됩니다.

curl -v  http://your_host_alias/check_spikearrest -H "Content-Type: application/json" -H "rate:30ps"

여기서 your_host_alias는 재정의 파일의 virtualhosts.hostAliases 속성에 구성된 대로 API에 액세스하는 데 사용되는 공개 도메인입니다. 구성 재정의 지정을 참조하세요.