Azure App Service や Azure Functions に対してデプロイする場合には、必ず Service connections に Azure Resource Manager を追加していると思います。
その際は大体が Azure Pipelines から Service Principal を自動生成していると思います。
ここから Service Principal を作成すると、Azure Portal の Azure AD から一覧を確認できます。
Azure Pipelines から作成された Service Principal の名前は組織名 + プロジェクト名 + サブスクリプション ID になるのでわかりやすいです。
重要なのがクライアントシークレットで、Azure Pipelines が作成したものは 2 年の期限付きなので Service connection を追加してから 2 年が経過すると、ログイン出来なくなります。
期限切れの通知などはしてくれないので、Pipeline の実行でエラーになってから気が付くことが多そうです。既に使ってる人は一度確認しておいた方がよいでしょう。
正直このあたりの情報を見た覚えがないので、既存の Service connection の更新方法と期限切れを起こさない Service Principal を作成して設定するまで試しました。
手動でクライアントシークレットを更新する
Service connection の設定には更新する機能は無さそうに見えますが、実は該当する Azure Resource Manager 接続から Edit を選ぶと更新が出来るようになってました。
Edit を選んで表示されるダイアログは、そのまま OK を押せるようになってます。OK を押すと、再度 Azure AD での認証が走るのでログイン画面が表示されるはずです。
しばらくするとダイアログが閉じられるので、その後 Azure AD から Service Principal のクライアントシークレットが更新されたことが確認できます。
Service connection の作成しなおしとは異なるので、既存の設定を壊すことなく更新できるのは良いです。更新日から 2 年間有効ですが、この作業がまた発生すると考えると面倒です。
無期限のクライアントシークレットを使う
Azure Pipelines から Service Principal を作成すると 2 年間のクライアントシークレットが作成されますが、手動の場合は無期限のクライアントシークレットを作成できます。
簡単に Service Principal を作成するのには Azure CLI がおすすめです。1 コマンドで作れます。
無期限という指定はないので、100 年間有効なクライアントシークレットを作成します。Azure CLI を以下のようなコマンドで実行すると作成されます。
az ad sp create-for-rbac -n "azpipeline" --role contributor --years 100
一応 Azure AD の画面から期限を確認しておくと、ちゃんと 100 年後になっています。
あとは Service connection の追加画面から "use the full version of the service connection dialog." というリンクを選ぶと、既存の Service Principal を設定できるダイアログになるので、作成されたクライアント ID とクライアントシークレットを入力します。
設定後は Verify connection を選んで Service Principal のチェックを行っておきます。
追加してしまえば、あとは通常の Service connection と同じように利用できます。YAML の編集時には Task アシスタントで Azure 上のリソース一覧を取得してくれますが、エラーが出ることなく動いてます。
実質無期限のクライアントシークレットを使っているので、最初の設定だけが少し面倒ですが 2 年毎に更新する必要がないので楽です。更新は簡単とはいえ高権限のユーザーが行う必要があるのが少しネックです。
期限が長すぎるのもどうかなと思いますが、シークレットの失効は行えるのでまあ良いかという気持ちです。