Azure Automation で VM を起動・停止する方法

Last Update: feedback 共有

こんにちは!Azure Monitoring サポート チームの趙です。
今回は、VM を起動・停止する方法をご案内させていただきます。

目次

VM 起動・停止処理を理解しましょう

みなさんは普段 VM を起動・停止する際には、どのような方法で、VM を起動・停止していますか?

最も一般的な方法は、Azure ポータルから、[開始] ボタン、[停止] ボタンをクリックし、VM を起動・停止する方法ですね。
あるいは、PowerShell コマンド Start-AzVMStop-AzVM を実行し、VM を起動・停止されている方もいると思います。

VM の電源状態の詳細については、こちらの公開情報もご参考いただければ幸いです。

Azure Automation では、Runbook というものを使って、VM を起動・停止できます。

Runbook は、簡単に申しますと、Azure 上で実行できるスクリプトです。
Runbook の詳細は、Azure Automation での Runbook の実行Azure Automation の Runbook の種類をご参考いただければ幸いです。

なぜ Azure Automation を使うか

Automation は、スクリプトを定期的に実行できるサービスです。

VM 起動・停止を毎日、ポータルから [開始] ボタン、[停止] ボタンを押して、管理することは現実的に難しいと思います。
Azure Automation をご利用いただくことで、VM の起動・停止処理をスケジュールで起動・停止する (自動化する) ことが可能です。Azure Automation では、スケジュールという機能があり、スケジュールに設定した時間に Runbook (スクリプト) を実行できます。

VM を起動・停止するソリューション

1.Start/Stop VMs during off-hours ソリューション (v1) (非推奨)

Azure Automation では、以前は、Start/Stop VMs during off-hours ソリューション (v1) を提供しておりましたが、現時点では、非推奨の機能です。
なお、認証手段としては、実行アカウントが利用されていたソリューションです。

また、Start/Stop VMs during off-hours ソリューション (v1) は、非推奨のソリューションであるため、現時点では Start/Stop VMs during off-hours ソリューション (v1) をデプロイすることはできません。
Start/Stop VMs during off-hours ソリューション (v1) をご検討いただいた方は、後述する Start/Stop VMs v2 のご利用をご検討いただければ幸いです。

2.Start/Stop VMs v2 (推奨)

Start/Stop VMs during off-hours ソリューション (v1) とは別の Start/Stop VMs v2 というソリューションがございます。
Start/Stop VMs v2 ソリューションは、現在、一般公開 (GA) されている機能であり、弊社にて推奨する VM 起動・停止ソリューションです。

警告

Start/Stop VMs v2 ソリューションでは、Azure Automation は利用されません。

Azure Functions 及び Logic Appsが利用されます。

また、認証手段としては、マネージド ID が利用されます。

Start/Stop VMs v2 ソリューションをデプロイすることで VM を起動・停止する Azure Functions 及び Logic Apps が自動的にデプロイできます。
このソリューションを利用することで、VM をスケジュールで起動・停止することが可能です。

3.Start Azure V2 VMs / Stop Azure V2 VMs (非推奨)

Runbook ギャラリーから入手できる “Start Azure V2 VMs” Runbook 、あるいは、”Stop Azure V2 VMs” Runbook をご利用されている方もいると存じます。


Note

各 Runbook は、マイクロソフトではなく各所有者によるライセンス契約に従ってライセンスが付与されます。コミュニティ メンバーが提供し、ライセンスを付与した Runbook について、マイクロソフトはいかなる責任も負いません。また、マイクロソフトは、そのような Runbook のセキュリティ、互換性、パフォーマンスについて、いかなる審査も実施していません。ここで言及した類の Runbook は、マイクロソフトのサポート プログラムまたはサポート サービスの対象外です。そのような Runbook は現状有姿のまま提供され、いかなる種類の保証も適用されません。

この Runbook は、あくまでもチュートリアル用の Runbook であり、非推奨の Runbook です。
以下は推奨しない理由です。
非推奨の AzureRM モジュールのコマンドを利用している Runbook であるためです。

Note

弊社としては、Az モジュールのコマンドを推奨します。

詳細については、Az モジュールへの移行をご参考いただければ幸いです。

なお、2016 年以降、修正・アップデートがされていない Runbook であるためです。
また、“The pipeline was not run because a pipeline is already running” エラー発生時の対処方法 記事のように、既知のエラーが発生する Runbook です。

