JavaScriptを有効にしてください

Logic Apps を使って Azure Resource Graph を Log Analytics にインポートし隊

 ·   4 分で読めます  ·   Kento

Azure Resource Graph を Log Analytics にエクスポートできるという記載を見つけたので試してみました

変更のクエリを実行できる期間は 14 日間です。 保持期間を長くするには、Resource Graph クエリを Azure Logic Apps と統合し、クエリ結果を Log Analytics などの Azure データ ストアに手動でエクスポートし、必要な期間保持できます。

Azure リソースへの変更を分析する - Azure Resource Graph | Microsoft Learn

Azure Resource Graph とは

Azure の構成情報を保持しているサービスです
Azure Resource Graph に対して検索を実施すると、リソース数、リソースの状態 (VM が起動しているとか) などなどを一括検索することができます
ただし、Azure Resource Graph は現在の状態を情報として保持しています
変更分析など、一部の機能では過去の状態も情報として保持していますが、14日間だけです

今回はその制限を克服するため Log Analytics にエクスポートをしてみました

ざっくり手順

  1. Logic Apps の作成
  2. Logic Apps のマネージド ID の有効化
  3. Logic Apps の構成 | Resource Graph の検索
  4. Logic Apps の構成 | Log Analytics へインポート
  5. Logic Apps の構成 | データの整形

シナリオとして「仮想マシンの電源状態」を扱ってみます

1. Logic Apps の作成

プランの種類は [消費] でサクッと作成

portal01
Logic Apps の作成:

2. Logic Apps のマネージド ID の有効化

Rsource Graph の検索をするためには適切な権限が必要です
権限を持っていないリソースの状態を検索することはできません

権限を割り当てるためにマネージド ID を有効化します

portal02
Logic Apps のマネージド ID の有効化:

有効化したマネージド ID に対して権限を与えます
今回は サブスクリプション全体に閲覧権限を与えました

portal03
マネージド ID への権限付与:

3. Logic Apps の構成 | Resource Graph の検索

チュートリアル: ロジック アプリ内で Resource Graph クエリの実行を自動化する - Azure Resource Graph | Microsoft Learn を参考にコードビューに以下の JSON を貼り付けます
※公開情報のままだと 1440分 (1日) に1回の実行で、検証に向いていないため 60分に1回の実行に変更しました

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "HTTP_2": {
                "inputs": {
                    "authentication": {
                        "type": "ManagedServiceIdentity"
                    },
                    "body": {
                        "query": "Resources | where type =~ 'microsoft.compute/virtualmachines' | extend vmPowerState = tostring(properties.extended.instanceView.powerState.code) | summarize count() by vmPowerState"
                    },
                    "headers": {
                        "Content-Type": "application/json"
                    },
                    "method": "POST",
                    "queries": {
                        "api-version": "2021-03-01"
                    },
                    "uri": "https://management.azure.com/providers/Microsoft.ResourceGraph/resources"
                },
                "runAfter": {},
                "type": "Http"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {},
        "triggers": {
            "Recurrence": {
                "recurrence": {
                    "frequency": "Minute",
                    "interval": 60
                },
                "type": "Recurrence"
            }
        }
    },
    "parameters": {}
}
portal04
Logic Apps の構成:

以下の内容が含まれています
トリガー:60分に一度の定期実行
アクション:以下のクエリを Resource Graph で実行

Resources 
| where type =~ 'microsoft.compute/virtualmachines' 
| extend vmPowerState = tostring(properties.extended.instanceView.powerState.code) 
| summarize count() by vmPowerState

この時点で、一度テスト実行してみます

portal05
テスト実行:

無事に成功し、起動中 (running) が1台。割り当て解除 (deallocated) が1台あることがわかりました

portal06
テスト実行の結果:

当たり前ですが、実際の環境と一致しています

portal07
実際の VM の電源状態:

4. Logic Apps の構成 | Log Analytics へインポート

取得したデータを Log Analytics へインポートしてみます
Azure Log Analytics Data Collector - Connectors | Microsoft Learn というコネクタを使ってみます

portal08
Azure Log Analytics Data Collectorの追加:

事前に作成しておいた Log Analytics ワークスペースの ID と キーを入力します

portal09
Log Analytics ワークスペースの設定:

コネクタを通して送るデータには画像の通り [HTTP 2] の結果の body を入れてみます
テーブル名は適当に vmPowerState 決めました
※実際は _CL が付いたテーブル名が作成されます

portal10
送信内容の設定:

保存してテスト実行してみます
少し待つと Log Analytics ワークスペースにログが保存できています

スクリーンショットを確認見ると、不要なデータも保存されており使いずらい状況です
そこで Logic Apps のフローを変更し、綺麗にログが格納されるように工夫してみます

portal11
Log Analytics へのインジェスト結果:

5. Logic Apps の構成 | データの整形

Log Analytics に格納したいデータは [HTTP 2] の結果の body のうち、data の部分だけでした。
そのため、スクリーンショットのように body('HTTP_2')['data'] と変更をしてみます

ややこしいのでテーブル名も vmPowerState01 に変更しておきます

portal12
データの整形:

再度、保存してテスト実行してみます

すると無事に必要なデータだけ Log Analytics ワークスペースにとりこむことができました

portal13
データの整形後のインジェスト結果:

まとめ

Azure Resource Graph のクエリ結果を Log Analytics ワークスペースに取り込むことができました
過去のリソースの状態を保持するには非常に良い方法なんじゃないかなと思います
利用するコネクタを変更することでストレージアカウントに保存することもできます

参考

共有

Kento
著者
Kento
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中