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

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

RequestVariableNotMessageType

エラーコード

steps.servicecallout.RequestVariableNotMessageType

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "ServiceCallout[POLICY_NAME]: request variable [VARIABLE_NAME] value is not of type Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotMessageType"
        }
    }
}

原因

このエラーは、ServiceCallout ポリシー<Request> 要素で指定された変数が message 型でない場合に発生します。変数が文字列か、message 型以外の場合、このエラーが発生します。

message 型の変数は HTTP リクエストとレスポンス全体を表します。組み込みフロー変数 requestresponsemessagemessage 型です。

診断

  1. エラーが発生した ServiceCallout ポリシーと、間違った型の変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の faultstring では、ExecuteGeocodingRequest がポリシー名、PostalCode が変数です。

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"

  2. エラーが発生した ServiceCallout ポリシーの XML で、<Request> 要素に設定された変数の名前が障害文字列内で特定された変数名(上記の手順 1)に一致していることを確認します。たとえば、次のポリシーで指定されているリクエスト変数 PostalCode は、faultstring の内容と一致しています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="PostalCode"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    
  3. この変数が message 型のものであるかどうかを判定します。

    1. API プロキシ バンドルで、最初にその変数が定義されたコードを特定します。
    2. 多くの場合、問題の変数は ServiceCallout ポリシーの前に実行される別のポリシーで作成され、設定されています。たとえば、変数の作成と API プロキシフローへの設定によく使用されるのは AssignMessage ポリシーです。
    3. その変数が最初に定義されて値が取り込まれるポリシーを特定したら、次のようにして変数の型を特定する必要があります。
      • type 属性の値を確認します(存在する場合)。
      • type 属性が存在しない場合、その変数は文字列とみなされます。
    4. 変数の型が message 以外(文字列など)の場合、それがエラーの原因です。よく使われる変数とその型については、フロー変数のリファレンスをご覧ください。

たとえば、ServiceCallout ポリシーで参照される PostalCode 変数が次の AssignMessage ポリシーで作成されたとします。PostalCode にはフロー変数 request.queryparam.postalcode の値が割り当てられます。この値は、変数の割り当てに type 属性が存在しないため文字列です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
        <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
    <Set>
        <QueryParams>
            <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
            <QueryParam name="region">{request.queryparam.country}</QueryParam>
            <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
        <Verb>GET</Verb>
    </Set>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Ref>request.queryparam.postalcode</Ref>
    </AssignVariable>
    <AssignVariable>
        <Name>Country</Name>
        <Ref>request.queryparam.country</Ref>
    </AssignVariable>
</AssignMessage>

PostalCode 変数は ServiceCallout ポリシー<Request> 要素で使われていることに注意してください。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="PostalCode"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

PostalCode は message 型ではないため(この例では文字列)、次のエラーコードが表示されます。steps.servicecallout.RequestVariableNotMessageType

解決策

失敗した ServiceCallout ポリシーの <Request> 要素に設定された変数が存在する message 型のフロー変数であることを確認するか、新しい message 型の変数を ServiceCallout ポリシーで直接作成(ServiceCallout ポリシーで説明)し、その変数を使用します。

ポリシーを修正するには、既存または新しい message 型の変数を <Request> 要素に指定する必要があります。たとえば、AssignMessage ポリシーに設定されている GeocodingRequest 変数が message 型の場合、ServiceCallout ポリシーでエラーが発生しなくなります。次に例を示します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

RequestVariableNotRequestMessageType

エラーコード

steps.servicecallout.RequestVariableNotRequestMessageType

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType"
        }
    }
}

原因

このエラーは、ServiceCallout ポリシー<Request> 要素で指定された変数が message 型でない場合に発生します。変数が、response message、文字列、またはそれ以外の型の場合、このエラーが表示されます。

message 型変数は、HTTP リクエストとレスポンス全体を表します。組み込みフロー変数 requestresponsemessagemessage 型です。

