AzureVMの電源状態一覧とそれをPowerShellスクリプトで取得する方法

#はじめに
AzureVM(ARM版)の電源状態を使ってPowerShellやAutomationで処理をしたい時、公式の電源状態リストがなかなか見つからなかったのでその取得方法と共に残しておきます。

# VMの状態を取得する
- 電源状態を取得したいVMの情報を取得する。

``` bash
$VMState = Get-AzureRmVM -Name 'VMName' -ResourceGroupName 'RGName' -Status
```
- `$VMState`には以下のような情報が入る。

```bash
ResourceGroupName       : RGName
Name                    : VMName
BootDiagnostics         : 
BootDiagnosticsText     : null
Disks                   : {targetVM}
DisksText               : [
                            {
                              "name": "VMName",
                              "statuses": [
                                {
                                  "code": "ProvisioningState/succeeded",
                                  "level": "Info",
                                  "displayStatus": "Provisioning succeeded",
                                  "message": null,
                                  "time": "2016-11-11T04:44:27.7188171Z"
                                }
                              ]
                            }
                          ]
Extensions              : {MicrosoftMonitoringAgent}
ExtensionsText          : [
                            {
                              "name": "MicrosoftMonitoringAgent",
                              "type": null,
                              "typeHandlerVersion": null,
                              "substatuses": null,
                              "statuses": null
                            }
                          ]
PlatformFaultDomain     : 
PlatformUpdateDomain    : 
RemoteDesktopThumbprint : 
VMAgent                 : Microsoft.Azure.Management.Compute.Models.VirtualMachineAgentInstanceView
VMAgentText             : {
                            "vmAgentVersion": "Unknown",
                            "extensionHandlers": null,
                            "statuses": [
                              {
                                "code": "ProvisioningState/Unavailable",
                                "level": "Warning",
                                "displayStatus": "Not Ready",
                                "message": "VM Agent is unresponsive.",
                                "time": "2016-11-13T09:28:08Z"
                              }
                            ]
                          }
Statuses                : {Microsoft.Azure.Management.Compute.Models.InstanceViewStatus, 
                          Microsoft.Azure.Management.Compute.Models.InstanceViewStatus}
StatusesText            : [
                            {
                              "code": "ProvisioningState/succeeded",
                              "level": "Info",
                              "displayStatus": "Provisioning succeeded",
                              "message": null,
                              "time": "2016-11-11T04:44:27.7344384Z"
                            },
                            {
                              "code": "PowerState/deallocated",
                              "level": "Info",
                              "displayStatus": "VM deallocated",
                              "message": null,
                              "time": null
                            }
                          ]
```

- StatusesText→displayStatusがVMの電源状態なので、これを取得する。(StatusesText→codeで判定もできるがdisplayStatusの方がより詳しい情報が見れる)

- 取得した情報から電源状態のみを抜き出す。

```bash
$VMState = Get-AzureRmVM -Name 'VMName' -ResourceGroupName 'RGName' -Status
$VMPowerState = $VMState.Statuses[1].DisplayStatus
```
$VMPowerStateに文字列型で電源情報が入っている。

```bash
VM deallocated
```
# VMの電源状態リスト
|取得文字列|状態|
|---|---|
|VM deallocated|停止済み（割り当て解除）|
|VM deallocating|停止中（割り当て解除）|
|VM running|起動済み|
|VM starting|起動中|
|VM stopping|停止中（リソース保持）|
|VM stopped|停止済み（リソース保持）|
- 割り当て解除は全てのリソースが開放され、VMに対して料金は課金されない。
- リソース保持は停止しても引き続き課金は発生するが、リソースは保持される。


#サンプルスクリプト
VMの電源状態で分岐して処理を行うスクリプト

```bash
$RGName = 'RGName'
$VMName = 'VMName'

$VMState = Get-AzureRmVM -Name $VMName -ResourceGroupName $RGName -Status
$VMPowerState = $VMState.Statuses[1].DisplayStatus
if ($VMPowerState -eq 'VM deallocated')
{
    '停止しています。' 
}
elseif ($VMPowerState -eq 'VM stopped')
{
    'リソース保持のまま停止しています。'
}
elseif ($VMPowerState -eq 'VM deallocating') 
{
    '停止処理中です。'
}
elseif ($VMPowerState -eq 'VM stopping')
{
    'リソース保持のまま停止処理中です。'
}
elseif ($VMPowerState -eq 'VM starting')
{
    '起動処理中です。'
}
elseif ($VMPowerState -eq 'VM running')
{
    '起動しています。'
}
```