Azure Automation と Log Analytics の連携設定
こんにちは。Azure サポート チームの村田です。
Azure Automation においては、Runbook において、様々なスクリプトを実行することが可能となっており、Azure プラットフォームにおいて、VM の自動起動など様々な用途で利用可能です。今回は Automation のジョブの実行結果をステータスに併せてより効率的に確認するため、Log Analytics と連携する方法をご案内します。
Automation においてはジョブのステータスは完了となっていますが、内部的にはエラーが出力されているケースがまれに存在します。そのような場合に一つ一つのジョブの確認していくのはあまり効率的とは言えないですしとても運用の観点ではとても手間のかかる作業ですよね。
今回ご案内する方法により、ジョブの実行結果の成功、失敗のステータスや、エラーの出力をトリガーにアラートのメールを送付する、Webhook により Automation のスクリプトをキックするなど、Log Analytics の豊富な機能を利用して Automation の運用を管理することが可能となります。
本ブログによってご説明する内容は以下の2点です。
========================================================
- Azure Automation と Log Analytics を連携するための構成設定
- Log Analytics における、Automation のジョブの実行結果によるアラート メール送信設定例
========================================================
<参照情報> https://docs.microsoft.com/ja-jp/azure/automation/automation-manage-send-joblogs-log-analytics
上記の情報は OMS ワークスペース のアップグレードが行われる前の情報となり、
クエリの記述方法などに差異がございますので、最新の環境にて検証を行っております、
以下の内容をご参照いただければ幸いです。
■ 要件
1) 2016 年 11 月以降のリリースの Azure PowerShell (v2.3.0)。
2) Log Analytics ワークスペース。 詳細については、「Log Analytics の起動と開始」を参照してください。
3) Azure Automation アカウントの ResourceId
< 事前準備 >
Azure RM モジュールのインストール
AzureからPowerShell経由で情報を照会できるようにするには、
Azure Resource Management(AzureRM)モジュールをインストールする必要があります。
先に進む前に、お使いのコンピュータがパッケージ管理の要件を満たしていることを確認してください。
AzureRMモジュールをインストールするには、以下の手順に従います。
1. [管理者として実行]オプションを使用してPowerShellセッションを開きます。
2.Install-Module -Name AzureRM -Force -Verboseと入力し、Enterキーを押します。
3. インストールが完了するまで待ち、PowerShellのプロンプトに戻ります。
4. モジュールがインストールされたことを確認するために、
Get-Module -Name AzureRM -ListAvailableと入力し、Enterキーを押します。
--------------------------------------------------
1) Azure Automation アカウントと Log Analytics ワークスペースの ResourceId を調べる
--------------------------------------------------
a) PowerShell を起動します。
b) 以下のログイン コマンドを実行し、ログインします。
Login-AzureRmAccount
c) 後に使用するために、出力結果より、 [Environment] の値をコピーしておきます。
※ AzureCloud または AzureGovernment
d) 以下のコマンドを実行します。
# Find the ResourceId for the Automation Account
Find-AzureRmResource -ResourceType "Microsoft.Automation/automationAccounts"
>結果
Name : atamura03om
ResourceId : /subscriptions/0d8ad84b-f76a-40f7-a159-10950893a040/resourceGroups/atamuraOMS/providers/Microsoft.Automation/automationAccounts/atamura03om
ResourceName : atamura03om
ResourceType : Microsoft.Automation/automationAccounts
ResourceGroupName : atamuraOMS
Location : japaneast
SubscriptionId : 0d8ad84b-f76a-40f7-a159-10950893a040
Tags : {}
# Find the ResourceId for the Log Analytics workspace
Find-AzureRmResource -ResourceType "Microsoft.OperationalInsights/workspaces"
>結果
Name : OMSauto01
ResourceId : /subscriptions/0d8ad84b-f76a-40f7-a159-10950893a040/resourceGroups/atamuraOMS/providers/Microsoft.OperationalInsights/workspaces/OMSauto01
ResourceName : OMSauto01
ResourceType : Microsoft.OperationalInsights/workspaces
ResourceGroupName : atamuraOMS
Location : eastus
SubscriptionId : 0d8ad84b-f76a-40f7-a159-10950893a040
-----------------------------------------------
2) OMS ワークスペースを作成する。
--------------------------------------------------
Azure ポータル > Log Analytics より 作成します。
-----------------------------------------------
3 ) OMS Workspace とAutomation アカウントの統合
-----------------------------------------------
以下のコマンドを実行します。
下記は弊社検証環境の Automation アカウント ID ワークスペースID を記述しています。
--------------------------------------------------
[cmdletBinding()]
Param
(
[Parameter(Mandatory=$True)]
[ValidateSet("AzureCloud","AzureUSGovernment")]
[string]$Environment="AzureCloud"
)
#Check to see which cloud environment to sign into.
Switch ($Environment)
{
"AzureCloud" {Login-AzureRmAccount}
"AzureUSGovernment" {Login-AzureRmAccount -EnvironmentName AzureUSGovernment}
}
# 自社環境におけるOMS ワークスペースのリソース ID と Automation アカウントのリソース ID を入力してください。
# 各 ID は ダブルクォーテーションで囲んでください。
$workspaceId = "/subscriptions/0d8ad84b-f76a-40f7-a159-10950893a040/resourceGroups/atamuraOMS/providers/Microsoft.OperationalInsights/workspaces/OMSauto01"
$automationAccountId = "/subscriptions/0d8ad84b-f76a-40f7-a159-10950893a040/resourceGroups/atamuraOMS/providers/Microsoft.Automation/automationAccounts/atamura03om"
Set-AzureRmDiagnosticSetting -ResourceId $automationAccountId -WorkspaceId $workspaceId -Enabled $true
--------------------------------------------------
※ コマンドを実行しますと、Environment の値を求められますので、手順 1) - c) にてコピーしておいた値を入力します。
AzureCloud または AzureGovernment
a) 接続確認
以下のコマンドを実行します。
--------------------------------------------------
[cmdletBinding()]
Param
(
[Parameter(Mandatory=$True)]
[ValidateSet("AzureCloud","AzureUSGovernment")]
[string]$Environment="AzureCloud"
)
#Check to see which cloud environment to sign into.
Switch ($Environment)
{
"AzureCloud" {Login-AzureRmAccount}
"AzureUSGovernment" {Login-AzureRmAccount -EnvironmentName AzureUSGovernment}
}
# 自社環境におけるOMS ワークスペースのリソース ID と Automation アカウントのリソース ID を入力してください。
# 各 ID は ダブルクォーテーションで囲んでください。
$workspaceId = "/subscriptions/0d8ad84b-f76a-40f7-a159-10950893a040/resourceGroups/atamuraOMS/providers/Microsoft.OperationalInsights/workspaces/OMSauto01"
$automationAccountId = "/subscriptions/0d8ad84b-f76a-40f7-a159-10950893a040/resourceGroups/atamuraOMS/providers/Microsoft.Automation/automationAccounts/atamura03om"
Get-AzureRmDiagnosticSetting -ResourceId $automationAccountId
--------------------------------------------------
以下の様な結果が返され、赤文字の部分が ”Enabled” となっていれば正常に接続ができています。
--------------------------------------------------
StorageAccountId :
ServiceBusRuleId :
EventHubAuthorizationRuleId :
Metrics : {
Enabled : True
TimeGrain : PT1M
RetentionPolicy :
Enabled : False
Days : 0}
Logs : {
Enabled : True → True となっていれば設定に成功しています。
Category : JobLogs
RetentionPolicy :
Enabled : False
Days : 0,
Enabled : True
Category : JobStreams
RetentionPolicy :
Enabled : False
Days : 0,
Enabled : True
Category : DscNodeStatus
RetentionPolicy :
Enabled : False
Days : 0}
WorkspaceId : /subscriptions/0d8ad84b-f76a-40f7-a159-10950893a040/resourceGroups/atamuraOMS/providers/Microsoft.OperationalInsights/workspaces/OMSauto01
Id : /subscriptions/0d8ad84b-f76a-40f7-a159-10950893a040/resourcegroups/atamuraoms/providers/microsoft.automation/automationaccounts/atamura03om/providers/microsoft.insights/diagnos
ticSettings/service
Name : service
Type :
Location :
Tags :
--------------------------------------------------
以上で接続処理は完了です。
ジョブの実行結果が正常に送信されることを約一時間程度で確認可能となります。
b ) Log Analytics による、ジョブのログ送信の確認。
Log Analytics を開き、手順 2) - a) にて作成したワークスペースを選択し、OMS ポータルを開きます。
ログ検索メニューより以下のクエリにて検索を実行します。
AzureDiagnostics | where ResourceProvider == "MICROSOFT.AUTOMATION"
※ 過去のジョブの情報は送付されず、OMS との連携設定以降に実行されているジョブの情報が送信されます。
従いまして、本設定以降にジョブが実行されている必要がありますのでご注意ください。
下図のように Automation のジョブ実行結果に関するログが確認できます。
-----------------------------------------------
4 ) Log Analytics によるアラート設定
-----------------------------------------------
以下におきましては、Automation において、失敗、中断のステータスのジョブが発生した際にメールを送信する設定についてご案内いたします。
※ Azure Automation において失敗のステータスのジョブを作成する場合一番簡単な方法は、Azure 実行アカウントを削除した状態にて、実行アカウントを用いた認証を行う方法です。
一時的に削除し、再度作成することで運用上影響はございませんが、実行アカウントの作成権限のないアカウントにて作業をいただく場合には実行アカウント再作成に失敗しますので、ご注意ください。
a) OMS ポータルにおけるログ検索にて、以下のクエリを実行します。
AzureDiagnostics | where ResourceProvider == "MICROSOFT.AUTOMATION" and Category == "JobLogs" and (ResultType == "Failed" or ResultType == "Suspended")
失敗したジョブが存在する場合、以下の様に結果が表示されます。
b) 上図赤枠の [ アラート ] をクリックすると、上記のクエリを基にアラートルールを作成することができます。
今回は失敗もしくは中断ステータスが発生するたびに毎回メール送信するよう、結果の数の閾値を 2以上 (2件以上失敗のステータスがある場合)に設定している例となります。
時間枠および、アラートを確認する頻度に検証用に短く設定しておりますが、適宜貴社のスケジュールに併せご設定ください。
- 時間枠
過去何分以内の結果を対象とするかを設定します。
- アラートの頻度
時間枠に基づいたアラートの件数を何分おきに確認するかを設定します。
c ) ジョブの結果は「完了」ですが、エラーを含むジョブがあるジョブも以下の様に抽出に対応可能です。
前述のとおり、Azure Automation におきましては ジョブのステータスは完了となっておりますが内部的にエラーを出力しており処理が正常に完了していないことに気づきにくいケースがございます。
例えば以下の例では、エラーが記録されたすべてのジョブを抽出し、そこから特定の Runbook のみを指定したクエリに基づくアラートルールを作成しております。
以下のクエリをログ検索フィールドにて入力します。
AzureDiagnostics | where ResourceProvider == "MICROSOFT.AUTOMATION" and Category == "JobStreams" and StreamType_s == "Error" | summarize AggregatedValue = count() by JobId_g
結果としてエラーを含むジョブが一覧で結果として返されます。
上図のように左ペインに結果に含まれる Runbook 名が表示されますの、Runbook 名で結果を絞り込みます。
以下の様なクエリとなり、選択した Rubbook におけるエラーを含むジョブが結果として出力されます。
AzureDiagnostics | where ResourceProvider == "MICROSOFT.AUTOMATION" and Category == "JobStreams" and StreamType_s == "Error"
| where RunbookName_s == "StartByResourceGroupV2-MS-Mgmt-VM"
| summarize AggregatedValue = count() by JobId_g
上記の状態にて アラートルールを作成しますと、ご要望通り、特定の Runbook におけるエラーのみをアラートの対象とすることができます。
------------------------------------
上記で最初に実行しているクエリは、ジョブのステータスを対象にジョブ ID を検索していないため、ストリーム内にエラーを含むすべてのジョブが成功、失敗に関わらず検出されます。
従いまして、ステータスが完了または進行中となっており、かつエラーが記録されているジョブのみを検出する場合、以下の様に記載します。
AzureDiagnostics | where ResourceProvider == "MICROSOFT.AUTOMATION" and Category == "JobStreams" and StreamType_s == "Error" and StreamType_s == "Error" and (ResultType == "In Progress" or ResultType == "Completed")
※ 進行中のジョブはふくめず、完了となっているジョブだけを対象とする場合は以下の様に記述します
AzureDiagnostics | where ResourceProvider == "MICROSOFT.AUTOMATION" and Category == "JobStreams" and StreamType_s == "Error" and StreamType_s == "Error" and ResultType == "Completed"
検索結果は下図のように表示されます。各イベント下部の「表示数を増やす」をクリックしていただくことで、エラーの内容をご覧いただくことができます。
上記の検索結果を基に、アラートルールを作成いただければ、ジョブのステータスとは関係なくエラーを出力しているジョブのみ抽出し、アラートを出力することが可能です。
手順は以上になります。
ご案内させていただいた方法にて少しでも運用コスト削減につなげていただければ幸いです。