Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
こんにちは、Azure サポートチームの山口です。
今回は Azure Automation を使用して、Azure 仮想マシンを起動 / 停止(割り当て解除)する PowerShell Runbook を紹介したいと思います。
本記事は、主にスクリプトコードの紹介となります。ポータル上での Runbook の作成方法やスケジュール設定については、以下の記事を参考にしてください。
Azure Automation で VM を自動停止する
https://blogs.technet.microsoft.com/jpaztech/2017/09/01/azure-automation-%E3%81%A7-vm-%E3%82%92%E8%87%AA%E5%8B%95%E5%81%9C%E6%AD%A2%E3%81%99%E3%82%8B/
Runbook
以下は、Azure 仮想マシンを起動 / 停止(割り当て解除)する PowerShell Runbook のスクリプトコードです。
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 の起動 / 停止(割り当て解除)を実現しています。
VM の起動
Start-AzureRmVM -ResourceGroupName "リソースグループ名" -Name "VM 名"
VM の停止(割り当て解除)
Stop-AzureRmVM -ResourceGroupName "リソースグループ名" -Name "VM 名" -Force
パラメータ
ResourceGroupName
,Name
には、それぞれ VM がデプロイされているリソースグループ名、VM の仮想マシン名を指定します。Force
オプションは、確認画面を出さずに強制的に停止(割り当て解除)を実行するために指定します。
VM の再起動、更新、削除などの、VM の管理に関わる PowerShell コマンドレットについては、以下のドキュメントを参照ください。
・Azure Virtual Machines 用の一般的な PowerShell コマンド - VM の管理
/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 の料金詳細
https://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 のドキュメント
/ja-jp/azure/automation/
本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。