Extract Variables のランタイム エラーのトラブルシューティング

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

SourceMessageNotAvailable

エラーコード

steps.extractvariables.SourceMessageNotAvailable

エラー レスポンスの本文

{
  "fault": {
      "faultstring": "[variable_name] message is not available for ExtractVariable: [policy_name]",
      "detail": {
          "errorcode": "steps.extractvariables.SourceMessageNotAvailable"
      }
  }
}

原因

このエラーは、Extract Variables ポリシーの <Source> 要素で指定された message 変数が、次のいずれかである場合に発生します。

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

たとえば、Extract Variables ポリシーがリクエスト フローで実行されているときに、<Source> 要素が、リクエスト フローに存在しない response 変数または error 変数に設定されていると、このエラーが発生します。

診断

  1. エラーが発生した Extract Variables ポリシーと使用できない変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の障害文字列では、ポリシー名は ExtractVariables-1、変数は response です。

    "faultstring": "response message is not available for ExtractVariable: ExtractVariables-1"

  2. 失敗した Extract Variables ポリシーの XML で、要素に設定された変数名が、障害文字列で特定された変数名に一致していることを確認します(上記の手順 1)。たとえば、次の Extract Variables ポリシーでは要素内の response という変数を指定しています。これは、障害文字列の内容と一致します。

    <ExtractVariables name="ExtractVariables-1">
        <Source>response</Source>
        <URIPath>
            <Pattern ignoreCase="true">/a/{pathSeg}</Pattern>
        </URIPath>
        <VariablePrefix>urirequest</VariablePrefix>
    </ExtractVariables>
    
  3. <Source> 要素で使用される変数が定義されていて、Extract Variables ポリシーが実行されるフローで使用できることを確認します。

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

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

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

    たとえば、上記の Extract Variables ポリシーがリクエスト フローで実行されているとします。response 変数は、Extract Variables ポリシーの <Source> 要素で使用されています。response 変数はレスポンス フローでのみ使用できます。

    response 変数はリクエスト フローに存在しないため、次のエラーコードを受け取ります。steps.extractvariables.SourceMessageNotAvailable

解決策

失敗した Extract Variables ポリシーの <Source> 要素内に設定された変数は、定義済みで、ポリシーが実行されるフローに存在することを確認します。

上記の Extract Variables ポリシーの例を修正するには、リクエスト フローに存在する request 変数を使用するように <Source> 要素を修正します。

<ExtractVariables name="ExtractVariables-1">
    <Source>request</Source>
    <URIPath>
        <Pattern ignoreCase="true">/a/{pathSeg}</Pattern>
    </URIPath>
    <VariablePrefix>urirequest</VariablePrefix>
</ExtractVariables>

SetVariableFailed

エラーコード

steps.extractvariables.SetVariableFailed

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "Failed to set variable [variable_name] value [variable_value] from ExtractVariables: [policy_name]",
        "detail": {
            "errorcode": "steps.extractvariables.SetVariableFailed"
        }
    }
}

原因

このエラーは、Extract Variables ポリシーで変数に値を設定できなかった場合に発生します。このエラーは通常、ネストされたドット区切り形式で、名前が同じ単語で始まる複数の変数に値を割り当てようとすると発生します。

たとえば、変数 var.color に値を作成または割り当てるとします。この場合、オブジェクト ノードとして color が割り当てられます。その後、別の変数 var.color.next に値を割り当てようとすると、color がすでに割り当てられており、別の変数を割り当てられないため、失敗します。

