このエントリは2025/02/14現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容からの解離が発生する可能性があります。
お問い合わせ
いつもの問い合わせ主からAzure API Management (APIM) に関する問い合わせをもらった。
いまAPIMの後ろでAzure Container Apps (ACA) を使ってコンテナーアプリケーションを作っている。このACAがホストするAPIをバックエンドとして、APIMでAPIを公開しているのだが、今度、ACAを2系統用意して、Blue Green deploymentを実現したい。そして切り替えにあたってできるだけ手間を減らしたいと考えている。このとき、APIMでうまく実現する方法があれば教えてほしい。
どうやら以下の配置で、APIMでバックエンドへの振り分けをさせたい、ということのよう。ただ、「できるだけ手間を減らしたい」ということはどういうことか、もう少し話を聞いてみた。

問い合わせ主曰く、
- ふつうにAPIMのバックエンドを指定するとハードコードされてしまうが、これを避けるにはどうしたらよいか。
- API呼び出し時にテスト系(次期本番系)への呼び出しであることを指示(例えばテスト系FQDNへの呼び出しやHTTP Headerでの振り分け)した場合にはテスト系のACA環境、無指定であれば本番系のACA環境にルーティングしたい。もちろん、APIリクエストの宛先FQDNで振り分けてもOK。
- 次期本番系が本番系として稼働開始したら、
- 旧本番系を数日切り戻し目的で残し、問題なければその後削除
- 新たなACA環境を次々期本番系として構成
ということを解決したいらしい。Blue Green Deploymentの前段にあるAPIMで、できる限りスムーズに本番系の切り替えとトラフィックのルーティングをしたい、ということであった。
APIMを使わない場合
よくあるのは、L7 Load Balancerを使った振り分け(Azureの場合ならFront DoorやApplication Gatewayを使う)。例えば複数のカスタムドメインをApplication Gatewayに割り当てて、そのFQDNの違いによって分岐させるとか、APIのリビジョンを付けることで識別するとか、いろいろなやり方が考えられる。APIMはL7 Load Balancerの一つでもあるので、同じような仕組みは構成できるが、どのようなところに注意すべきだろうか。
APIMを使う場合
1. バックエンドの構成
ふつうにAzure PortalでAPIを作成していると、WebサービスURLにバックエンドURLを指定していることが多い。以下はSTv2のインスタンスにサンプルで入っているEcho APIの例だが、Generalで指定されたWebサービスURLが、Backends内のサービスURLに渡されていることがわかる。これだとバックエンドをハードコードしているので、切り替えにあたっては構成済みのポリシーに手を入れる必要があり、手を入れたらテストが必要、といろいろ考慮点が増えてしまう。


そこで有用なのが、set-backend-serviceポリシー。このset-backend-serviceポリシーは、バックエンドのURLを指定することもできるのだが、バックエンドを作成しておき、そのIDで参照させるという、間接参照も可能。
API Management のバックエンド / Backends in API Management
https://learn.microsoft.com/azure/api-management/backends
バックエンド サービスの設定 / Set backend service
https://learn.microsoft.com/azure/api-management/set-backend-service-policy
以下のような設定でbackend-idによる参照ができる。もしURLを書き換える必要があれば、構成済みのポリシーではなく、バックエンドのURLを書き換えるだけ済む(もちろんテストは必要だが、構成済みポリシーに変化はないので、テストケースは少なくてすむ)。
<set-backend-service id="backend-test" backend-id="backend-test" />
バックエンドの構成については以下のエントリが参考になるかもしれない。
もしset-backend-serviceポリシーでbase-urlを指定したいのであれば、名前付き値 (Named values) を使って間接参照するように構成することも可能。
Azure API Management ポリシーで名前付きの値を使用する / Use named values in Azure API Management policies
https://learn.microsoft.com/azure/api-management/api-management-howto-properties
2. トラフィックルーティング
ルーティングのためにはポリシーを構成する必要があるが、例えばカスタムドメインを使ったFQDNであれば本番系、デフォルトドメイン(azure-api.net)を使っていればテスト系にルーティングするのだとすれば、以下のようなポリシー構成で実現できる。
<policies>
<inbound>
<base />
...
<choose>
<when condition="@(context.Request.OriginalUrl.Host.Contains("azure-api.net"))">
<set-backend-service id="backend-test" backend-id="backend-test" />
</when>
<otherwise>
<set-backend-service id="backend-prod" backend-id="backend-prod" />
</otherwise>
</choose>
...
</inbound>
...
</policies>
3. 切り替え
Blue Greenの切り替えはURLの書き換えで実現するが、これはREST APIやPortalから実現できる。以下はPortalからの変更の場合。Runtime URLがBase URLに該当するので、この値を変更する。

REST APIであれば、以下のAPIを使う。
Backend – Update
https://learn.microsoft.com/rest/api/apimanagement/backend/update
PATCHメソッドなので、必要な項目だけ設定した本文を付けて、REST APIを呼び出す。以下は呼び出しの例。
PATCH https://management.azure.com/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup>/providers/Microsoft.ApiManagement/service/<APIM_Instance>/backends/<Backend>?api-version=<REST API Version>
{
"properties": {
"url": "<切り替え後のFQDN>"
}
}