こんにちは、Azure テクニカル サポート チームの山口です。
今回は Azure Automation を使用して、Azure 仮想マシンを起動 / 停止(割り当て解除)する PowerShell Runbook を紹介したいと思います。 本記事は、主にスクリプトコードの紹介となります。ポータル上での Runbook の作成方法やスケジュール設定については、以下の記事を参考にしてください。
■ Runbook PowerShell Runbook 以下は、Azure 仮想マシンを起動 / 停止(割り当て解除)する PowerShell Runbook のスクリプトコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 Param ( [Parameter (Mandatory =$false )] [String ] $SubscriptionNameOrId , [Parameter (Mandatory =$false )] [String ] $ResourceGroupName , [Parameter (Mandatory =$false )] [String ] $VMName , [Parameter (Mandatory =$false )] [Bool ] $StartVM = $true ) Function Get-AzureRmVMPowerState { Param ( [Parameter (Mandatory =$true )] [Object ] $VM ) $instanceView = Get-AzureRmVM -ResourceGroupName $VM .ResourceGroupName -Name $VM .Name -Status $status = $instanceView .Statuses | Where Code -Like "PowerState*" $status = $status .Code -Replace "PowerState/" ,"" Write-Output $status } try { $automationConnectionName = "AzureRunAsConnection" $connection = Get-AutomationConnection -Name $automationConnectionName Write-Output "# Logging in to Azure..." $account = Add-AzureRmAccount ` -ServicePrincipal ` -TenantId $connection .TenantId ` -ApplicationId $connection .ApplicationId ` -CertificateThumbprint $connection .CertificateThumbprint Write-Output "Done." } catch { if (!$connection ) { throw "Connection $automationConnectionName not found." } else { Write-Error -Message $_ .Exception throw $_ .Exception } } if ($StartVM ) { $actionName = "start" $desiredPowerState = "running" } else { $actionName = "stop" $desiredPowerState = "deallocated" } Write-Output "`n# Begin to $actionName specified Virtual Machines..." if ($SubscriptionNameOrId ) { $subscriptions = Get-AzureRmSubscription | Where {$_ .Name -Eq $SubscriptionNameOrId -Or $_ .Id -Eq $SubscriptionNameOrId } if ($subscriptions .Count -Eq 1 ) { Get-AzureRmSubscription -SubscriptionId $subscriptions [0 ].Id | Set-AzureRmContext } else { if ($subscriptions .Count -Eq 0 ) { throw "No accessible subscription found with name or ID [$SubscriptionNameOrId ]. Check the parameters and ensure user is a co-administrator on the target subscription." } else { throw "More than one accessible subscriptions found with name or ID [$SubscriptionNameOrId ]. Please ensure your subscription names are unique, or specify the ID instead." } } } if ($ResourceGroupName ) { if ($VMName ) { $VMs = Get-AzureRmVM -Name $VMName -ResourceGroupName $ResourceGroupName } else { $VMs = Get-AzureRmVM -ResourceGroupName $ResourceGroupName } } else { $VMs = Get-AzureRmVM } foreach ($VM in $VMs ) { Write-Output ("`n[ $ ($VM .ResourceGroupName) > $ ($VM .Name) ]" ) $powerState = Get-AzureRmVMPowerState -VM $VM if ($powerState -ne $desiredPowerState ) { if ($StartVM ) { $result = $VM | Start-AzureRmVM -ErrorAction SilentlyContinue -ErrorVariable err } else { $result = $VM | Stop-AzureRmVM -Force -ErrorAction SilentlyContinue -ErrorVariable err } if ($result .Status -ne 'Succeeded' ) { Write-Error -Message "$ ($VM .Name) failed to $actionName . Error message is as follows:" Write-Output $err } else { Write-Output "$ ($VM .Name) has been $ ($actionName )ed." } } else { Write-Output "$ ($VM .Name) is already $desiredPowerState ." } }
パラメータ この Runbook で指定できるパラメータは 4 つあります。
SubscriptionNameOrId
対象の VM が存在するサブスクリプションの、名前かIDを指定します。
このパラメータは省略可能で、省略した場合、デフォルトのサブスクリプションが指定されます。
ResourceGroupName
対象の VM が存在するリソースグループの名前を指定します。
このパラメータは省略可能で、省略した場合、サブスクリプション内のすべての VM が対象となります。
VMName
対象となる VM の名前を指定します。
なお、このパラメータは、リソースグループを ResourceGroupName で指定している場合に限り考慮され、リソースグループの指定がなければ、指定を省略した場合と同じ動作になります。
このパラメータは省略可能で、省略した場合、以下の VM が対象となります。
リソースグループを指定している場合、指定したリソースグループ内のすべての VM
リソースグループを指定していない場合、サブスクリプション内のすべての VM
StartVM
この Runbook が、対象の VM の起動をするか / 割り当て解除をするかを選択します。
デフォルトでは $True (起動) が指定されていて、$false を指定すると VM の割り当て解除をします。
■ 起動、停止(割り当て解除)のコマンドレット この PowerShell Runbook では、次の PowerShell コマンドレットを用いて VM の起動 / 停止(割り当て解除)を実現しています。
VM の起動 1 Start-AzureRmVM -ResourceGroupName "リソースグループ名" -Name "VM 名"
VM の停止(割り当て解除) 1 Stop-AzureRmVM -ResourceGroupName "リソースグループ名" -Name "VM 名" -Force
パラメータ
ResourceGroupName , Name には、それぞれ VM がデプロイされているリソースグループ名、VM の仮想マシン名を指定します。
Force オプションは、確認画面を出さずに強制的に停止(割り当て解除)を実行するために指定します。
VM の再起動、更新、削除などの、VM の管理に関わる PowerShell コマンドレットについては、以下のドキュメントを参照ください。
■ Azure VM の停止、割り当て解除について
仮想マシン内で OS のシャットダウンを実行するだけでは、**「停止済み (stopped)」状態となりますが、仮想マシンが「停止済み」の状態でも、コンピューティング料金は発生します。 **
課金を停止するには、Azure ポータルから VM を停止するか、PowerShell コマンドレットによって「割り当て解除済み (deallocated)」状態にしてください。「割り当て解除済み」状態になった VM は CPU およびメモリが解放され、課金を停止することができます。
仮想マシンの課金についての詳細は、以下の公式ブログ、ドキュメントを参照ください。
■ さいごに 以上、指定された VM の起動 / 停止(割り当て解除)を実行する PowerShell Runbook の紹介でした。Azure Automation について、より詳細な情報が知りたい方は以下のリンクをご覧ください。
※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。