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

RequestVariableNotMessageType

エラーコード

steps.servicecallout.RequestVariableNotMessageType
    

エラー レスポンスの本文

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

原因

このエラーは、Service Callout ポリシー<Request> 要素にメッセージ型以外の要素が指定されていると発生します。変数が string 型か、メッセージ型以外の場合、このエラーが発生します。

メッセージ型の変数は、HTTP リクエストとレスポンス全体を表します。組み込みの Edge フロー変数 requestresponsemessage は、メッセージ型のものです。メッセージ変数の詳細については、変数リファレンスをご覧ください。

診断

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

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

  2. エラーが発生した Service Callout ポリシーの XML で、<Request> 要素の変数名が手順 1 で特定した変数名と一致しているかどうか確認します。たとえば、次のポリシーで指定されているリクエスト変数 PostalCodefaultstring の内容と一致しています。

    <?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. この変数がメッセージ型のものであるかどうかを判定します。

    1. API プロキシ バンドルのコードで、変数が最初に定義されている場所を探します。
    2. 多くの場合、問題の変数は Service Callout ポリシーの前に実行される別のポリシーで作成され、設定されています。たとえば、変数の作成と API プロキシフローへの設定によく使用されるのは Assign Message ポリシーです。
    3. この変数を最初に定義し、設定しているポリシーを特定したら、次の方法で変数の型を確認します。
      • type 属性が存在する場合は、その値を確認します。
      • type 属性が存在しない場合、その変数は文字列と見なされます。
    4. 変数の型がメッセージ以外(文字列など)の場合、これがエラーの原因です。よく使われる変数と型については、変数リファレンスをご覧ください。

たとえば、Service Callout ポリシーで参照されている PostalCode 変数が次の Assign Message ポリシーで作成されているとします。ここで、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 変数は、Service Callout ポリシーの <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 はメッセージ型ではないため(この例では文字列)、次のエラーコードが表示されます。steps.servicecallout.RequestVariableNotMessageType

解決策

エラーが発生した Service Callout ポリシーの <Request> 要素に、既存のメッセージ型のフロー変数を設定します。あるいは、新しいメッセージ型の変数を Service Callout ポリシーに作成して使用します(作成方法については、ポリシーのドキュメントをご覧ください)。

ポリシーを修正するには、既存または新しいメッセージ型の変数を <Request> 要素に指定します。たとえば、Assign Message ポリシーに設定されている GeocodingRequest 変数がメッセージ型の場合、Service Callout ポリシーでエラーが発生しなくなります。例:

<?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"
            }
        }
    }
    

原因

このエラーは、Service Callout ポリシー<Request> 要素に request message 型以外の変数が指定されていると発生します。変数が response message、string またはそれ以外の型の場合、このエラーが発生します。

メッセージ型の変数には、HTTP リクエストまたはレスポンスの全体が格納されます。組み込みの Edge フロー変数 requestresponsemessage は、メッセージ型のものです。メッセージ変数の詳細については、変数リファレンスをご覧ください。

診断

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

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

  2. エラーが発生した Service Callout ポリシーの XML で、<Request> 要素の変数名が手順 1 で特定した変数名と一致しているかどうか確認します。たとえば、次のポリシーで指定されているリクエスト変数 var_responsefaultstring の内容と一致しています。

    <?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. 多くの場合、問題の変数は Service Callout ポリシーの前に実行される別のポリシーで作成され、設定されています。たとえば、変数の作成と API プロキシフローへの設定によく使用されるのは Assign Message ポリシーです。
    3. この変数を最初に定義し、設定しているポリシーを特定したら、次の方法で変数の型を確認します。
      • type 属性が存在する場合は、その値を確認します。
      • type 属性が存在しない場合、その変数は文字列と見なされます。
    4. 変数が request message 型でない場合、これがエラーの原因です。よく使われる変数と型については、変数リファレンスをご覧ください。

たとえば、Service Callout ポリシーで参照されている var_response 変数が次の Assign Message ポリシーで作成されているとします。ここで、var_responseresponse 型と定義されています。このため、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 変数は、Service Callout ポリシーの <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

解決策

エラーが発生した Service Callout ポリシーの <Request> 要素に、既存の request message 型の変数を設定します。あるいは、新しい request message 型の変数を Service Callout ポリシーに作成して使用します(作成方法については、ポリシーのドキュメントをご覧ください)。

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

<?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 が無効か、形式が正しくない Service Callout ポリシーのターゲット URL の形式に誤りがあるか、到達可能なホスト名を参照していません。
バックエンド サーバーのエラー バックエンド サーバーがエラー レスポンス 4XX または 5XX を返します。

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

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

診断

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

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. エラーのある Service Callout ポリシーで <URL> 要素を調べます。形式に誤りがあるか、無効または到達不能なホスト名が参照されている場合、これがエラーの原因です。たとえば、次の Service Callout ポリシーには無効な <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://)のみが設定され、有効なホスト名が指定されていません。このため、Service Callout ポリシーで次のエラーが発生します。Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable

解決策

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

上記の Service Callout ポリシーを修正するには、次のように有効な 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. エラーが発生した Service Callout ポリシーを特定します。ポリシー名は、エラー レスポンスの faultstring 要素で確認できます。たとえば、次の faultstring では、ExecuteGeocodingRequest が問題の Service Callout ポリシー名です。

    "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 の場合、問題のトラブルシューティングを行います。4XX または 5XX エラーの解決方法については、ランタイム エラー(4XX / 5XX)のハンドブックをご覧ください。