BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

GitHub Actions で Azure API Management の CI/CD (ASP.NET Core 6)

Azure API Management の裏に Web API があると、Web API の CI/CD と一緒に API Management の APIs も更新したいですよね。

公式ドキュメント ではめんどくさそうな実現方法が書かれていますが、APIs だけ更新したいなら Azure CLI で実現するのがシンプルでよいと思っています。

今回は ASP.NET Core 6 の Web API でやりますが Open API のファイルを出力できるならどれでも一緒です。GitHub Actions でのざっくりな流れは以下です。

  • Web API をビルド時に Open API (Swagger) の定義ファイルを出力する
  • Web API をデプロイする
  • Open API (Swagger) の定義ファイルをもとに API Management の APIs を更新する

az apim api import を使うときに知っておきたいこと

Azure API Management の APIs の更新は Azure CLI でやります。

使うコマンドのドキュメントは以下です。ドキュメント通りにコマンドを実行すればよいだけに見えて説明が薄く闇深いので、気になる点を書いていきます。

az apim api import (az apim api) | Microsoft Learn

az apim api import の使い方と闇

APIM の APIs を更新したい場合は、先述のドキュメントで書かれている必須のパラメーター4つの他に、最低限必要なものがあります。

※ ちなみにこれは2022年10月現在の状況なのでバグだったら直るかもしれません。

  • --api-id : 名称通り APIs のユニークな ID です。指定しないと毎回ランダムな値がセットされてしまいます 。つまり別の APIs ができることになる。そして既存の APIs の"path" が重複していると怒られる。同じ APIs を更新する際は事実上必須です。
  • --display-name: セットしないと更新時に "MY API" に書き換えられるため事実上必須と言ってよいでしょう (これはバグな気がする) 。
  • --service-url: セットしないと更新時に空になるので事実上必須です (これはバグな気がする) 。

それぞれのパラメーターが Azure Portal の APIM のリソース (APIs → 対象の API をクリック → Settings タブ) でどれにあたるかを補足しておくとこんな感じです。

パラメーター Azure Portal での値
--display-name Display name (①)
--api-id Name (②)
--service-url Web service URL (③)
--path API URL suffix (④)
--service-name API Management のリソース名

他のオプショナルなパラメーターは必要に応じてつける感じです。

ローカルでコマンドを実行するサンプル

前置きが長くて集中力が低めの私ですが、先述の内容を加味してコマンドのフォーマットは以下です。

az apim api import --resource-group <RESOURCE GROUP> --service-name <APIM SERVICE NAME> --display-name <DISPLAY NAME> --api-id <NAME> --service-url <SERVICE URL> --path <API URL SUFFIX> --specification-format OpenApiJson --specification-path <FILE PATH>

実行の例はこんな感じ。

前提知識: GitHub Actions 実行前に知ってきたい基礎

もう GitHub Actions で動かしたいお気持ちですが、最低限 ? 知っておかなあかん前提知識を2つあげます。

1つ目: CI 時に ASP.NET Core 6 で OpenAPI の定義ファイルを出力

これを書くと長くなるので前々回のブログにまとめました。

blog.beachside.dev

2つ目: GitHub Actions での Azure へのログインは OIDC

昨年 OIDC がサポートされてからは、基本的に OIDC でのログインがベストプラクティスです。ということでここも一緒に書くと長くなりそうだったので前回のブログに書きました。

blog.beachside.dev

GitHub Actions での実行

事前に以下の2つがやってある前提で話を進めます。

  • "前提知識" の "2つ目: GitHub Actions で Azure へのログイン" で示した OIDC の設定。
  • デプロイ先の API Management と Web App のリソースの作成が作成。

YAML のサンプル

コアな部分は先述で書いているので説明は省きますが、シンプルに組み合わせた基本的なコードです。

※ 14 - 25行目の env 定義は私の環境のものなので各々で試すときは変更が必要です。

この YAML での注意点

シンプルなサンプルなので、プロダクションで利用するにあたり考慮してない点をいくつか書いておきます。

  • 本質からちょっと脱線する Web API は build 時に zip した方が速くね?とか Service URL は動的にとってきた方がいんじゃねとかそういう最適化も行ってないです。Web App のデプロイ時に Blue/Green デプロイするとか、要所で Environment 使って承認をさせるとかはもちろん触れてません。
  • APIM の APIs を作成するときの subscription とかの考慮もしてないです。

参考