浅草橋青空市場

Microsoft Azure のニュースや情報を中心にあれこれと

サービスプリンシパル(パスワード)でAzure AutomationのRunbookを実行する

仮想マシンの定期的な起動・停止」みたいな定期作業をAzure AutomationのRunbookで実行したいという話は良くあると思います。 が、サービスプリンシパル(パスワードの方)を使ったブログ記事やサンプルが意外と見つからなかったので書いておきます。

※ 証明書を使う方法は公式ドキュメントにあったはず

サービスプリンシパルについて

そもそも何?という話は真壁先生のスライドをどうぞ。

www.slideshare.net

簡単な作りは他はこちらの記事を。作成にはAzure ADにしかるべき権限が必要なので、無い場合は作ってもらいましょう。

asazure.hatenablog.jp

Automation Accountの作成

公式ドキュメントをどうぞ。こちらも「Azure実行アカウントの作成」を行うにはAzure ADに権限が必要です。

docs.microsoft.com

アセットの登録

スクリプト内で使う資格情報やテナントIDなどはAutomation Accountのアセットとして登録します。今回のスクリプトでは、サービスプリンシパルを「Credentials」に、テナントIDを「Variables」に登録しました。

サービスプリンシパルのAppIdをCredentialの「User name」に、パスワードを「Password」に登録します。テナントIDはVariableにStringとして登録しましょう。

f:id:yhara90:20180407224037p:plain

仮想マシン起動・停止のサンプルスクリプト

こんな感じです。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
        } 
    } 
}