Spike Arrest ポリシーのランタイム エラーのトラブルシューティング

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. Spike Arrest ポリシーの <MessageWeight> 要素に使用されている無効な値を特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次のエラーでは、<MessageWeight> 要素に使用されている無効な値は 1.5 です。

    "faultstring": "Invalid message weight value 1.5"
        
  2. エラーが発生した特定の API プロキシで、すべての Spike Arrest ポリシーを調べます。<MessageWeight> 要素が指定されている Spike Arrest ポリシーは 1 つ以上存在する可能性があります。

    たとえば、次のポリシーでは 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. 特定した Spike Arrest ポリシーの <MessageWeight> 要素で使用されている変数の値を確認します。このフロー変数の値は、HTTP ヘッダー、クエリ、パラメータ、XML または JSON リクエスト ペイロードから抽出されることも、別のポリシーで定義されていることもあります。

    1. API プロキシのコード内で、最初にその変数が定義された場所を特定します。
    2. 変数が定義されているポリシーを特定したら、その変数の値がどのように設定されるのか調べます。
    3. フロー変数の値が上記のステップ 1 で特定した値と一致している場合、これがエラーの原因です。

    たとえば、Spike Arrest ポリシーの開始前に使用される JavaScript ポリシーで、次のようにリクエスト メソッドに応じて変数 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 要素の値が有効な値(整数値)になるようにします。

上記の例を修正するには、JavaScript に含まれる変数 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> 要素に含まれるレート設定を格納する変数への参照を、Spike Arrest ポリシー内で指定されている値に解決できない場合に発生します。この要素は必須であり、スパイク停止率を {int}pm または {int}ps の形式で指定するために使用されます。たとえば、{int}pm500pm となっている場合、これは 1 分あたり 500 回の呼び出しを意味します。同様に、10ps は 1 秒あたり 10 回の呼び出しを意味します。

診断

  1. エラーが発生した Spike Arrest ポリシーと、適切に解決できない参照の名前を特定します。どちらの項目も、エラー レスポンスの faultstring 要素を調べるとわかります。

    たとえば、次の faultstring では、該当するポリシー名は SpikeArrest_AuthProxy、参照は request.header.rate です。

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
        
  2. エラーが発生した Spike Arrest ポリシーの XML で使用されている参照の名前が、エラー文字列で特定した参照名(上記のステップ 1)と一致していることを確認します。** **

    たとえば、次のポリシーでは、要素に request.header.rate という名前の参照を設定しています。この参照名は、faultstring で特定した参照名と一致しています。

    <?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. 変数が定義されていて、Spike Arrest ポリシーが実行されるフローで使用できることを確認します。

  4. 変数が次のいずれかの状態になっていないか確認します。

    • 範囲外(ポリシーが実行されている特定のフローで使用できない)
    • 解決できない(定義されていない)

    いずれかの状態が当てはまる場合、それがエラーの原因です。

    上記の例では、<Rate> 要素に含まれるスパイク停止率の値は、リクエストの rate という名前のヘッダーから取得されることになっています。しかし、Edge は変数参照を request.header.rate を解決することができません。この事態は、ヘッダー rate が API リクエストの一部として渡されないと発生します。

    次の API リクエストの例では、ヘッダー rate をリクエストの一部として渡していません。

        curl -v http://jdoe-eval-test.apigee.net/check_spikearrest -H "Content-Type: application/json"
        

    ヘッダー rate がリクエストの一部として渡されないことから、上記の Spike Arrest ポリシーの要素 <Rate> で使用されている参照 request.header.rate は定義されていません。したがって、この参照を解決することはできません。そのため、次のエラーコードを受け取ります。

    policies.ratelimit.FailedToResolveSpikeArrestRate
        

解決策

<Rate> 要素で参照されている変数が存在するようにするか、Spike Arrest ポリシーが実行される特定のフローで使用できるようにします。

上記の例を修正するには、以下に示すように、リクエストを変更して rate ヘッダーを含めます。

curl -v  http://jdoe-eval-test.apigee.net/check_spikearrest -H "Content-Type: application/json" -H "rate:30ps"