サービスプリンシパル(パスワード)でAzure AutomationのRunbookを実行する
「仮想マシンの定期的な起動・停止」みたいな定期作業をAzure AutomationのRunbookで実行したいという話は良くあると思います。 が、サービスプリンシパル(パスワードの方)を使ったブログ記事やサンプルが意外と見つからなかったので書いておきます。
※ 証明書を使う方法は公式ドキュメントにあったはず
サービスプリンシパルについて
そもそも何?という話は真壁先生のスライドをどうぞ。
www.slideshare.net
簡単な作りは他はこちらの記事を。作成にはAzure ADにしかるべき権限が必要なので、無い場合は作ってもらいましょう。
Automation Accountの作成
公式ドキュメントをどうぞ。こちらも「Azure実行アカウントの作成」を行うにはAzure ADに権限が必要です。
アセットの登録
スクリプト内で使う資格情報やテナントIDなどはAutomation Accountのアセットとして登録します。今回のスクリプトでは、サービスプリンシパルを「Credentials」に、テナントIDを「Variables」に登録しました。
サービスプリンシパルのAppIdをCredentialの「User name」に、パスワードを「Password」に登録します。テナントIDはVariableにStringとして登録しましょう。
仮想マシン起動・停止のサンプルスクリプト
こんな感じです。PowerShell WorkflowタイプのRunbookとして使えます。
パラメーターはそれぞれ以下のようになります。実行時やタイマーにセットしておきましょう。
- CredentialName : アセットに登録したサービスプリンシパルのCredential名
- ResourceGroup : 操作対象のリソースグループ名
- Action : 「Stop」もしくは「Start」
workflow Stop-Start-AzureVM { Param ( [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] [String] $credentialName, [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] [String] $ResourceGroup, [Parameter(Mandatory=$true)][ValidateSet("Start","Stop")] [String] $Action ) $credential = Get-AutomationPSCredential -Name $credentialName $tennantId = Get-AutomationVariable -Name 'tennantId' Login-AzureRmAccount -Credential $credential -Tenantid $tennantId -ServicePrincipal $AzureVMs = Get-AzureRmVM -ResourceGroup $ResourceGroup if($Action -eq "Stop") { Write-Output "Stopping VMs"; foreach -parallel ($AzureVM in $AzureVMs) { $AzureVM | Stop-AzureRmVM -Force } } else { Write-Output "Starting VMs"; foreach -parallel ($AzureVM in $AzureVMs) { $AzureVM | Start-AzureRmVM } } }