こんにちは、Azure サポートチームの山口です。
今回は Azure Automation を使用して、Azure 仮想マシン (VM) を起動 / 停止(割り当て解除)する PowerShell Runbook を紹介したいと思います。
本記事は主にスクリプトコードの紹介となりますので、ポータル上での Runbook の作成方法やスケジュール設定については、以下の記事を参考にしてください。
- Azure Automation で VM を自動停止する
PowerShell Runbook
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 { # 自動作成された接続資産(実行アカウント)を利用して Azure にログイン $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 } } # actionName - $StartVM パラメタに指定された、アクションの名前 # desiredPowerState - アクション後になるべき VM の電源状態 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) { # Select-AzureRmSubscription -SubscriptionName $subscriptions[0].Id >0 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." } } } # リソースグループを指定した場合は、そのリソースグループ内の Azure VM を取得 # 指定しない場合は、全 VM を取得 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) ]") # VM の電源状態を取得する $powerState = Get-AzureRmVMPowerState -VM $VM # 電源状態が running (resp. deallocated) でなければ、起動 (resp. 停止) する if ($powerState -ne $desiredPowerState) { # 望ましい電源状態に VM の状態を変更 if ($StartVM) { $result = $VM | Start-AzureRmVM -ErrorAction SilentlyContinue -ErrorVariable err } else { $result = $VM | Stop-AzureRmVM -Force -ErrorAction SilentlyContinue -ErrorVariable err } # 正常に VM が起動 (停止) したかの確認 & ステータスの出力 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." } } # 既に running (resp. deallocated) 状態なので、起動 (resp. 停止) しない 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 の起動 / 停止(割り当て解除)を実現しています。
# 起動
Start-AzureRmVM -ResourceGroupName "リソースグループ名" -Name "VM 名"
# 停止(割り当て解除)
Stop-AzureRmVM -ResourceGroupName "リソースグループ名" -Name "VM 名" -Force
ResourceGroupName
,Name
には、それぞれ VM がデプロイされているリソースグループ名、VM の仮想マシン名を指定します。Force
オプションは、確認画面を出さずに強制的に停止(割り当て解除)を実行するために指定します。
・Azure Virtual Machines 用の一般的な PowerShell コマンド - VM の管理
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/ps-common-ref#manage-vms
Azure VM の停止、割り当て解除について
仮想マシン内で OS のシャットダウンを実行するだけでは、「停止済み (stopped)」状態となりますが、仮想マシンが「停止済み」の状態でも、コンピューティング料金は発生します。
課金を停止するには、Azure ポータルから VM を停止するか、PowerShell コマンドレットによって「割り当て解除済み (deallocated)」状態にしてください。「割り当て解除済み」状態になった VM は CPU およびメモリが解放され、課金を停止することができます。
仮想マシンの課金の仕組み
https://blogs.msdn.microsoft.com/dsazurejp/2015/01/09/23/
Virtual Machines の料金詳細
http://azure.microsoft.com/ja-jp/pricing/details/virtual-machines/
さいごに
以上、指定された VM の起動 / 停止(割り当て解除)を実行する PowerShell Runbook の紹介でした。Azure Automation について、より詳細な情報が知りたい方は以下のリンクをご覧ください。
・Azure Automation
https://azure.microsoft.com/ja-jp/services/automation/
・Automation のドキュメント
https://docs.microsoft.com/ja-jp/azure/automation/
本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。