API Management のポリシーにおけるエラー処理

適用対象: すべての API Management レベル

ProxyError オブジェクトを指定することで、Azure API Managementは、要求の処理中に発生する可能性があるエラー状態に応答できます。 ProxyError オブジェクトは context.LastError プロパティを通じてアクセスされます。 on-error ポリシー セクションのポリシーでは、ProxyError オブジェクトを使用できます。 この記事では、Azure API Management におけるエラー処理機能向けの参考資料を提供します。

API Management でのエラー処理

Azure API Management のポリシーは、次の例で示すとおり、inboundbackendoutbound、および on-error のセクションに分かれています。

<policies>
    <inbound>
        <!-- statements to be applied to the request go here -->
    </inbound>
    <backend>
        <!-- statements to be applied before the request is
             forwarded to the backend service go here -->
    </backend>
    <outbound>
        <!-- statements to be applied to the response go here -->
    </outbound>
    <on-error>
        <!-- statements to be applied if there is an error
             condition go here -->
    </on-error>
</policies>

要求の処理中、組み込みステップは、要求のスコープ内にあるすべてのポリシーと共に実行されます。 エラーが発生すると、処理は直ちに on-error ポリシー セクションにジャンプします。

on-error ポリシー セクションは、任意のスコープで使用できます。 API パブリッシャーは、エラーをAzure Event Hubsにログに記録したり、呼び出し元に返す新しい応答を作成したりするなどのカスタム動作を構成できます。

既定では、 on-error セクションはポリシーに含まれません。 on-error セクションをポリシーに追加するには、ポリシー エディターで目的のポリシーを参照し、このセクションを追加します。 ポリシーを構成する方法の詳細については、「Azure API Management のポリシー」を参照してください。

on-errorセクションがない場合、エラー状態が発生した場合、呼び出し元は 400 または 500 の HTTP 応答メッセージを受け取ります。

エラー時に許可されるポリシー

次のポリシーは、on-error ポリシー セクションで使用できます。

LastError

エラーが発生し、コントロールが on-error ポリシー セクションにジャンプすると、エラーはコンテキストに格納されます 。LastError プロパティ。 on-error セクションのポリシーは、context.LastErrorにアクセスできます。 LastError には、次のプロパティがあります。

名前 タイプ 内容 必須
Source 文字列 エラーが発生した要素の名前。 ポリシーまたは組み込みパイプライン ステップ名のいずれかになります。 はい
Reason 文字列 エラー処理に使用できる、マシンに適したエラー コード。 いいえ
Message 文字列 人間が判読できるエラーの説明。 はい
Scope 文字列 エラーが発生したスコープの名前。 いいえ
Section 文字列 エラーが発生したセッション名。 使用可能な値: inboundbackendoutbound、または on-error いいえ
Path 文字列 入れ子になったポリシー階層 ( choose[3]\\when[2]など) を指定します。 入れ子になったポリシーの複数のインスタンスのインデックスは 1 から作成されます。 いいえ
PolicyId 文字列 エラーが発生したポリシーの id 属性の値 (顧客が指定した場合) いいえ

ヒント

状態コードには、 context.Response.StatusCodeを使用してアクセスできます。

すべてのポリシーには、ポリシーのルート要素に追加できる、省略可能な id 属性があります。 エラー条件が発生したときにこの属性がポリシーに存在する場合は、 context.LastError.PolicyId プロパティを使用して属性の値を取得できます。

組み込みの手順向けの定義済みエラー

次のエラーは、組み込みの処理手順の評価時に発生する可能性があるエラー条件用に定義されています。

ソース 条件 理由 メッセージ
構成 URI はどの API または操作にも一致しません OperationNotFound 操作に受信要求を一致させることができません。
承認 サブスクリプション キーが指定されていません サブスクリプションキーが見つかりません サブスクリプション キーがないため、アクセスが拒否されました。 この API に要求を行うときは、サブスクリプション キーを指定してください。
承認 サブスクリプション キー値が無効です サブスクリプションキーが無効です サブスクリプション キーが無効なため、アクセスが拒否されました。 アクティブなサブスクリプションへの有効なキーを指定してください。
複数 要求が保留中の間に、クライアントがダウンストリーム接続を (クライアントから API Management ゲートウェイに) 中止しました クライアント接続失敗 複数
複数 バックエンドが中止されたか、アップストリーム接続を確立できませんでした (API Management ゲートウェイからバックエンド サービスへ) バックエンド接続障害 複数
複数 特定の式の評価中にランタイム例外が発生しました 式値評価失敗 複数

