1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Azure Monitor のログアラートの対象ログを入手する

Last updated at Posted at 2023-03-01

やりたいこと

通知されたログアラートの詳細情報を取得するために、このアラートで実行されたログクエリの実行結果 (このアラートの対象ログ) を取得したいです。

ここでは、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 を指定し、 ComputerRenderedDescription で分割します。

image.png

そして、下図のようなログが収集されたとします。

image.png

その結果、アラートが発報されると、ディメンション分割で指定したカラムの値ごとに分割されます。

image.png

各アラートの概要を見ると、ディメンション分割で指定したカラムの値ごとにアラートが発報されたことが分かります。

image.png
※クリックして、大きい画像でご覧ください。

ログアラートの対象ログを取得

ディメンション分割されたログアラートの場合のログクエリの実行結果の取得方法は前述のとおりですが、各プロパティに掲載されている URL で取得できるログクエリの実行結果が以下のように異なります。

  • linkToFilteredSearchResultsAPI (linkToFilteredSearchResultsUI)
    ディメンション分割で指定されたカラムの値で絞り込む条件が含まれるログクエリの実行結果が取得できる。

  • linkToSearchResultsAPI (linkToSearchResultsUI)
    アラートルールで設定したログクエリの実行結果が取得できる。

それでは、以下で上記の違いを確認してみます。

Azure ポータルから確認

Azure ポータルからでも、発報されたアラートの対象ログを確認することができます。

下図の「アラートの詳細」の [Filtered search results] が linkToFilteredSearchResultsUI に相当するもので、[Search results] が linkToSearchResultsUI に相当します。

image.png

それぞれの [View query results] リンクをクリックすると、それぞれのログクエリの実行結果を表示することができます。

  • [Filtered search results] (linkToFilteredSearchResultsUI)
    [Filtered search results] では、ログクエリにディメンション分割で指定されたカラムの値で絞り込む条件 (赤枠の部分) が追加されて、その実行結果を確認することができます。この実行結果は、発報されたログアラートの対象ログだと言えます。
    image.png

  • [Search results] (linkToSearchResultsUI)
    一方、[Search results] では、該当のアラートルールで設定したログクエリの実行結果を確認することができます。この実行結果は、発報されたログアラートの対象ログ以外のもの (赤枠の部分) も含まれてしまっているため、望んだログが得られません。
    image.png

以上のことから、発報されたログアラートの対象ログは、linkToFilteredSearchResultsAPI (linkToFilteredSearchResultsUI) から取得したほうが良いということが分かりました。

REST API から取得

[ディメンションで分割する] の [リソース ID 列] で _ResourceId を指定すると、Azure リソースのログに対して直接クエリを実行することができます。

よって、発報されたアラートの本文の alertContext 配下にある linkToFilteredSearchResultsAPI および linkToSearchResultsAPI に掲載されている URL は、以下のような Azure リソースからログクエリを実行する URL となります。

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 閲覧者ロール」を割り当てました。

image.png

それでは、Postman を使って、発報されたアラートの対象ログを取得してみます。

まず、以下のドキュメントを参考に Azure AD アクセストークンを取得して、リクエストヘッダーに取得したアクセストークンをセットします。

そして、Postman で実行結果は下図のとおりです。これで、発報されたアラートの対象ログを取得することができました。

image.png
※レスポンス本文を JSON 形式で表示するとすべての内容がキャプチャに収まらなかったので、Text 形式に切り替えています。

なお、ここでは Azure AD にアプリケーションを登録して、そのアプリケーションにロールを割り当ててやってみましたが、マネージド ID を用いても同じように発報されたアラートの対象ログを取得することができます。

次回につづく

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?