こんにちは。
今回は、Azure Automationで祝日判定を行い、平日のみ仮想マシンを自動起動させる方法についてです。
目次
Automationアカウントの作成
- Azure Portal( https://portal.azure.com/ )にアクセスし、Azureサブスクリプション管理者およびAzure AD管理者ロールが付与されているアカウントでログインします。
- Azureポータルから「Automationアカウント」ブレードを表示します。
- 「追加」をクリックします。
- Automationアカウント作成に必要な情報を入力します。自動起動、停止実行時に Runbook が Azure へログインするために用いる接続資産と証明書資産を作成するために、「Azure実行アカウントの作成」のオプションでは「はい」が選択されていることを確認してください。
Azモジュールのインポート
- 作成したアカウントをクリックし、「共有リソース」→「モジュールギャラリー」から「Az.Accounts」、「Az.Automation」、「Az.Compute」モジュールをインポートします。
Automation変数の作成
- 「共有リソース」→「変数」から「変数の追加」をクリックします。
- 以下の変数を作成します。
・target_resource_group:自動起動、停止させたい仮想マシンが含まれるリソースグループ名を指定します。半角カンマ(,)で複数指定することも可能です。その場合は指定したリソースグループ全部で同一の仮想マシン名である必要があります。
・exclude_VM:自動起動、停止から除外したい仮想マシン名を指定します。半角カンマ (,) で複数の仮想マシンを指定することができます。自動起動、停止から除外したい仮想マシンがある場合はこの変数も作成します。
・holidays_JP:内閣府のHPから取得した祝日情報が格納されます。 - 以下のRunbookを作成します。
・add_holidays:年に一度、内閣府のHPから祝日情報を取得し、今年度の祝日リストを作成して変数に格納します。
・holiday_automation:「not_holidays」と「start_vm」を連結させます。
・not_holidays:月~金まで毎日指定した時間に祝日判定を行います。
・start_vm:指定した時間に仮想マシンを起動します。
・stop_vm:指定した時間に仮想マシンを停止します。
※holiday_automationのみグラフィックRunbookで作成します。
Powershell Runbookのソースコード
- add_holidays
#内閣府のHPから祝日一覧(csvファイル)を取得
$uri="https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
$importLoc=".\syukujitsu.csv"
Invoke-WebRequest -Uri $uri -OutFile $importLoc
$HolidaysCsv= Import-Csv $importLoc -Encoding Default -Header "date","name" |Where-Object -FilterScript{$_.date -ne "国民の祝日・休日月日"}
#祝日一覧には記載されていない年末年始休暇を追加
$thisyear =(get-date).Tostring("yyyy")
$aditionalHolidays =@("/1/2","/1/3","/12/29","/12/30","/12/31")
foreach($addition in $aditionalHolidays){
$addition= $thisyear+$addition
$HolidaysCsv += New-Object PsObject -Property @{ date = $addition ; name = '年末年始休暇' }
}
#翌年の祝日をソートして取得
$thisyearsHolidays= $HolidaysCsv |Where-Object -FilterScript{$_.date -ge $thisyear+"/1/1"}|sort {[datetime]$_.date}
$thisyearsHolidays|export-csv -path $importLoc -Encoding Default -NoTypeInformation
#祝日を文字列として結合
$content=""
$lastholiday=$thisyearsHolidays[-1]
$thisyearsHolidays|ForEach-Object{
$content+=[string]$_.date
if($_.date -ne $lastholiday.date){
$content+=","
}
}
#holidays_JP変数に格納
Set-AutomationVariable -Name 'holidays_JP' -Value $content
- not_holidays
#holidays_JP変数に格納してある祝日を取得
$Holidays = (Get-AutomationVariable -Name 'holidays_JP')-split(",")
#今日の日付を取得(一桁の月は先頭に0を付けない形式)
$Today = Get-Date -Format "yyyy/M/dd"
#今日の日付とholidays_JP変数内の日付を突合
$not_holidays = $Holidays.contains($Today)
#今日の日付がholidays_JP変数内に存在すればTrus、存在してなければFalse
Write-Output $not_holidays
- start_vm
$servicePrincipalConnection=Get-AutomationConnection -Name "AzureRunAsConnection"
Add-AzAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
#target_resource_group変数からリソースグループ名を取得
$Target_RG= (Get-AutomationVariable -Name 'target_resource_group')-split(",")
#上記で取得したリソースグループに所属する仮想マシンリストを取得
$VMList= @()
ForEach($rg in $Target_RG){
$VMList += (Get-AzVM -ResourceGroupName $rg).Name
}
#除外VMリスト取得
$excludeVM =(Get-AutomationVariable -Name 'exclude_VM')-split(",")
#対象VM取得
$targetVM= Compare-Object -ReferenceObject $VMList -DifferenceObject $excludeVM -PassThru
#対象VM起動
$targetVM|ForEach-Object{
Start-AzVM -ResourceGroupName (Get-AzVM -Name $_).ResourceGroupName -Name $_
}
- stop_vm
$servicePrincipalConnection=Get-AutomationConnection -Name "AzureRunAsConnection"
Add-AzAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
#対象リソースグループ取得
$TargetResourceGroup= (Get-AutomationVariable -Name 'target_resource_group')-split(",")
#対象リソースグループ所属VMリスト取得
$VMList= @()
ForEach($rg in $TargetResourceGroup) {
$VMList += (Get-AzVM -ResourceGroupName $rg).Name
}
#除外VMリスト取得
$excludeVM =(Get-AutomationVariable -Name 'exclude_VM')-split(",")
#対象VM取得
$targetVM= Compare-Object -ReferenceObject $VMList -DifferenceObject $excludeVM -PassThru
#対象VM停止
$targetVM|ForEach-Object{
Stop-AzVM -ResourceGroupName (Get-AzVM -Name $_).ResourceGroupName -Name $_ -Force
}
- holiday_automation
すべてのPowershell Runbookが作成できたら、平日のみ仮想マシンを起動する判定を行うためにholiday_automationとstart_vmを条件付きのシーケンスで連結したグラフィックRunbookを作成します。
シーケンスの条件式には not_holidays の実行結果(True、False)を判定します。
条件式の先頭に「!」が付いていますので not_holidays の実行結果が Falseの場合に正となり、後続の start_vm が実行されます。
スケジュール設定
作成した以下Runbookを動作させるため、スケジュールを作成し割り当てます。
・add_holidays
・holiday_automation
・stop_vm
なお、スケジュールを割り当てたRunbookが実行されるとジョブが実行されますが、ジョブの実行時間(分単位)に基づいて課金されます。
このため、スケジュールを細かく設定するほど課金額が大きくなります。
- add_holidays
- holiday_automation
- stop_vm