そのため、運用にて VM の起動・停止ソリューションのご利用をご検討されている方、あるいは、既にご利用されている方は、Start Azure V2 VMs / Stop Azure V2 VMs Runbook (上記グラフィカル Runbook) ではなく、弊社にて推奨する Start/Stop VMs v2 ソリューション (Azure Functions 及び Logic Apps の機能) のご利用をご検討いただければ幸いです。

VM を起動・停止する Runbook サンプル

上記にて紹介いたしましたソリューションとは別で、お客様にてカスタムで Runbook を作成し、Azure Automation を利用し、VM を起動・停止することも可能です。

カスタムで Runbook を作成する基本的なガイドラインは、チュートリアル: マネージド ID を使用して Automation PowerShell Runbook を作成する や、Azure Automation でのテキスト形式の Runbook の編集をご参考いただければ幸いです。

なお、以下に一例として、VM を起動・停止するサンプル Runbook を参考情報としてご案内させていただきます。
こちらのサンプルについては、お客様のご要件に応じて、適宜、カスタマイズいただければ幸いです。
以下免責事項をご確認いただいたうえで、サンプルをご活用いただければ幸いです。

免責事項

  • 弊社サポートにて、お客様のご要件のサンプルを作成・編集し、提供することは、サポートしておりません。
  • こちらの Runbook をご利用いただき、スクリプトの修正、スクリプトの追記等が必要な際には、お客様のご要件に応じて、お客様にて直接修正・動作確認いただく必要がございます。そのため、大変恐れ入りますが、スクリプトの修正、スクリプトの追記等をお問い合わせいただいても、ご要望を承ることができない点、予めご理解いただければ幸いです。
  • 弊社として推奨する VM 起動・停止ソリューションは、現在、一般公開 (GA) されている Start/Stop VMs v2 ソリューションです。
  • こちらのサンプルは、あくまでも VM 起動・停止のコマンドの説明用のサンプルとなります。

サンプル Runbook : システム割り当てマネージド ID を利用し、VM を起動・停止する 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
param(
[Parameter(Mandatory=$true,HelpMessage="Enter the value for Action. Values can be either start or stop")][String]$Action = $(throw "Value for Action is missing"),
[Parameter(Mandatory=$true,HelpMessage="Enter the value for VMName.")][String]$VMName = $(throw "Value for VMName is missing"),
[Parameter(Mandatory=$true,HelpMessage="Enter the ResourceGroupName.")][String]$ResourceGroupName = $(throw "Value for ResourceGroupName is missing")
)

[string] $FailureMessage = "Failed to execute the command"
[int] $RetryCount = 3
[int] $TimeoutInSecs = 20
$RetryFlag = $true
$Attempt = 1
do
{
#----------------------------------------------------------------------------------
#---------------------LOGIN TO AZURE AND SELECT THE SUBSCRIPTION-------------------
#----------------------------------------------------------------------------------

Write-Output "Logging into Azure subscription using Az cmdlets..."

try
{

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process
# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context
# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext


Write-Output "Successfully logged into Azure subscription using Az cmdlets..."

Write-Output "VM action is : $($Action)"

if ($Action.Trim().ToLower() -eq "stop")
{
Write-Output "Stopping the VM : $($VMName) in Resource Grpup $($ResourceGroupName)"

$Status = Stop-AzVM -Name $VMName -ResourceGroupName $ResourceGroupName -Force

if($Status -eq $null)
{
Write-Output "Error occured while stopping the Virtual Machine $($VMName) in Resource Grpup $($ResourceGroupName)"
}
else
{
Write-Output "Successfully stopped the VM $VMName in Resource Grpup $($ResourceGroupName) in Resource Grpup $($ResourceGroupName)"
}
}
elseif($Action.Trim().ToLower() -eq "start")
{
Write-Output "Starting the VM : $($VMName) in Resource Grpup $($ResourceGroupName)"

$Status = Start-AzVM -Name $VMName -ResourceGroupName $ResourceGroupName

if($Status -eq $null)
{
Write-Output "Error occured while starting the Virtual Machine $($VMName) in Resource Grpup $($ResourceGroupName)"
}
else
{
Write-Output "Successfully started the VM $($VMName) in Resource Grpup $($ResourceGroupName)"
}
}

$RetryFlag = $false
}
catch
{
if ($Attempt -gt $RetryCount)
{
Write-Output "$FailureMessage! Total retry attempts: $RetryCount"

Write-Output "[Error Message] $($_.exception.message) `n"

$RetryFlag = $false
}
else
{
Write-Output "[$Attempt/$RetryCount] $FailureMessage. Retrying in $TimeoutInSecs seconds..."

Start-Sleep -Seconds $TimeoutInSecs

$Attempt = $Attempt + 1
}
}
}
while($RetryFlag)

