しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Pipelines の Azure Resource Manager 接続は 2 年で期限が切れるので注意

Azure App Service や Azure Functions に対してデプロイする場合には、必ず Service connections に Azure Resource Manager を追加していると思います。

その際は大体が Azure Pipelines から Service Principal を自動生成していると思います。

f:id:shiba-yan:20200117014008p:plain

ここから Service Principal を作成すると、Azure Portal の Azure AD から一覧を確認できます。

Azure Pipelines から作成された Service Principal の名前は組織名 + プロジェクト名 + サブスクリプション ID になるのでわかりやすいです。

f:id:shiba-yan:20200116194320p:plain

重要なのがクライアントシークレットで、Azure Pipelines が作成したものは 2 年の期限付きなので Service connection を追加してから 2 年が経過すると、ログイン出来なくなります。

f:id:shiba-yan:20200116193949p:plain

期限切れの通知などはしてくれないので、Pipeline の実行でエラーになってから気が付くことが多そうです。既に使ってる人は一度確認しておいた方がよいでしょう。

正直このあたりの情報を見た覚えがないので、既存の Service connection の更新方法と期限切れを起こさない Service Principal を作成して設定するまで試しました。

手動でクライアントシークレットを更新する

Service connection の設定には更新する機能は無さそうに見えますが、実は該当する Azure Resource Manager 接続から Edit を選ぶと更新が出来るようになってました。

Edit を選んで表示されるダイアログは、そのまま OK を押せるようになってます。OK を押すと、再度 Azure AD での認証が走るのでログイン画面が表示されるはずです。

f:id:shiba-yan:20200116201127p:plain

しばらくするとダイアログが閉じられるので、その後 Azure AD から Service Principal のクライアントシークレットが更新されたことが確認できます。

f:id:shiba-yan:20200116193959p:plain

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 年後になっています。

f:id:shiba-yan:20200116200847p:plain

あとは Service connection の追加画面から "use the full version of the service connection dialog." というリンクを選ぶと、既存の Service Principal を設定できるダイアログになるので、作成されたクライアント ID とクライアントシークレットを入力します。

設定後は Verify connection を選んで Service Principal のチェックを行っておきます。

f:id:shiba-yan:20200116195752p:plain

追加してしまえば、あとは通常の Service connection と同じように利用できます。YAML の編集時には Task アシスタントで Azure 上のリソース一覧を取得してくれますが、エラーが出ることなく動いてます。

f:id:shiba-yan:20200116200857p:plain

実質無期限のクライアントシークレットを使っているので、最初の設定だけが少し面倒ですが 2 年毎に更新する必要がないので楽です。更新は簡単とはいえ高権限のユーザーが行う必要があるのが少しネックです。

期限が長すぎるのもどうかなと思いますが、シークレットの失効は行えるのでまあ良いかという気持ちです。