診断

  1. エラーが発生した Extract Variables ポリシーと、値を設定できなかった変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の障害文字列では、ポリシー名は ExtractColors、変数は var.color.next です。

    "faultstring": "Failed to set variable var.color.next value red from ExtractVariables: ExtractColors"

  2. エラーが発生した Extract Variables ポリシーの XML で、変数名が障害文字列で特定(上記の手順 1)された変数名に一致しているかを確認します。たとえば、次のポリシーは、リクエスト クエリ パラメータの値を var.color.next という変数(障害文字列が表示される値)に割り当てようとします。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractColors">
        <DisplayName>ExtractColors</DisplayName>
        <Source>request</Source>
        <QueryParam name="color">
            <Pattern ignoreCase="true">{color}</Pattern>
        </QueryParam>
        <QueryParam name="nextcolor">
            <Pattern ignoreCase="true">{color.next}</Pattern>
        </QueryParam>
        <VariablePrefix>var</VariablePrefix>
    </ExtractVariables>
    
  3. エラーが発生した Extract Variables ポリシーで使用されているすべての変数名を調べます。問題のある文字列(上記の手順 1)で特定した変数名と同じ名前で始まる別の変数に値を割り当てている場合は、これがエラーの原因です。

    上記の Extract Variables ポリシーの例では、次の点に注意してください。

    • color というクエリ パラメータの値は、最初に変数 var.color に割り当てられます(注: var<VariablePrefix> 要素に設定されたすべての変数の接頭辞です)。
    • 次の割り当てでは、nextcolor クエリ パラメータの値が別の変数 var.color.next に割り当てられます。
    • var.color はすでに割り当てられているため、Extract Variables ポリシーで別のネストされた変数 var.color.next を割り当てることはできません。したがって、steps.extractvariables.SetVariableFailed エラーコードを受け取ります。

解決策

ドット区切り形式でネストされた、同じ単語で始まる複数の変数名がないことを確認します。

上記の Extract Variables ポリシーを修正するには、変数名 var.nextcolor. を使用するように変数名 var.color.next を変更します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables name="ExtractColors">
    <DisplayName>ExtractColors</DisplayName>
    <Source>request</Source>
    <QueryParam name="color">
        <Pattern ignoreCase="true">{color}</Pattern>
    </QueryParam>
    <QueryParam name="nextcolor">
        <Pattern ignoreCase="true">{nextcolor}</Pattern>
    </QueryParam>
    <VariablePrefix>var</VariablePrefix>
</ExtractVariables>

詳細

詳しくは、こちらのコミュニティ投稿をご覧ください。

InvalidJSONPath

エラーコード

steps.extractvariables.InvalidJSONPath

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "Invalid JSON path [path_name] in policy [policy_name].",
        "detail": {
            "errorcode": "steps.extractvariables.InvalidJSONPath"
        }
    }
}

原因

このエラーは、Extract Variables ポリシーの <JSONPath> 要素に無効な JSON パスが使用されている場合に発生します。たとえば、JSON ペイロードにオブジェクト Name がないのもかかわらず Extract Variables ポリシーでパスとして Name を指定すると、このエラーが発生します。

診断

  1. エラーが発生した Extract Variables ポリシーと無効な JSON パスを特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の障害文字列では、ポリシー名は ExtractJSONVariables で、無効な JSON パスは $.Name です。

    "faultstring": "Invalid JSON path $.Name in policy ExtractJSONVariables."

  2. エラーが発生した Extract Variables ポリシーの XML で、<JSONPath> 要素に設定された JSON パスが障害文字列内で特定されたパス(上記の手順 1)に一致するかを確認します。たとえば、次の Extract Variables ポリシーでは、障害文字列の内容と一致する JSON パス $.Name を指定しています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractJSONVariables">
        <Source>response</Source>
        <JSONPayload>
            <Variable name="name" type="string">
                <JSONPath>$.Name</JSONPath>
            </Variable>
        </JSONPayload>
       <VariablePrefix>employee</VariablePrefix>
    </ExtractVariables>
    
  3. <Source> 要素を調べて、変数の抽出元の JSON ペイロードを特定します。たとえば、<Source> 要素が request に設定されている場合、ポリシーによりリクエスト オブジェクトから JSON ペイロードが抽出されます。response に設定されている場合は、それがレスポンス オブジェクトになります。

    上記の Extract Variables ポリシーの例では、<Source> 要素が response に設定されているため、レスポンスの JSON ペイロードから変数が抽出されています。

    <Source>response</Source>

  4. 該当する JSON ペイロード(手順 3 で特定)を調べて、<JSONPath> 要素に指定されているオブジェクトが存在するかどうかを確認します。JSON ペイロードがそのオブジェクトを持たない場合は、それがエラーの原因です。

    たとえば、次の JSON レスポンス ペイロードから変数を抽出するとします。

    {
      "firstName":"John",
      "lastName":"Doe",
      "city":"San Jose",
      "state":"CA"
    }
    

    JSON レスポンス ペイロードには Name オブジェクトがないため、Extract Variables ポリシーはエラーコード(steps.extractvariables.InvalidJSONPath)のエラーとなります。

