Azure Web App Serviceに対してMicrosoft EntraID認証を必須に構成するPowerShellスクリプト
Azure Web App Serviceで認証を構成するのは簡単です。「設定」-「認証」から簡単に設定が行えます。
例えば、Microsoft EntraID認証にしたいのであればIDプロバイダーとして「Microsoft」を選択します。そうすると、テナントの選択やアプリケーションの新規作成まで含めて簡単にGUI上で設定できます。このあたりもどんどん項目が増えて便利になってますね。
ですので、これを使って設定してあげればそれでOKです。
…。でも、私の場合、Azure DevOpsのPipelinesを使って、CI/CDパイプラインの中でWebAppsのリソースの作成自体から認証の構成まですべてコードで全自動でやりたかったのです。
GUIなら1瞬でできることですが、これを実現するだけで丸3日くらいかかってしまいました。色々紆余曲折ありつつ最終的にはうまく行ったのですが、なかなか難しかったです。
苦労した点
Pipeline上のどのタスクを使うか問題
当初はAzure PowerShellを使って構成していました。つまりPipeline上ではAzurePowerShell@5を利用していました。しかし、WebAppに認証を構成する部分のAzure PowerShellでの実装が難しかったです。おそらく直接的にコマンドレットが用意されておらず、仕方がないのでREST APIを呼び出すような形になってしまいました。
でも、それよりはazコマンドのほうが楽に構成できたので途中からAzure CLIの利用に切り替えました。そうすると、Azure PowerShellとAzure CLIの両方を同時に利用する形になってしまい、今度は両方の認証を同時に構成することが難しくなってしまいました。
AzureCLI@2を使えばazコマンドは認証が通った状態なのですが、Azure PowerShellの認証が通っていません。AzurePowerShell@5を使うとAzure PowerShellの認証は通っていますが、azコマンドの認証が通っていません。
両方同時に認証が通るようになんとか頑張ろうとしました。例えば下記のようにやればazコマンドでアクセストークンが取得でき、そのアクセストークンを使ってAzure PowerShellの認証を通すことができます。
例えば下記はうまく動きます。
Install-Module Az
$token = az account get-access-token --resource "https://management.azure.com/" --query "accessToken" -o tsv
$accountID = az account show --query user.name --output tsv
Connect-AzAccount -AccessToken $token -AccountId $accountID
上記をAzureCLI@2のタスクで実行すればはじめからazコマンドは認証が通った状態ですし、トークンを利用して、Azure PowerShellのコマンドも実行可能となります。
でも、色々と良くない点がありまして…。まず、Azモジュールが入っていないので、インストールする必要があり、かなり時間がかかります。さらに、より致命的なのはトークン取得時のリソースとしてhttps://management.azure.com/を指定するとAzure関連のコマンドは使えるのですが、今回のようにアプリケーションやサービスプリンシパルを作成しようとすると失敗してしまいます。
かといって、https://graph.microsoft.com/をリソースとして指定すると、今度はConnect-AzAccount時にサブスクリプションへのアクセスができないということでエラーになってしまいます。
無理やりやるならやっぱりサービスプリンシパルの認証情報を環境変数やAzure KeyVaultで参照可能としておき、それを使って認証させるしか無いのかなと思います。はじめからこのような手法を使ってしまえばよいのかもしれませんが、もっと簡単にやりたくて…。
仕方がないので、結局はazコマンドのみを利用してやりたいことを全部やる感じに統一しました。
逆にAzure PowerShellに寄せるのは、私の調べ方の問題かもしれませんが、ちょっと無理っぽかったです。なぜか、Azure PowerShellよりもAzure CLIのほうができることが充実しているし、簡単にできる気がします。PowerShell好きのわたしとしてはちょっと悲しいです。
など、色々とありましたが、結局最終的にうまく動作させられたコードは下記です。
ここから先は
この記事が気に入ったらチップで応援してみませんか?