Azure Automation: PowerShell Runbook で Azure VM の起動 / 停止(割り当て解除)

Last Update: feedback 共有

こんにちは、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 {
# 自動作成された接続資産(実行アカウント)を利用して 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
}
}


# 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 の起動 / 停止(割り当て解除)を実現しています。

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 について、より詳細な情報が知りたい方は以下のリンクをご覧ください。

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。