非標準のバックエンドレスポンスを、クライアントが期待するエラー形式にマッピングします。
1. 概要
このプラグインを使用して、バックエンドのエラーレスポンスをクライアントが期待する形式に変換します。
2. はじめに
次の例では、バックエンドは HTTP 200 レスポンスを返しますが、レスポンスボディの JSON フィールドにエラーメッセージが含まれています。
HTTP 200 OK
Content-Type:application/json
{"req_msg_id":"d02afa56394f4588832bed46614e1772","result_code":"ROLE_NOT_EXISTS"}
-
このシナリオでは、クライアントは 200 以外のレスポンスを期待しているため、バックエンドを変更せずにこのレスポンスを返す必要があります。
HTTP 404
X-Ca-Error-Message: Role Not Exists, ResultId=d02afa56394f4588832bed46614e1772
これに対応するには、エラーコードマッピングプラグインを次のように設定します。
---
# マッピングに関連するフィールド
parameters:
statusCode: "StatusCode"
resultCode: "BodyJsonField:$.result_code"
resultId: "BodyJsonField:$.req_msg_id"
# マッピング条件
errorCondition: "$statusCode = 200 and $resultCode <> 'OK'"
# エラーコードフィールド
errorCode: "resultCode"
# マッピング項目
mappings:
- code: "ROLE_NOT_EXISTS"
statusCode: 404
errorMessage: "Role Not Exists, RequestId=${resultId}"
- code: "INVALID_PARAMETER"
statusCode: 400
errorMessage: "Invalid Parameter, RequestId=${resultId}"
# デフォルトマッピング (オプション)
defaultMapping:
statusCode: 500
errorMessage: "Unknown Error, ${resultCode}, RequestId=${resultId}"
この例では、マッピング条件はバックエンドのレスポンスコードと JSON レスポンスボディの result_code フィールドに基づいています。バックエンドのレスポンスコードが 200 で、かつ result_code フィールドが 'OK' でない場合に、エラーコードマッピングがトリガーされます。result_code フィールドの値がマッピングのエラーコードとして使用されます。2 つのエラーコードが設定されています。ROLE_NOT_EXISTS はクライアントに 404 レスポンスを返し、INVALID_PARAMETER は 400 レスポンスを返します。それ以外のすべてのエラーコードは 500 レスポンスを返します。
3. プラグイン設定とマッピングルール
3.1. プラグイン設定
エラーコードマッピングプラグインは json または yaml 形式で設定します。設定フィールドは次のとおりです。
-
parameters(必須):マッピングに使用されるパラメーターです。これらのパラメーターはマップとして設定されます。詳細については、「パラメーターと条件式の使用」をご参照ください。 -
errorCondition(必須):レスポンスがエラーであるかどうかを判断する条件式です。式がtrueと評価された場合、マッピングが実行されます。 -
errorCode(オプション):エラーコードを提供するパラメーターを指定します。このパラメーターの値は、mappingsリスト内のcodeフィールドとの照合に使用されます。 -
mappings(必須):マッピングレコードのリストです。ゲートウェイは、エラーコードまたはエラー条件に一致するレコードに基づいてレスポンスを再構築します。フィールドは次のとおりです。-
code(オプション):一意の識別子です。このパラメーターを設定する場合、errorCodeパラメーターは必須です。errorCodeパラメーターの値がこのcodeパラメーターの値と一致する場合、現在のマッピングレコードが実行されます。 -
condition(オプション):エラー条件式です。式がtrueと評価された場合、現在のマッピングレコードが実行されます。 -
statusCode(必須):現在のマッピングレコードの HTTP ステータスコードです。 -
errorMessage(オプション):現在のマッピングレコードのエラーメッセージです。このメッセージはX-Ca-Error-MessageレスポンスヘッダーとログのerrorMessageフィールドに表示されます。 -
responseHeaders(オプション):現在のマッピングレコードのレスポンスヘッダーです。マップとして設定します。 -
responseBody(オプション):現在のマッピングレコードで、元のレスポンスボディを上書きするレスポンスボディです。
-
-
defaultMapping(オプション):デフォルトのマッピングレコードです。mappings内に一致するレコードがない場合、このレコードがレスポンスとして使用されます。-
statusCode(必須):現在のマッピングレコードの HTTP ステータスコードです。 -
errorMessage(オプション):現在のマッピングレコードのエラーメッセージです。このメッセージはX-Ca-Error-MessageレスポンスヘッダーとログのerrorMessageフィールドに表示されます。 -
responseHeaders(オプション):現在のマッピングレコードのレスポンスヘッダーです。マップとして設定します。 -
responseBody(オプション):現在のマッピングレコードで、元のレスポンスボディを上書きするレスポンスボディです。
-
設定ルール:
-
mappingConditionとmappings[].conditionの条件式で使用されるパラメーターは、parametersフィールドで定義する必要があります。定義されていない場合、エラーが発生します。パラメーターの定義と条件式の詳細については、「パラメーターと条件式の使用」をご参照ください。 -
errorCodeフィールドで使用されるパラメーターは、parametersで定義する必要があります。 -
mappingsリストの各レコードには、codeまたはconditionのいずれかを設定する必要があります。codeを設定する場合、その値はリスト内で一意である必要があります。conditionを設定する場合、レコードはリストの順序で評価されます。最初に一致したレコードが実行されます。 -
errorMessageとresponseBodyでは、"${Code}: ${Message}"のようなテンプレート形式を使用して変数を置換できます。パラメーターの値は、parametersの設定によって抽出された値が使用されます。 -
responseHeadersの値も、テンプレート置換のために${Message}形式を使用できます。 -
responseBodyが設定されていない場合、バックエンドのレスポンスボディはパススルーされます。 -
responseHeadersが設定されていない場合、バックエンドのレスポンスヘッダーはパススルーされます。設定されている場合、設定したキーと値のペアがバックエンドのレスポンスヘッダーを上書きします。値が''に設定されている場合、対応するヘッダーは削除されます。 -
defaultMappingが設定されていない場合、バックエンドのレスポンスはエラーコードマッピングなしでパススルーされます。
3.2. マッピングパラメーター
マッピングパラメーターは、parameters フィールドにキーと値のペアとして設定します。キーは変数名で、値は Location:Name 形式を使用して、レスポンスまたはシステムコンテキストの特定の場所から値を取得します。
---
# マッピングに関連するフィールド
parameters:
statusCode: "StatusCode"
resultCode: "BodyJsonField:$.result_code"
resultId: "BodyJsonField:$.req_msg_id"
エラーコードマッピングでは、次の場所が利用できます。詳細については、「パラメーターと条件式の使用」をご参照ください。
|
場所名 |
スコープ |
説明 |
|
StatusCode |
レスポンス |
バックエンドからの HTTP レスポンスコード ( |
|
ErrorCode |
レスポンス |
API Gateway のシステムエラーコードです。 |
|
ErrorMessage |
レスポンス |
API Gateway のシステムエラーメッセージです。 |
|
Header |
レスポンス |
|
|
BodyJsonField |
レスポンス* |
|
|
System |
レスポンス |
|
|
Token |
レスポンス |
|
-
ErrorCodeとErrorMessageを使用すると、API Gateway のシステムエラーコードとメッセージを取得できます。詳細については、「エラーコード表」をご参照ください。 -
BodyJsonFieldを使用すると、JSONPath を使用してバックエンドの JSON レスポンスから値を抽出できます。ただし、バックエンドのレスポンスボディが 15,360 バイト を超えると、このパラメーターでは値を抽出できず、nullが返されます。
3.3. 実行ルール
エラーコードマッピングプラグインは、次の順序で実行されます。
-
プラグインは、
parametersに設定されたパラメーターリストに基づいて、レスポンスとシステムコンテキストから現在のパラメーター値を取得します。 -
プラグインは、ステップ 1 のパラメーター値を使用して、
errorConditionに設定された条件式を実行します。式がtrueと評価された場合、処理は続行されます。falseと評価された場合、プラグインは停止し、マッピングは実行されません。 -
errorCodeパラメーターが設定されている場合、プラグインはその値を取得し、mappings内でcodeの値が一致するマッピングレコードを検索します。 -
ステップ 3 で一致するレコードが見つからない場合、プラグインは
mappings内の各マッピングレコードのconditionを、一致が見つかるまで順次評価します。 -
ステップ 3 または 4 でマッピングレコードが一致した場合、ゲートウェイはそのレコードの設定に基づいて新しいレスポンスを構築します。それ以外の場合、
defaultMappingが設定されていればその設定に基づいてレスポンスを構築し、設定されていなければ元のレスポンスをパススルーします。
3.4. システムエラーのマッピングとログ
-
API Gateway のシステムエラーは、ゲートウェイのチェック、検証、スロットリング、プラグイン処理中に発生する可能性があります。
ErrorCodeパラメーターを使用して、これらのシステムエラーコードをマッピングできます。たとえば、スロットリングによって発生した 429 レスポンスを、200 レスポンスしかサポートしていないクライアント向けに 200 レスポンスへマッピングできます。システムエラーコードのリストについては、「エラーコード表」をご参照ください。 -
システムエラーが発生した場合、
StatusCode、Header、BodyJsonFieldなど、レスポンスから取得されるパラメーターの値はnullになります。条件式を作成する際にはこの点に留意してください。システムエラーが発生しない場合、ErrorCodeの場所から取得される値はOKです。 -
API Gateway のシステムエラーコードは、
X-Ca-Error-Codeレスポンスヘッダーに表示され、ログのerrorCodeフィールドに記録されます。エラーコードマッピングプラグインは、この値を上書きしません。 -
ログの
statusCodeフィールドには、ゲートウェイがクライアントに返すレスポンスコードが記録されます。エラーコードマッピングプラグインは、この値を上書きできます。
4. 設定例
4.1. ボディエラーコードのマッピング
マッピング
---
# マッピングに関連するフィールド
parameters:
statusCode: "StatusCode"
resultCode: "BodyJsonField:$.result_code"
resultId: "BodyJsonField:$.req_msg_id"
# マッピング条件
errorCondition: "$statusCode = 200 and $resultCode <> 'OK'"
# エラーコードフィールド
errorCode: "resultCode"
# マッピング項目
mappings:
- code: "ROLE_NOT_EXISTS"
statusCode: 404
errorMessage: "Role Not Exists, RequestId=${resultId}"
- code: "INVALID_PARAMETER"
statusCode: 400
errorMessage: "Invalid Parameter, RequestId=${resultId}"
# デフォルトマッピング (オプション)
defaultMapping:
statusCode: 500
errorMessage: "Unknown Error, ${resultCode}, RequestId=${resultId}"
4.2. レスポンスボディのマッピング
#
# この例では、カスタム JSON エラーボディをフロントエンドに返します。
---
# マッピングパラメーターの指定
parameters:
statusCode: "StatusCode"
resultCode: "Header:X-Ca-Error-Code"
requestId: "Header:X-Ca-Request-Id"
errorMessage: "Header:X-Ca-Error-Message"
# マッピング条件
errorCondition: "$statusCode != 200"
# エラーコードフィールド
errorCode: "resultCode"
# マッピング項目
mappings:
- code: "I400MH"
statusCode: 200
responseHeaders:
Content-Type: "application/json"
X-Ca-Error-Message: ""
X-Ca-Error-Code: ""
responseBody: |
{
"code":"89",
"message":"${errorMessage}",
"resultCode":"${resultCode}"
}
5. 制限
-
最大 16 個のパラメーターを定義できます。
-
各式の最大文字数は 512 文字です。
-
BodyJsonFieldを使用する場合、レスポンスボディは 15,360 バイト に制限されます。ボディがこのサイズを超えると、null 値が返されます。 -
プラグイン設定のサイズは 50 KB に制限されます。
-
mappingsでconditionを使用する場合、最大 20 個のマッピングレコードを設定できます。