Azure VMの状態をチェックし、停止していたら起動させるAutomationスクリプト

誤ってAzure VMを停止した場合でも、常に起動状態にしておくためのAutomationスクリプトを作りました。
Azure Automationで15分置きに対象VMの状態チェックを行い、停止していれば起動させるというシンプルなものです。

# Azure Automationアカウント作成
* Azureポータルより[+リソースの作成]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/de8e5f76-dc98-9a85-bdf0-bb28bcccd345.png)

* 検索バーに[Automation]と入力してEnter  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/35ed9c81-c6e7-1aad-1055-71f83d031684.png)

* [作成]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/18c76833-8924-7d27-b424-eb0c97a297c7.png)

* Automationアカウント名やリージョンを選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/52de7081-2df8-a675-724c-00e192e8b5b2.png)

* Azure実行アカウントは[はい]を選択しておきます。これによりAzureリソース操作コマンド実行時に楽になりますが、証明書期限に注意が必要になります。後ほど書きます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/1e6cc489-8e1d-b861-dbfe-6e18fc27bad6.png)

* Automationアカウントが作成され、概要画面が表示されればOKです。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/eaa1fcdb-b273-1bc0-e208-2fbbdd733a72.png)

# Runbook作成
* Automation画面の左バーより[Runbook]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b39130d5-427e-a13e-652d-3e4fb378077a.png)

* [+ Runbookの作成]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/646e67a3-a196-f7a1-73cd-e42f456923d3.png)

* Runbook名や説明を入力します。Runbookの種類は[PowerShell]とします。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7025460c-7996-d3b7-9640-9248fc625aa1.png)

* PowerShellスクリプトの入力画面が表示されます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/cc5c264e-071e-c8fa-2373-d9a0b7015e6e.png)

* ここに以下スクリプトを貼り付けます。

```powershell
Param(
    [string]$VMName,
    [string]$ResourceGroupName
)

$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationID $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint

$VMState = Get-AzureRmVM -Name $VMName -ResourceGroupName $ResourceGroupName -Status
$VMPowerState = $VMState.Statuses[1].DisplayStatus

if (($VMPowerState -eq "VM deallocated") -or ($VMPowerState -eq "VM stopped"))
{
    Write-Output "$VMName Status is $VMPowerState ."
    Start-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName
} else {
    Write-Output "$VMName Status is $VMPowerState ."
}
```

* [保存]します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/1f90fd42-d2fe-7a7e-d2f6-3c3e0f16a36e.png)

* 一度動作確認しておきましょう。別途停止状態のVMを準備しておきます。  
* [テストウィンドウ]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7acd988a-27e8-1280-f255-00ccc79620dd.png)

* このスクリプトでは対象VMのリソースグループとVM名をパラメータとして渡します。パラメータ入力して、[開始]を選択してください。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/bef89f1c-a687-c2e6-cfda-4ee16638cdd5.png)

* 「[VM Name] Status is [VM Status].」というメッセージが表示されていればOKです。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/0b33152d-8b36-f1c1-d8ae-7915ec1c62f2.png)

* 実際に停止中だったVMが起動されているはずです。起動状態でもテストしてみて問題ないか確認しておきます。  

* 元の画面に戻ってRunbookを[公開]します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/fe0fdfcc-97db-7944-1e88-db1491274271.png)

# スケジュール作成
* 今回は15分置きに実行することにします。Automationスケジュールは最短1時間単位での実行となるため、15分ずらして4つスケジューラーを作成していきます。  
* Runbookが選択されたポータル画面で[スケジュール]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ad53c674-cb60-9d26-c217-37b50833ea06.png)

* [+ スケジュールの追加]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/1a458155-47b8-66fc-2590-8a162ac4c898.png)

* [スケジュール]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e227cde3-bf38-8281-4d44-059fbec625d0.png)

* 新しいスケジュールを作成します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b47a7641-ce8a-7772-732d-56059a1ceb2a.png)

* 以下のように指定します。ポイントは00分に実行されるということです。これによってこのスケジュールは、1:00 2:00 3:00と毎時00分に実行してくれるものになります。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/112d8c5d-23e5-109b-0124-6c2773a9978b.png)

* 次に[パラメータと実行設定]を選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d5cdd862-34d4-2815-826f-a98e49c0225f.png)

* ここではテストのときに指定した対象VM情報を入力します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7c6dadb7-ff5b-909f-dc86-30a1977c4511.png)

* 毎時00分に実行されるスケジュールが作成されました。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/483d4449-c12e-0adb-c3d9-14d091f7b298.png)

* 同じ手順で15分、30分、45分に実行されるスケジュールも作っていきます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d704ba2e-5373-b92e-b912-fd3d520dc88f.png)

# 実行確認
* あとは時間がきたら問題なく動作するか確認すれば完了です。  

# Automation実行アカウント証明書期限切れチェック
* Automationアカウントを作るとAzure ADにサービスプリンシパルが作成されます。このサービスプリンシパルは証明書を使った認証方式になっており、1年で証明書が切れてRunbookの実行がエラーになってしまいます。
* [Azure Automationアカウントの証明書期限が切れる前にメール/Slack通知する](https://qiita.com/shingo_kawahara/items/1c165be4ef354f8feb40) というやり方を以前書いてますので参考ください。

# 参考にさせて頂いた記事
[AzureVMの電源状態一覧とそれをPowerShellスクリプトで取得する方法](https://qiita.com/07JP27/items/634a7aed7df001e0f3eb)