🔥

[Azure] API managementにおけるポリシー編集を試してみた

2024/03/31に公開

概要

API Management(以下、APIM)は、APIのゲートウェイであり公開・利用制限・保護・分析などの管理ツールである。
ポリシーを使った細かい制御が実現可能なため、一例をあげて試してみる。

試してみたこと

APIMがPostでの受付のみしているところに、GETリクエストを実施する。
デフォルトでは、メソッド誤りは404が返却されるが、レスポンスを上書きすることで405を返すようにしてみる。

環境構成

APIMと、バックエンドにAzure Functionsを準備する。
正常にリクエストを送信すれば200が返ってくる。

ポリシー

以下を設定した。Operationではなく、より上位のAPIやAll Productsで設定する必要がある。少なくともOperationレベルで設定したときにはポリシーが効かなかった。

    <on-error>
        <base />
        <choose>
            <when condition="@(context.LastError.Source == "configuration" && context.LastError.Reason == "OperationNotFound")">
                <return-response>
                    <set-status code="405" reason="method not allowed" />
                </return-response>
            </when>
        </choose>
    </on-error>

参考

https://stackoverflow.com/questions/66121750/can-i-force-azure-api-management-to-return-400-instead-of-404-when-missing-requi

https://learn.microsoft.com/en-us/answers/questions/1219869/apim-policy-not-able-to-return-custom-response-for

ポリシーの解説

  • 条件分岐をchoose-when文で実現する。
  • conditionの条件文は、組み込みの手順向けの定義済みエラーを参照した。
  • 今回は検証のため、statusの上書きのみを実施したが、ヘッダーやボディの上書きを行う場合には、set-headerset-bodyを参照する。
  • on-errorブロックについては、リクエストの処理中にエラーが発生したときに行う処理を定義した箇所である。168ページ目

ポリシーの設定場所の注意点

今回の要件は、API Managementが返すステータスの上書きになる。
Inbound processingに設定すると、バックエンドからの返却ステータスの上書きになる。そのため、バックエンドに到達することが前提のポリシー設定になる。

Inboundに設定した時のポリシー
<policies>
    <inbound>
        <base />
        <choose>
            <when condition="@(context.Request.Method != "POST")">
                <return-response>
                    <set-status code="405" reason="Method Not Allowed" />
                </return-response>
            </when>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

リクエストをしてみての確認

ステータスが上書きされた状態で返ってきた。問題なくポリシーが定義しているようである。
alt text

Discussion