解決策

変数を抽出する JSON ペイロードに含まれるオブジェクトのみを Extract Variables ポリシーの <JSONPath> 要素に指定します。

上記の Extract Variables ポリシーの例を修正するには、<JSONPath> 要素を変更して、サンプルの JSON レスポンス ペイロードで使用できるオブジェクトを指定します(たとえば、firstNamelastName オブジェクトは有効です)。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables name="ExtractJSONVariables">
    <Source>response</Source>
    <JSONPayload>
        <Variable name="name" type="string">
           <JSONPath>$.firstName</JSONPath>
        </Variable>
    </JSONPayload>
    <VariablePrefix>employee</VariablePrefix>
</ExtractVariables>

ExecutionFailed

エラーコード

steps.extractvariables.ExecutionFailed

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "Failed to execute the ExtractVariables: [policy_name]",
        "detail": {
            "errorcode": "steps.extractvariables.ExecutionFailed"
        }
    }
}

考えられる原因

このエラーには、次の原因が考えられます。

原因 説明
入力ペイロードがない 入力ペイロード(JSON、XML)が空になっている。
入力が無効か、形式が正しくない ポリシーに渡された入力(JSON、XML など)が無効か、不正な形式になっている。

原因: 入力ペイロードがない

Extract Variables ポリシーで JSON または XML ペイロードから変数を抽出するときに、<Source> 要素で指定された変数のコンテンツ(ペイロード)が空の場合、このエラーが発生します。

たとえば、Extract Variables ポリシーの <Source> 要素が request または response に設定され、JSON または XML のペイロードが含まれるものの、ペイロードが空の場合、エラーが発生します。

