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

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
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. 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 の形式での Spike Arrest レートの指定に使用されます。たとえば、{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> 要素の Spike Arrest レートの値は、rate という名前のリクエスト ヘッダーから取得されます。ただし、Apigee では request.header.rate は解決できません。これは API リクエストの一部としてヘッダー rate を渡していない場合に発生します。

    次に示すのは、リクエストの一部としてヘッダー rate を渡さない API リクエストの例です。

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

    ここで、your_host_alias は、オーバーライド ファイルの virtualhosts.hostAliases プロパティで構成され、API へのアクセスに使用される公開ドメインです。構成のオーバーライドを指定するをご覧ください。

    ヘッダー rate がリクエストの一部として渡されないため、上記の Spike Arrest ポリシー内の要素 <Rate> で使われている参照 request.header.rate は定義されておらず、解決できません。そのためエラー レスポンスが返されます。

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

解決策

Spike Arrest ポリシーが実行されている特定のフローで、<Rate> 要素で参照される変数が存在しているまたは定義されており、使用可能であることを確認します。

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

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

ここで、your_host_alias は、オーバーライド ファイルの virtualhosts.hostAliases プロパティで構成され、API へのアクセスに使用される公開ドメインです。構成のオーバーライドを指定するをご覧ください。