診断

  1. エラーが発生した ServiceCallout ポリシーと、間違った型の変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の faultstring では、ExecuteGeocodingRequest がポリシー名、var_response が変数です。

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"

  2. エラーが発生した ServiceCallout ポリシーの XML で、<Request> 要素に設定された変数の名前が障害文字列内で特定された変数名(上記の手順 1)に一致していることを確認します。たとえば、次のポリシーで指定されているリクエスト変数 var_response は、faultstring の内容と一致しています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="var_response"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    
  3. 変数が request message 型かどうかを判別します。

    1. API プロキシ バンドルで、最初にその変数が定義されたコードを特定します。
    2. 多くの場合、問題の変数は ServiceCallout ポリシーの前に実行される別のポリシーで作成され、設定されています。たとえば、変数の作成と API プロキシフローへの設定によく使用されるのは AssignMessage ポリシーです。
    3. その変数が最初に定義されて値が取り込まれるポリシーを特定したら、次のようにして変数の型を特定する必要があります。
      • type 属性の値を確認します(存在する場合)。
      • type 属性が存在しない場合、その変数は文字列とみなされます。
    4. 変数が request message 型でない場合、これがエラーの原因です。よく使われる変数とその型については、フロー変数のリファレンスをご覧ください。

たとえば、ServiceCallout ポリシーで参照される var_response 変数が次の AssignMessage ポリシーで作成されたとします。var_response には response 型が指定されています。したがって、var_response 変数の型は response message です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
        <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
    <AssignTo createNew="true" type="response">var_response</AssignTo>
    <Set>
        <QueryParams>
            <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
            <QueryParam name="region">{request.queryparam.country}</QueryParam>
            <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
        <Verb>GET</Verb>
    </Set>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Ref>request.queryparam.postalcode</Ref>
    </AssignVariable>
    <AssignVariable>
        <Name>Country</Name>
        <Ref>request.queryparam.country</Ref>
    </AssignVariable>
</AssignMessage>

前述のとおり、var_response 変数は ServiceCallout ポリシーの <Request> 要素で使用されています。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="var_response"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

var_response は request message 型ではないため(この例では response message 型)、次のエラーコードが表示されます。steps.servicecallout.RequestVariableNotRequestMessageType

解決策

失敗した ServiceCallout ポリシーの <Request> 要素に設定された変数が存在する message 型の変数であることを確認するか、新しい request message 型の変数を ServiceCallout ポリシーで直接作成(ServiceCallout ポリシーで説明)し、その変数を使用します。

ポリシーを修正するには、既存または新しい request message 型の変数を <Request> 要素に指定します。これで、ServiceCallout ポリシーの問題が解決します。次に例を示します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

ExecutionFailed

エラーコード

steps.servicecallout.ExecutionFailed

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

または

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

考えられる原因

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

原因 説明
URL が無効か、形式が正しくありません ServiceCallout ポリシーのターゲット URL の形式に誤りがあるか、到達可能なホスト名を参照していません。
バックエンド サーバーのエラー バックエンド サーバーがエラー レスポンス 4XX または 5XX を返します。

原因: URL が無効か、形式が正しくない

ServiceCallout ポリシーのターゲット URL の形式に誤りがあるか、到達可能なホスト名を参照していません。

診断

  1. エラーの原因となった ServiceCallout ポリシーを特定します。ポリシー名は、エラー レスポンスの faultstring 要素で確認できます。たとえば、次の faultstring では、ExecuteGeocodingRequest が問題の ServiceCallout ポリシーの名前です。

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. エラーのある ServiceCallout ポリシーで、<URL> 要素を調べます。形式に誤りがあるか、無効または到達不能なホスト名が参照されている場合、これがエラーの原因です。たとえば、次の ServiceCallout ポリシーには無効な <URL> が指定されています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="GeocodingRequest"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    

    <URL> 要素にプロトコル http:// のみが設定され、有効なホスト名が指定されていません。そのため、ServiceCallout ポリシーで次のエラーが発生します。Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable

解決策

エラーが発生した ServiceCallout ポリシーの <URL> 要素に、到達可能なホスト名を含む有効な URL を設定します。

上記の ServiceCallout ポリシーを修正するには、次のような有効な URL を <URL> 要素に指定します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

原因: バックエンド サーバーのエラー

バックエンド サーバーがエラー レスポンス 4XX または 5XX を返します。

診断

  1. エラーの原因となった ServiceCallout ポリシーを特定します。ポリシー名は、エラー レスポンスの faultstring 要素で確認できます。たとえば、次の faultstring では、ExecuteGeocodingRequest が問題の ServiceCallout ポリシーの名です。

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. エラー メッセージの本文にある faultstring で、Reason に 4XX または 5XX レスポンス コードが含まれているかどうか確認します。たとえば、次の faultstring では、バックエンド サーバーからレスポンス コード 502 が返されています。

    "faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"

解決策

エラー レスポンス コードを特定すると、4XX や 5XX エラーの場合と同じように、問題のトラブルシューティングを行えます。