ポリシーの定義済みのエラー

次のエラーは、ポリシーの評価時に発生する可能性があるエラー条件用に定義されています。

ソース 条件 理由 メッセージ
レート制限 レート制限を超過 レート制限を超えました レート制限を超過しています。
クォータ クォータを超過しました クォータ超過 呼び出しボリュームのクォータを超過しています。 割り当ては xx:xx:xx 後に再補充されます。 または、帯域幅クォータが超過しました。 クォータは xx:xx:xx に補充されます。
jsonp コールバック パラメーターの値が無効です (不正な文字が含まれています) コールバックパラメーターが無効です コールバック パラメーター {callback-parameter-name} の値が、有効な JavaScript 識別子ではありません。
IPフィルター 要求からの呼び出し元 IP の解析に失敗しました 呼び出し元のIPアドレスの解析に失敗しました 呼び出し元の IP アドレスを確立できませんでした。 アクセスが拒否されました。
IPフィルター 呼び出し元 IP が許可リストにない 発信者のIPが許可されていません 呼び出し元 IP アドレス {ip-address} は許可されていません。 アクセスが拒否されました。
IPフィルター 呼び出し元 IP がブロック リストにあります 発信者のIPがブロックされました 呼び出し元 IP アドレスはブロックされています。 アクセスが拒否されました。
check-header 必須のヘッダーが表示されない、または値がありません ヘッダーが見つかりません 要求にヘッダー {header-name} がありません。 アクセスが拒否されました。
check-header 必須のヘッダーが表示されない、または値がありません ヘッダー値は許可されていません ヘッダー {header-name} の値 {header-value} は許可されていません。 アクセスが拒否されました。
JWTを検証する 要求に JSON Web トークン (JWT) がありません トークンが存在しません JWT not present. (JWT が存在しません。)
JWTを検証する 署名の検証に失敗しました トークン署名が無効です <JWT ライブラリからのメッセージ>。 アクセスが拒否されました。
JWTを検証する 無効なオーディエンス トークンオーディエンスが許可されていません <JWT ライブラリからのメッセージ>。 アクセスが拒否されました。
JWTを検証する 無効な発行者 トークン発行者は許可されていません <JWT ライブラリからのメッセージ>。 アクセスが拒否されました。
JWTを検証する トークンの有効期限が切れています トークンの有効期限が切れました <JWT ライブラリからのメッセージ>。 アクセスが拒否されました。
JWTを検証する 署名キーが ID で解決されませんでした トークン署名キーが見つかりません <JWT ライブラリからのメッセージ>。 アクセスが拒否されました。
JWTを検証する 必要なクレームがトークンにありません トークン請求が見つかりません JWT に次の要求がありません: <c1>、 <c2>、... アクセスが拒否されました。
JWTを検証する クレームの値が一致しません トークンの主張値は許可されていません クレーム {claim-name} の値 {claim-value} は許されていません。 アクセスが拒否されました。
JWTを検証する その他の検証の失敗 JWTが無効 <JWT ライブラリからのメッセージ>
forward-request(フォーム送信)または send-request(リクエスト送信) 構成されたタイムアウト内に HTTP 応答状態コードとヘッダーがバックエンドから受信されなかった タイムアウト 複数

API ポリシーを次の値に設定します。

<policies>
    <inbound>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <set-header name="ErrorSource" exists-action="override">
            <value>@(context.LastError.Source)</value>
        </set-header>
        <set-header name="ErrorReason" exists-action="override">
            <value>@(context.LastError.Reason)</value>
        </set-header>
        <set-header name="ErrorMessage" exists-action="override">
            <value>@(context.LastError.Message)</value>
        </set-header>
        <set-header name="ErrorScope" exists-action="override">
            <value>@(context.LastError.Scope)</value>
        </set-header>
        <set-header name="ErrorSection" exists-action="override">
            <value>@(context.LastError.Section)</value>
        </set-header>
        <set-header name="ErrorPath" exists-action="override">
            <value>@(context.LastError.Path)</value>
        </set-header>
        <set-header name="ErrorPolicyId" exists-action="override">
            <value>@(context.LastError.PolicyId)</value>
        </set-header>
        <set-header name="ErrorStatusCode" exists-action="override">
            <value>@(context.Response.StatusCode.ToString())</value>
        </set-header>
        <base />
    </on-error>
</policies>

承認されていない要求を送信すると、次の応答が返されます。

スクリーンショットは、エラー メッセージを含む例への応答を示しています。

ポリシーに対する処理の詳細については、次のトピックを参照してください。