割り当てポリシー ランタイム エラーのトラブルシューティング

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントを表示する。

InvalidMessageWeight

エラーコード

policies.ratelimit.InvalidMessageWeight

エラー レスポンスの本文

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

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

    たとえば、次のポリシーではフロー変数 message_weight を使用して <MessageWeight> を指定します。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <Quota async="false" continueOnError="false" enabled="true" name="Quota_with_weight" type="calendar">
        <DisplayName>Quota_with_weight</DisplayName>
        <Properties/>
        <Allow count="3"/>
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <StartTime>2017-7-16 12:00:00</StartTime>
        <MessageWeight ref="message_weight"/>
    </Quota>
    
  3. 識別した Quota ポリシーで <MessageWeight> に使用されている変数の値を決定します。フロー変数の値は、HTTP ヘッダー、クエリ パラメータ、XML または JSON リクエストのペイロードから抽出することも、別のポリシーで定義されていることもあります。

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

    たとえば、Quota ポリシーより前に使用された 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");
}

FailedToResolveQuotaIntervalReference

エラーコード

policies.ratelimit.FailedToResolveQuotaIntervalReference

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "Failed to resolve quota interval reference [reference] in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalReference"
        }
    }
}

エラー メッセージの例

{
    "fault": {
        "faultstring": "Failed to resolve quota interval reference api.product.developer.quota.interval in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalReference"
        }
    }
}

原因

このエラーは、Quota ポリシー内で <Interval> 要素が定義されていない場合に発生します。この要素は必須であり、割り当てに適用される間隔を指定するために使用されます。間隔は、<TimeUnit> 要素で定義された分、時、日、週、月で指定できます。

診断

  1. エラーが発生した API プロキシで、各 Quota ポリシーを調べます。必須の要素 <Interval> が定義されていない Quota ポリシーがある場合、それがエラーの原因です。

    たとえば、次の Quota ポリシーには必須の <Interval> 要素がありません。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
        <DisplayName>CheckQuota</DisplayName>
        <Properties/>
        <Allow count="3"/>
            <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
        <StartTime>2017-7-16 12:00:00</StartTime>
    </Quota>
    

    上記の Quota ポリシーには必須の <TimeUnit> 要素が定義されていないため、次のエラーコードを受け取ります。

    policies.ratelimit.FailedToResolveQuotaIntervalReference
    

解決策

所定の API プロキシのすべての Quota ポリシーに、必須の <Interval> 要素が適切に定義されていることを確認します。

上記の例を修正するには、次のように <Interval> 要素を含めるようにポリシーを変更します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
    <DisplayName>CheckQuota</DisplayName>
    <Properties/>
    <Allow count="3"/>
    <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
    <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
    <StartTime>2017-7-16 12:00:00</StartTime>
</Quota>

FailedToResolveQuotaIntervalTimeUnitReference

エラーコード

policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "Failed to resolve quota time unit reference [reference] in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference"
        }
    }
}

エラー メッセージの例

{
    "fault": {
        "faultstring": "Failed to resolve quota time unit reference apiproduct.developer.quota.timeunity in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference"
        }
    }
}

原因

このエラーは、Quota ポリシー内で <TimeUnit> 要素が定義されていない場合に発生します。この要素は必須であり、割り当てに適用される時間単位を指定するために使用されます。間隔は、分、時間、日、週、月で指定できます。

診断

  1. エラーが発生した API プロキシで、各 Quota ポリシーを調べます。必須の要素 <TimeUnit> が定義されていない Quota ポリシーがある場合、それがエラーの原因です。

    たとえば、次の Quota ポリシーには必須の <TimeUnit> 要素がありません。

    <Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
      <DisplayName>CheckQuota</DisplayName>
      <Properties/>
      <Allow count="3"/>
          <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
      <StartTime>2017-7-16 12:00:00</StartTime>
    </Quota>
    

    上記の Quota ポリシーには必須の <TimeUnit> 要素が定義されていないため、次のエラーコードを受け取ります。

    policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference
    

解決策

所定の API プロキシのすべての Quota ポリシーに、必須の <TimeUnit> 要素が定義されていることを確認します。

上記の例を修正するには、次のように <TimeUnit> 要素を含めるようにポリシーを変更します。

<Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
    <DisplayName>CheckQuota</DisplayName>
    <Properties/>
    <Allow count="3"/>
    <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
    <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
    <StartTime>2017-7-16 12:00:00</StartTime>
</Quota>