やりたいこと
通知されたログアラートの詳細情報を取得するために、このアラートで実行されたログクエリの実行結果 (このアラートの対象ログ) を取得したいです。
ここでは、Azure Monitor アラートルールのアクションで、[共通アラートスキーマ] を有効にし、通知されるアラートの本文が「共通アラートスキーマ」の定義 (アラートを生成した監視サービスまたはソリューション (essentials
配下の monitoringService
プロパティ) が「Log Alerts V2」) で届くことを前提としています。
Log Alerts V2 の場合のログアラート
monitoringService=Log Alerts V2
の場合のログアラートの本文には、アラートルールで実行されたログクエリの実行結果は含まれておらず、alertContext
配下の linkToFilteredSearchResultsAPI
プロパティ、または linkToSearchResultsAPI
プロパティに掲載されている URL にアクセス (HTTP GET) することで、ログクエリの実行結果 (JSON 形式) を取得することができます。
また、GUI (Azure ポータル) で対象ログを確認したい場合は、alertContext
配下の linkToFilteredSearchResultsUI
プロパティ、または linkToSearchResultsUI
プロパティに掲載されている URL にブラウザーでアクセスすると、ログクエリのページを開くことができます。
ディメンション分割
アラートルールでディメンションを使用すると、ひとつのルールで複数のリソース インスタンスを監視することができ、発報されるアラートは、ディメンションで指定したカラムの値ごとで分割 (グループ化) されます。
ディメンション分割されたログアラート
たとえば、下図のような条件のログアラートルールを用意します。
[ディメンションで分割する] の [リソース ID 列] で _ResourceId
を指定し、 Computer
と RenderedDescription
で分割します。
そして、下図のようなログが収集されたとします。
その結果、アラートが発報されると、ディメンション分割で指定したカラムの値ごとに分割されます。
各アラートの概要を見ると、ディメンション分割で指定したカラムの値ごとにアラートが発報されたことが分かります。
ログアラートの対象ログを取得
ディメンション分割されたログアラートの場合のログクエリの実行結果の取得方法は前述のとおりですが、各プロパティに掲載されている URL で取得できるログクエリの実行結果が以下のように異なります。
-
linkToFilteredSearchResultsAPI
(linkToFilteredSearchResultsUI
)
ディメンション分割で指定されたカラムの値で絞り込む条件が含まれるログクエリの実行結果が取得できる。 -
linkToSearchResultsAPI
(linkToSearchResultsUI
)
アラートルールで設定したログクエリの実行結果が取得できる。
それでは、以下で上記の違いを確認してみます。
Azure ポータルから確認
Azure ポータルからでも、発報されたアラートの対象ログを確認することができます。
下図の「アラートの詳細」の [Filtered search results] が linkToFilteredSearchResultsUI
に相当するもので、[Search results] が linkToSearchResultsUI
に相当します。
それぞれの [View query results] リンクをクリックすると、それぞれのログクエリの実行結果を表示することができます。
-
[Filtered search results] (
linkToFilteredSearchResultsUI
)
[Filtered search results] では、ログクエリにディメンション分割で指定されたカラムの値で絞り込む条件 (赤枠の部分) が追加されて、その実行結果を確認することができます。この実行結果は、発報されたログアラートの対象ログだと言えます。
-
[Search results] (
linkToSearchResultsUI
)
一方、[Search results] では、該当のアラートルールで設定したログクエリの実行結果を確認することができます。この実行結果は、発報されたログアラートの対象ログ以外のもの (赤枠の部分) も含まれてしまっているため、望んだログが得られません。
以上のことから、発報されたログアラートの対象ログは、linkToFilteredSearchResultsAPI
(linkToFilteredSearchResultsUI
) から取得したほうが良いということが分かりました。
REST API から取得
[ディメンションで分割する] の [リソース ID 列] で _ResourceId
を指定すると、Azure リソースのログに対して直接クエリを実行することができます。
よって、発報されたアラートの本文の alertContext
配下にある linkToFilteredSearchResultsAPI
および linkToSearchResultsAPI
に掲載されている URL は、以下のような Azure リソースからログクエリを実行する URL となります。
https://api.loganalytics.io/v1/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/<providerName>/<resourceType>/<resourceName>/query
また、返却されるレスポンスの本文は、テーブルオブジェクトの配列を含む JSON 形式の文字列が返されます。詳しくは、以下のドキュメントをご参照ください。
Azure リソースのログに対して直接クエリを実行する URL にリクエストするには、Azure AD アクセストークンが必要です。
ここでは、Postman を使ってアクセスしてみるので、Azure AD にアプリケーションを登録します。以下のドキュメントを参考に操作します。
ログクエリの実行結果を取得するため、対象の Azure リソース (今回は仮想マシン) でアプリケーション (Postman) に対してロールを割り当てます。上記のドキュメントでは、「閲覧者ロール」を割り当てていますが、筆者が試した際は下図のように 「Log Analytics 閲覧者ロール」を割り当てました。
それでは、Postman を使って、発報されたアラートの対象ログを取得してみます。
まず、以下のドキュメントを参考に Azure AD アクセストークンを取得して、リクエストヘッダーに取得したアクセストークンをセットします。
そして、Postman で実行結果は下図のとおりです。これで、発報されたアラートの対象ログを取得することができました。
※レスポンス本文を JSON 形式で表示するとすべての内容がキャプチャに収まらなかったので、Text 形式に切り替えています。
なお、ここでは Azure AD にアプリケーションを登録して、そのアプリケーションにロールを割り当ててやってみましたが、マネージド ID を用いても同じように発報されたアラートの対象ログを取得することができます。