サンプル Runbook の解説

上記サンプル Runbook は、主に以下 3 つのコマンドを利用し、VM を起動・停止します。

Azure へ認証するコマンド

1
Connect-AzAccount -Identity

システム割り当てマネージド ID を利用するコマンドです。
Automation では、このコマンドを利用し、操作対象の Azure リソースへ認証します。
システム割り当てマネージド ID ではなく、ユーザー割当マネージド ID をご利用いただくことも可能です。
ユーザー割り当てマネージド ID をご希望される場合は、Azure Automation アカウントのユーザー割り当てマネージド ID を使用する をご参考いただければ幸いです。

Note

マネージド ID は、2 種類あります。システム割り当てマネージド ID と、ユーザー割り当てマネージド ID があります。

システム割り当てマネージド ID を使えばいいか、ユーザー割り当てマネージド ID を使えばいいかとのお問い合わせをされている方もいます。

弊社としては、特にこのマネージド ID を使ってくださいとの推奨はございません。

マネージド ID のベスト プラクティスに関する推奨事項 をご参考いただき、お客様のご要件に合うマネージド ID をご利用いただければ幸いです。

VM を起動するコマンド

1
Start-AzVM -Name $VMName -ResourceGroupName $ResourceGroupName

VM を起動するコマンドです。
Runbook の入力パラメーターで設定する VM 名と VM 名のリソース グループ名がこのコマンドに利用されます。

VM を停止するコマンド

1
Stop-AzVM -Name $VMName -ResourceGroupName $ResourceGroupName -Force

VM を停止するコマンドです。
Runbook の入力パラメーターで設定する VM 名と VM 名のリソース グループ名がこのコマンドに利用されます。
VM を起動するコマンドとは、-Force オプションを付けている箇所が相違点ですね。
通常、-Force オプションなしで、Stop-AzVM を実行すると、”本当に VM を停止しますか” とユーザーの入力が求められます。
Automation では、このような対話型コマンドはサポートされません。
-Force オプションを付けることによって、ユーザーの入力を必要とせず、サイレントで処理を実行することが可能です。
そのため、Automation の Runbook で、Stop-AzVM を実行する場合は、明示的に -Force オプションを付けております。

サンプル Runbook の利用方法

1.Automation アカウントを作成する

ご利用いただいている環境に、Automation アカウントがない場合、スタンドアロン Azure Automation アカウントを作成するをご参考いただき、Automation アカウントを作成いただければ幸いです。

2.Automation アカウントにシステム割り当てマネージド ID を構成する

Azure Automation アカウントのシステム割り当てマネージド ID を使用するをご参考いただき、Automation アカウントにシステム割り当てマネージド ID を構成いただければ幸いです。

Note

現時点では、新規 Automation アカウントを作成すると、自動的にシステム割り当てマネージド ID が作成されます。そのため、新規 Automation アカウントを作成した場合は、別途、システム割り当てマネージド ID を作成する必要はございません。

一方で、システム割り当てマネージド ID へのロールの割り当ては何もされていない状態でシステム割り当てマネージド ID が作成されます。

そのため、現時点で、新規 Automation アカウントを作成された方は、Azure Automation アカウントのシステム割り当てマネージド ID を使用するをご参考いただき、必要なロールを割り当てていただければ幸いです。

3.必要なモジュールをインポートする

今回の Runbook にて利用されるコマンドは主に以下 3 つです。

1
Connect-AzAccount -Identity
1
Start-AzVM -Name $VMName -ResourceGroupName $ResourceGroupName
1
Stop-AzVM -Name $VMName -ResourceGroupName $ResourceGroupName -Force

Runbook にて、それぞれのコマンドを実行するには Automation アカウントに対象コマンドのモジュールがインポートされている必要があります。
それぞれのコマンドで必要なモジュールは以下です。

Azure Automation でモジュールを管理する をご参考いただき、上記モジュールを Automation アカウントにインポートいただければ幸いです。

Note

