今回はAzure Automationを使ってAzure ApplicationGatewayを自動起動・停止する方法を共有します。
コスト削減の為、複数テナントの複数サブスクリプションに存在する複数のApplicationGatewayを手動で停止することは大変で、かつ忘れてしまう可能性がありますので、Automationを使って自動起動・停止した方が良いかと思います。
では早速ですが、説明を始めます。
▼流れ
①ストレージアカウントのコンテナーにCSVファイルを保存
②CSVファイルには、対象ApplicationGatewayの以下情報を事前に書く必要がある
・サブスクリプション名
・リソースグループ名
・ApplicationGateway名
・StartTime
・StopTime
③Automationで起動用と停止用のRunBookを作成
④スクリプトを作成
⑤スケジュールを設定
※ApplicationGatewayによって起動と停止時間がバラバラであれば毎日1~3時間毎にスケジュールを設定することをお勧めします。
⑥最後の確認
▼前提条件
①Azure Entra IDに存在するユーザーのMFAは無効であること
②複数のテナントにおいて、Microsoft Entra ID(旧Azure AD)にユーザーとして存在し、ApplicationGatewayを起動・停止する権限があること
③使用するAutomationアカウントに資格情報を登録
1.Automationアカウントから「資格情報」を選択
2.必要な情報を入力後、「作成」を選択
※ユーザー名とパスワードはAzure EntraIDに存在する情報となります。
3.登録されていることを確認
※複数テナントがある場合、この処理は複数回必要です。
▼設定手順
①ストレージアカウントのコンテナーにCSVファイルを保存
②CSVファイルには、対象ApplicationGatewayの以下情報を事前に書く必要がある
③Automationで起動用と停止用のRunBookを作成
④スクリプトを書く
【起動用スクリプト】
# AzureADのアカウントIDで別サブスクリプションへの認証、テナントが複数ある場合、全部記載必要
$usercred = Get-AutomationPSCredential -Name “資格情報名“
Connect-AzAccount -Credential $usercred -Tenant “テナントID“
# ストレージアカウントとCSVファイルの情報
$storageAccountName = “ストレージアカウント名“
$storageAccountKey = “アクセスキー“
$containerName = “コンテナー名“
$csvFileName = “CSVファイル名“
# ストレージアカウントからCSVファイルを読み取る
$context = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
$blob = Get-AzureStorageBlob -Container $containerName -Blob $csvFileName -Context $context
$csvContent = $blob.ICloudBlob.DownloadText()
# CSVファイルの内容を解析する
$ImportCsvs = ConvertFrom-Csv -InputObject $csvContent
# 配列に入れる
$appgwnamelist = @()
$appgwrglist = @()
$appgwsublist = @()
$appgwstarttimelist = @()
foreach ($ImportCsv in $ImportCsvs){
$appgwnamelist += $ImportCsv.ApplicationGatewayname
$appgwrglist += $ImportCsv.Resourcegroup
$appgwsublist += $ImportCsv.SubscriptionID
$appgwstarttimelist += $ImportCsv.StartTime
}
for ($i=0; $i -lt $appgwnamelist.Count ; $i++){
# AppGW取得
$AppGw = Get-AzApplicationGateway -Name $appgwnamelist[$i] -ResourceGroupName $appgwrglist[$i]
# 現在の日時を日本時間で取得
$currentDateTime = (Get-Date).ToUniversalTime().AddHours(9).ToString(“HH:mm:ss”)
# StartTimeをDateTime型に変換
$startTime = [DateTime]::ParseExact($appgwstarttimelist[$i], “HH:mm:ss”, $null)
# 現在の日時とStartTimeの差を計算
$diff = $startTime – [DateTime]::ParseExact($currentDateTime, “HH:mm:ss”, $null)
# 差が5分以内であれば、一致とみなす
if ($diff.TotalMinutes -le 5) {
Start-AzApplicationGateway -ApplicationGateway $AppGw
}
}
【停止用スクリプト】
# AzureADのアカウントIDで別サブスクリプションへの認証、テナントが複数ある場合、全部記載必要
$usercred = Get-AutomationPSCredential -Name “資格情報名“
Connect-AzAccount -Credential $usercred -Tenant “テナントID“
# ストレージアカウントとCSVファイルの情報
$storageAccountName = “ストレージアカウント名“
$storageAccountKey = “アクセスキー“
$containerName = “コンテナー名“
$csvFileName = “CSVファイル名“
# ストレージアカウントからCSVファイルを読み取る
$context = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
$blob = Get-AzureStorageBlob -Container $containerName -Blob $csvFileName -Context $context
$csvContent = $blob.ICloudBlob.DownloadText()
# CSVファイルの内容を解析する
$ImportCsvs = ConvertFrom-Csv -InputObject $csvContent
# 配列に入れる
$appgwnamelist = @()
$appgwrglist = @()
$appgwsublist = @()
$appgwstoptimelist = @()
foreach ($ImportCsv in $ImportCsvs){
$appgwnamelist += $ImportCsv.ApplicationGatewayname
$appgwrglist += $ImportCsv.Resourcegroup
$appgwsublist += $ImportCsv.SubscriptionID
$appgwstoptimelist += $ImportCsv.StopTime
}
for ($i=0; $i -lt $appgwnamelist.Count ; $i++){
# AppGW取得
$AppGw = Get-AzApplicationGateway -Name $appgwnamelist[$i] -ResourceGroupName $appgwrglist[$i]
# 現在の日時を日本時間で取得
$currentDateTime = (Get-Date).ToUniversalTime().AddHours(9).ToString(“HH:mm:ss”)
# StopTimeをDateTime型に変換
$stopTime = [DateTime]::ParseExact($appgwstoptimelist[$i], “HH:mm:ss”, $null)
# 現在の日時とStopTimeの差を計算
$diff = $stopTime – [DateTime]::ParseExact($currentDateTime, “HH:mm:ss”, $null)
# 差が5分以内であれば、一致とみなす
if ($diff.TotalMinutes -le 5) {
Stop-AzApplicationGateway -ApplicationGateway $AppGw
}
}
⑤スケジュールを設定
CSVファイルのStartTimeとStopTimeに合わせてスケジュールを設定するか、1~3時間ごとに1回スクリプトを実行するように設定
⑥最後の確認
「動作状態」が「実行中」、もしくは「停止済み」になっていることを確認