Azure Resource Manager から取得した情報を使って Azure Monitor Workbook を作る

azure
Published: 2023-04-12

はじめに

Azure には自分なりのダッシュボードを作るための「Azure Monitor Workbook」という機能があります。この機能を使うと、標準の Azure ポータルには存在しない画面を作れます。次の画面は、私が試しに作った「Azure の仮想マシンと Azure Arc-enabled servers を一覧で見られるダッシュボード」です。標準の Azure ポータルからこれら2つのリソースを見ようとするとページを行き来する必要があるので、一つの画面にまとまっていると意外と便利です。

試しに作ったダッシュボード

このようなダッシュボードを作るためは Azure Monitor Workbook で Resource Graph を利用します。Resource Graph には Azure のリソースの情報が格納されています。この情報を Azure Monitor Workbook から呼び出して加工することで、Azure の仮想マシンと Azure Arc-enabled serves を一覧で並べています。今回利用しているクエリは次の通りです。

Workbook 上での設定画面

resources
| where type == "microsoft.compute/virtualmachines" or type == "microsoft.hybridcompute/machines"
| extend osSku = case(
    type == "microsoft.compute/virtualmachines", strcat(properties.storageProfile.imageReference.offer, " ", properties.storageProfile.imageReference.sku) ,
    type == "microsoft.hybridcompute/machines", properties.osSku,
    ""
    )
| project id, name, resourceGroup, location, osSku

やりたいこと

Azure Monitor Workbook を利用して「Azure Monitor Agent がインストールされているマシンとデータ収集ルール、データ収集エンドポンとの紐づきを簡単に確認できるダッシュボード」を作ることにしました。

Azure ポータルではデータ収集ルール単位で紐づいている仮想マシンやデータ収集エンドポイントを確認できます。ですが、検証をしていると「このマシンに紐づいているデータ収集ルールはどれだっけ」という観点で確認したくなります。この確認を Azure ポータルでやろうとすると、全てのデータ収集ルールを一つずつ確認しなければなりません。

課題

「Azure Monitor Agent がインストールされているマシンとデータ収集ルール、データ収集エンドポンとの紐づき」の可視化には課題があります。それは Resource Graph に「マシンとデータ収集ルール、データ収集エンドポンとの紐づき」を実現している Microsoft.Insights/dataCollectionRuleAssociations の情報が格納されていないことです。これでは Resource Graph を利用してダッシュボードを作成できません。

解決策

こんな状況で役に立つのが Azure Monitor Workbook から Azure Resource Manager を呼び出す方法です。Azure Monitor Workbook はデータのソースとして Azure Resource Manager をサポートしています。Resource Graph に格納されていないのなら、ARM から直接取ってきてしまおうというアプローチで対応します。

実装

次の URL に対して GET 要求を投げると、該当の仮想マシンに紐づいているデータ収集ルールとデータ収集エンドポイントを取得できます。

/subscriptions/<SUB-ID>/resourceGroups/<RG-NAME>/providers/Microsoft.Compute/virtualMachines/<VM-NAME>/providers/Microsoft.Insights/dataCollectionRuleAssociations?api-version=2021-09-01-preview

というわけで、まずは ARM の呼び出しに対して、マシンのリソース ID を動的に渡す方法を実現する必要があります。Azure Monitor Workbook にはクエリの結果をパラメータとして保存して他のクエリで利用できる仕組みがありますので、これを利用します。

Workbook の上部にマシンの一覧を表示する画面を作ります。

マシンの一覧を表示する画面

画面内で選択された仮想マシンの id を id というパラメータで利用できるようにします。

選択したマシンの id をパラメータ化する設定

そして、ARM を呼び出す画面のパスの欄で {id} という形でパラメータを参照します。すると、一覧で選んだ仮想マシンに応じて、ARM の呼び出しのパスが動的に変化します。

パラメータを参照する ARM 要求

ただし、そのままだと画面に API で取得した値がそのまま画面に表示されてしまいます。

表示された API の値

必要な部分だけ表示できれば良いので、結果の形式を JSON パスにして、表示したい部分のパスを指定します。API で取得した値は次のようになっているので、マシンに紐づいているデータ収集ルールのパスは $.value[*].properties.dataCollectionRuleId になります。同様にマシンに紐づいているデータ収集エンドポイントは $.value[*].properties.dataCollectionEndpointId になります。

{
  "value": [
    {
      "properties": {
        "dataCollectionRuleId": "/subscriptions/<SUB-ID>/resourcegroups/<RG-NAME>/providers/microsoft.insights/datacollectionrules/ama-check3"
      },
      "id": "/subscriptions/<SUB-ID>/resourceGroups/<RG-NAME>/providers/microsoft.compute/virtualmachines/amacheck2/providers/Microsoft.Insights/dataCollectionRuleAssociations/ama-check3-association",
      "name": "ama-check3-association",
      "type": "Microsoft.Insights/dataCollectionRuleAssociations"
    },
    {
      "properties": {
        "dataCollectionEndpointId": "/subscriptions/<SUB-ID>/resourceGroups/<RG-NAME>/providers/Microsoft.Insights/dataCollectionEndpoints/amacheck-dce"
      },
      "id": "/subscriptions/<SUB-ID>/resourceGroups/<RG-NAME>/providers/Microsoft.Compute/virtualMachines/amacheck2/providers/Microsoft.Insights/dataCollectionRuleAssociations/configurationAccessEndpoint",
      "name": "configurationAccessEndpoint",
      "type": "Microsoft.Insights/dataCollectionRuleAssociations"
    }
  ],
  "nextLink": null
}

データ収集ルールを表示する JSON パス

以上の実装を駆使して作った Azure Monitor Workbook は次の通りです。上のマシン一覧からマシンを選択すると、選択した仮想マシンに紐づいているデータ収集ルールとデータ収集エンドポイントが下に表示されます。私としてはとても便利。

作成した Workbook の動き

参考:作成した Workbook のテンプレート

まとめ

Azure Monitor Workbook の Azure Resource Manager を呼び出す機能を利用して、Resource Graph だけでは実現できないダッシュボードを作ってみました。「Resource Graph に格納されている情報だけでは Workbook を作れない!」となった際には Azure Resource Manager の呼び出しを思い出してあげてください。

Note

  • 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
  • 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
  • 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。