コマンドに必要なモジュールを特定するには、対象コマンドの公開情報に記載されているモジュールをご確認いただければ確認できます。

対象コマンドの公開情報は、インターネットで対象コマンドを検索すると表示される Microsoft 公開情報にて確認できます。

例えば、Connect-AzAccount の場合、”Module” に “Az.Accounts” と記載されていることが確認できます。

Note

既に、Az.Accounts と Az.Compute モジュールがインポートされている Automation アカウントをご利用されているお客様もいます。この場合、上記モジュール インポートの対応は不要です。

[Azure ポータル] > [Automation アカウント] > [モジュール] に対象モジュールが存在していれば、上記モジュール インポートの対応は不要です。

4.対象 Runbook を作成する

以下へアクセスします。

1
[Azure ポータル] - [Automation アカウント] - [Runbook] - [Runbook の作成]

以下を構成し、[作成] をクリックします。

  • Runbook の名前 : <任意に設定>
  • Runbook の種類 : PowerShell
  • ランタイム バージョン : 5.1

上記サンプル のスクリプトを貼り付けます。
[保存] と [公開] を押します。[はい] を押します。

5.スケジュールを設定する

Azure Automation のスケジュールを管理する を参考に、スケジュールを作成し、スケジュールを Runbook にリンクします。

警告

上記サンプル は、1つの VM のみ指定できます。

そのため、VM の数分、スケジュールを作成し、Runbook へリンクする必要がございます。

Runbook は 1 つだけで問題ございません。

複数の VM を指定されたい場合は、Start/Stop VMs v2 ソリューション (Azure Functions 及び Logic Apps の機能) のご利用をご検討いただければ幸いです。

今回のサンプルの場合、以下3つのパラメーターで構成されています。

1
2
3
4
5
param(
[Parameter(Mandatory=$true,HelpMessage="Enter the value for Action. Values can be either start or stop")][String]$Action = $(throw "Value for Action is missing"),
[Parameter(Mandatory=$true,HelpMessage="Enter the value for VMName.")][String]$VMName = $(throw "Value for VMName is missing"),
[Parameter(Mandatory=$true,HelpMessage="Enter the ResourceGroupName.")][String]$ResourceGroupName = $(throw "Value for ResourceGroupName is missing")
)

スケジュールを Runbook へリンクするタイミングで、パラメーターの指定が求められます。
各パラーメーターに渡す値は、以下のように指定いただければ幸いです。

  • ACTION : VM を起動したい場合は、”start”。VM を停止したい場合は、”stop” を入力。
  • VMNAME : 対象 VM の VM 名を入力
  • RESOURCEGROUPNAME : 対象 VM のリソース グループ名を入力

6.動作確認する

まずは、Runbook を手動で実行し、正常動作することを確認してから、
スケジュールの動作をご確認いただければ幸いです。

Runbook 手動実行での動作確認
1
[Azure ポータル] - [Automation アカウント] - [Runbook] - [開始] - [パラメーターの値を入力] - [OK]
スケジュールの動作確認

スケジュールで設定された時間に Runbook が実行されるかどうかを確認します。

1
[Azure ポータル] - [Automation アカウント] - [ジョブ] - [ジョブ一覧に対象 Runbook のジョブが表示されるかを確認]

トラブルシューティング

マネージド ID にロールが割り当てられていないパターン

例えば、以下のようなエラー メッセージが表示され、VM が起動・停止していない場合は、
マネージド ID に必要なロールが割り当てられているかをご確認いただければ幸いです。

1
[Error Message] Cannot validate argument on parameter 'Subscription'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again. 

本サンプルでは、システム割り当てマネージド ID を利用し、Azure へ認証し、VM を起動・停止します。
上記エラーは、システム割り当てマネージド ID が、Azure へ認証できていないことを意味します。
システム割り当てマネージド ID が、Azure へ認証するには、権限があるロールを有している必要がございます。
ロールが割り当てられているかをご確認ください。

必要なモジュールがインポートされていないパターン

例えば、以下のようなエラー メッセージが表示され、VM が起動・停止していない場合は、
対象 Runbook のコマンドのモジュールがインポートされていないことを意味します。

1
The term '<コマンド名>" is not recognized as a name of cmdlet...

Automation アカウントにモジュールがインポートされているかご確認いただき、
ない場合は、必要な PowerShell モジュールを適宜インポートしていただけますと幸いです。

以上です。

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