診断

  1. エラーが発生した Extract Variables ポリシーを特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次の faultstring では、ExtractJSONVariables がポリシー名です。

    "faultstring": "Failed to execute the ExtractVariables: ExtractXMLVariables"

  2. エラーが発生した Extract Variables の XML で <Source> 要素を調べて、変数の抽出元の入力タイプを特定します。たとえば、次の Extract Variables ポリシーでは、<Source> 要素が response に設定されており、XML ペイロードから変数が抽出されています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="ExtractXMLVariables" async="false" continueOnError="false" enabled="true">
        <XMLPayload>
            <Namespaces/>
            <Variable name="City" type="string">
                <XPath>/city</XPath>
            </Variable>
        </XMLPayload>
        <Source clearPayload="false">response</Source>
    </ExtractVariables>
    
    
  3. Extract Variables ポリシーで解析される入力が空かどうか確認します。入力が空であれば、これがエラーの原因です。

    上記の Extract Variables ポリシーの例では、バックエンド サーバーから送信されたレスポンス ペイロード(レスポンスの本文)が空になっています。

    XML レスポンスのペイロードが空であるため、次のエラーコードを受け取ります。

    steps.extractvariables.ExecutionFailed

    このエラーは、<Source> 要素が request に設定されているにもかかわらず、API プロキシ リクエストでペイロードが渡されない場合にも発生することがあります。次に例を示します。

    curl -v "http://$EXTERNAL_IP/v1/testevexecutionfailed" -H "Content-Type: application/xml"
    

    ここで、$EXTERNAL_IP は、外部ロードバランサの IP アドレスです。この IP アドレスはインターネットに公開されます。詳細については、アクセス ルーティングをカスタマイズするをご覧ください。

    Extract Variables ポリシーは、メッセージの Content-Type ヘッダーが application/xmltext/xmlapplication/*+xml の場合にのみ、XML 抽出を実行します。Extract Variables ポリシーで XML リクエスト ペイロードを解析する場合は、Content-Type ヘッダーを application/xmltext/xml、または application/*+xml として渡す必要があります。

解決策

Extract Variables ポリシーに渡された入力が有効で、空になっていないかを確認します。

上記の Extract Variables ポリシーの例を修正するには、有効な XML ペイロードを渡します。次に例を示します。

  1. 次の内容のファイルを city.xml という名前で作成します。

    <city>Bengaluru</city>
    <area>Sanjaynagar</area>
    
  2. 次の cURL コマンドを使用して API を呼び出します。

    curl -v "http://$EXTERNAL_IP/v1/testevexecutionfailed" -H "Content-Type: application/xml" -X POST -d @city.xml
    
    

    ここで、$EXTERNAL_IP は、外部ロードバランサの IP アドレスです。この IP アドレスはインターネットに公開されます。詳細については、アクセス ルーティングをカスタマイズするをご覧ください。

原因: 入力が無効であるか形式が正しくない

Extract Variables ポリシーが無効または不正な形式の入力を解析すると、このエラーが発生します。

たとえば、入力として次の無効な JSON を Extract Variables ポリシーに渡すと、このエラーが発生します。

[
    "args": ["name" : "amar" ]
]

診断

  1. エラーが発生した Extract Variables ポリシーを特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次の faultstring では、ポリシー名は ExtractJSONVariables です。

    "faultstring": "Failed to execute the ExtractVariables: ExtractJSONVariables"

  2. エラーが発生した Extract Variables の XML で <Source> 要素を調べて、変数の抽出元の入力タイプを特定します。たとえば、次の Extract Variables ポリシーでは、<Source> 要素が request に設定されており、JSON ペイロードから変数が抽出されています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="ExtractJSONVariables" async="false" continueOnError="false" enabled="true">
        <JSONPayload>
            <Variable name="Name" type="string">
                <JSONPath>$.args.name</JSONPath>
            </Variable>
        </JSONPayload>
        <Source clearPayload="false">request</Source>
    </ExtractVariables>
    
    
  3. Extract Variables ポリシーで解析される入力が有効かどうか確認します。入力が無効か不正な形式である場合、それがエラーの原因です。

    上記の Extract Variables ポリシーでは、次の無効な JSON が Extract Variables ポリシーに渡されています。

    [
        "args": ["name" : "amar" ]
    ]
    

    次の API 呼び出しの例は、リクエストがどのように渡されたかを示しています。

    curl -v "http://<$EXTERNAL_IP/v1/testevexecutionfailed" -H "Content-Type: application/json" -X POST -d '[ "args" : ["name" : "amar" ]]'
    

    ここで、$EXTERNAL_IP は、外部ロードバランサの IP アドレスです。この IP アドレスはインターネットに公開されます。詳細については、アクセス ルーティングをカスタマイズするをご覧ください。

    API に渡された JSON ペイロードは、角かっこ([ ])を含む配列が含まれているため無効です。そのため、次のエラーコードを受け取ります。

    steps.extractvariables.ExecutionFailed
    

    このエラーは、<Source> 要素が response に設定されているにもかかわらず、JSON レスポンスのペイロードが無効あるいは不正な形式な場合にも発生します。

解決策

不正な形式でない有効な入力を Extract Variables ポリシーに渡します。

上記の Extract Variables ポリシーの問題を解決するには、次のように有効な JSON ペイロードを渡します。

{
   "args":{
      "name":"amar"
   }
}

UnableToCast

エラーコード

steps.extractvariables.UnableToCast

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "Unable to cast value [value] as [type].",
        "detail": {
            "errorcode": "steps.extractvariables.UnableToCast"
        }
    }
}

原因

このエラーは、Extract Variables ポリシーが抽出された値を変数にキャストできなかった場合に発生します。これは通常、あるデータ型の値を別のデータ型の変数に設定しようとすると発生します。

たとえば、Extract Variable ポリシーで、文字列変数から抽出された値を整数変数に設定しようとすると、このエラーが発生します。

診断

  1. Extract Variables ポリシーがキャストしようとしてエラーになる変数のデータ型を特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次の faultstring ではオブジェクト タイプが BOOLEAN になっています。

    "faultstring":"Unable to cast value 36.231 as BOOLEAN."

  2. 手順 1 で特定された型の変数に値を設定しようとしている Extract Variables ポリシーを特定します。

    たとえば、次の Extract Variables ポリシーでは、JSON パス $.latitude から値 boolean の変数に値を抽出します。これは障害文字列の内容と一致します。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="EV-XML-Name" async="false" continueOnError="false" enabled="true">
        <JSONPayload>
          <Variable name="latitude" type="boolean">
              <JSONPath>$.latitude</JSONPath>
          </Variable>
        </JSONPayload>
        <Source clearPayload="false">response</Source>
    </ExtractVariables>
    
    
  3. 抽出されている値のデータ型を調べます。データ型は、ヘッダー、URI パス、JSON/XML ペイロード、フォーム パラメータ、クエリ パラメータの形式を取ります。

  4. 手順 3 で決定したデータ型とステップ 2 で決定したデータの割り当て先の変数のデータ型が同じであることを確認します。

  5. 割り当て元と割り当て先のデータ型が同じでない場合、これがエラーの原因です。

    上記の Extract Variables ポリシーの例で、次の JSON リクエスト ペイロードがあるとします。

    {
     "latitude":36.2312
    }
    

    <JSONPath>'$.latitude' から抽出される値のデータ型は、データ型 boolean の変数に割り当てられる整数です。

    抽出された値のデータ型と値を割り当てる変数のデータ型が同じではないため、エラーコード steps.extractvariables.UnableToCast を受け取ります。

解決策

抽出された値のデータ型と、コンテンツが割り当てられている変数の型が同じかを確認します。

Extract Variables ポリシーの例を修正するには、変数のタイプを整数に変更する必要があります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables name="EV-XML-Name" async="false" continueOnError="false" enabled="true">
    <JSONPayload>
        <Variable name="latitude" type="integer">
            <JSONPath>$.latitude</JSONPath>
        </Variable>
    </JSONPayload>
    <Source clearPayload="false">response</Source>
</ExtractVariables>

JsonPathParsingFailure

エラーコード

steps.extractvariables.JsonPathParsingFailure

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "ExtractVariables [policy_name]: Json path parsing failed for for flow variables [variable_name]",
        "detail": {
            "errorcode": "steps.extractvariables.JsonPathParsingFailure"
        }
    }
}

原因

このエラーは、Extract Variables ポリシーが JSON パスを解析できず、<Source> 要素で指定されたフロー変数からデータを抽出できない場合に発生します。これは通常、<Source> 要素で指定されたフロー変数が現在のフローに存在しない場合に発生します。

たとえば、Extract Variables ポリシーがレスポンス フローで実行され、JSON パスの解析が行われるにもかかわらず、<Source> 要素でレスポンス フローに存在しないフロー変数 request.content が指定されている場合、このエラーが発生します。

診断

  1. エラーが発生した Extract Variables ポリシーと、データが抽出されていないフロー変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の障害文字列では、ポリシー名は ExtractVariables-1、変数は request.content です。

    "faultstring": "ExtractVariables ExtractJSONVariabes: Json path parsing failed for for flow variables request.content"

  2. 失敗した Extract Variables ポリシーの XML で、<Source> 要素に設定された変数名が、障害文字列で特定された変数名(上記の手順 1)に一致していることを確認します。たとえば、次の Extract Variables ポリシーでは、faultstring の内容と一致する request.content という名前の変数が指定されています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="ExtractJSONVariables" async="false" continueOnError="false" enabled="true">
        <JSONPayload>
            <Variable name="Name" type="string">
                <JSONPath>$.args.name</JSONPath>
            </Variable>
        </JSONPayload>
        <Source clearPayload="false">request.content</Source>
    </ExtractVariables>
    
    
  3. <Source> 要素で使用される変数が定義されていて、Extract Variables ポリシーが実行されるフローで使用できることを確認します。

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

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

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

    たとえば、上記の Extract Variables ポリシーがレスポンス フローで実行されるとします。フロー変数 request.content は、Extract Variables ポリシーの <Source> 要素で使用されています。フロー変数 request.content は、リクエスト フローでのみ使用できます。

    response 変数はリクエスト フローに存在しないため、次のエラーコードを受け取ります。steps.extractvariables.JsonPathParsingFailure

解決策

Extract Variables ポリシーの <Source> 要素で使用されているフロー変数が、Extract Variables ポリシーが実行されるフローで使用できるかを確認します。

たとえば、response.content という名前の変数がレスポンス フローに存在し、抽出する JSON が実際に含まれているとします。上記の Extract Variables ポリシーを修正するには、次のように <Source> 要素を変更します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables name="ExtractJSONVariables" async="false" continueOnError="false" enabled="true">
    <JSONPayload>
        <Variable name="Name" type="string">
            <JSONPath>$.args.name</JSONPath>
        </Variable>
    </JSONPayload>
    <Source clearPayload="false">response.content</Source>
</ExtractVariables>