Azure サービスプリンシパルを使用した Az モジュールでの操作

Azure サービスプリンシパルを使用した Az モジュール認証から、実際のリソース操作まで順を追って説明。

単純な Az モジュールを使用したリソース操作については以下を参照。

前提条件

認証に使用するサービスプリンシパルは作成済みであること。

サービスプリンシパルの作成方法は以下を参照。

今回は以下のように、TestSP3 と言う名称で作成済みのサービスプリンシパルを使用する。

f:id:poke_dev:20200126181127p:plain

操作対象のリソースは、こちらもあらかじめ作成済みの下記 Web App とする。

f:id:poke_dev:20200126181509p:plain

基本情報
種別
サブスクリプション BizSpark
リソースグループ名 TestRg
Web App 名 NetWebAppTest111
操作対象リソースのロール割当状況

認証に使用したサービスプリンシパルアカウントが、操作対象リソースのロールに割り当てられていること。ここでは「共同作成者」としてロール割り当て済み。

f:id:poke_dev:20200126181833p:plain

サブスクリプション自体にロールが割り当てられたサービスプリンシパルの場合、当該サブスクリプション配下の各リソースも自動的に継承するようだが、基本的には最小限の権限設定となるように、対象リソースにのみロールを割り当てるのが良いと思われる。

上述したイメージでは、サブスクリプションにのみロールを割り当てた TestSP1 と TestSP2 も、当該 Web App のロール一覧に表示されている (なので、TestSP1, TestSP2 を使用しての操作ももちろん可能)。

リソースへのロール割り当て方法については以下も参照。

実行するコマンドレット
> $appId = "1ebxxx"
> $secret = "yyy"
> $tenantId = "dcfzzz"
> $securedSecret = ConvertTo-SecureString $secret -AsPlainText -Force
> $creds = New-Object System.Management.Automation.PSCredential($appId, $securedSecret)
> Connect-AzAccount -ServicePrincipal -Tenant $tenantId -Credential $creds

> Get-AzWebApp -ResourceGroupName "TestRg" -Name "NetWebAppTest111"
> Stop-AzWebApp -ResourceGroupName "TestRg" -Name "NetWebAppTest111"

Connect-AzAccount の実行までが、サービスプリンシパルを利用した Azure ログイン、その後は、通常の Az モジュールによる操作と同じになる。 ここでは、稼働中 Web App の情報を取得し、停止させることにする。

サービスプリンシパルを利用した認証については、下記ドキュメントも参照。

実行結果

f:id:poke_dev:20200126183021p:plain

f:id:poke_dev:20200126183147p:plain

停止コマンドが成功すると、State が Running から Stopped に変わったことが確認できる。

更新結果は Azure ポータルでも確認できるが、Azure ポータルサイトがキャッシュ(?)しているのか、F5 で画面リフレッシュしないとポータル上の状態表示が変わらないことがあるっぽいので、注意。

f:id:poke_dev:20200126183352p:plain

Az コマンド実行時に発生する可能性があるエラーについて

ログインに使用したサービスプリンシパルがどのリソースにもロール割り当てされていない場合、ログイン後に表示されるサブスクリプション名が空になっていて、もちろんリソースの操作もできない。

f:id:poke_dev:20200126184917p:plain

サブスクリプションの他のリソースにロールが割り当てられていて、操作したいリソースに割り当てられていない場合も、以下のようにエラーが発生してリソース操作できない。

f:id:poke_dev:20200126185509p:plain

なおこの際、「does not have authorization to perform action 'Microsoft.Web/sites/read' over scope 'xxx...」と言うように当該コマンドレット実行に必要な権限情報が表示されるので、最小限の権限はこの権限となる。例えば、「閲覧者(=Reader 組み込みロール)」だと Get-AzWebApp コマンドレットは実行出来るが、Start-AzWebApp コマンドレットは実行出来なかったりする。

Azure リソースの組み込みロール | Microsoft Docs