みち草

Azure中心にまとめる技術情報ブログ

コピペで使える Azure Resource Graph サンプル クエリ

はじめに

今回は、Azure のリソース検索に便利な Resource Graph のクエリについてです。
Resource Graph は特定のリソースを検出するうえで非常に便利ですが、 KQL を扱う必要があり、最初のうちはとっつきにくいところがあります。

ということで、コピペでそのまま使えるものをいくつかサンプルとして挙げてみます。
数も少なく IaaS 系ばかりですが、そのまま使用する、ちょっと手を加える、書き方を知るなど、何かしらの参考になれば幸いです。

目次

KQL リファレンス

関数の説明までは載せていないので、KQL のリファレンスを貼っておきます。
以下を参照してもらったり、コメント(先頭にダブルスラッシュでコメント化) したり、値を変えたりして。

KQL クイック リファレンス | Microsoft Docs

もしくはこっちを参照すれば大体載っていると思います。
※左の縦メニューの中に型とか演算子とかいろいろ

Kusto の概要 | Microsoft Docs

SQL がわかる方はここを見ると KQL の理解が早いかもしれません。

SQL から Kusto へのクエリの変換 - Azure Data Explorer | Microsoft Docs

Resource Graph クエリ サンプル

OS 種類別の VM 台数

Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| summarize count() by tostring(properties.storageProfile.osDisk.osType)

実行結果

f:id:kkkzk:20210321021000p:plain
ResourceGraph1

古いスナップショットの上位 10 個

使われず置いたままのスナップショット検索に。

Resources
| where type =~ "Microsoft.Compute/snapshots"
| project name, resourceGroup,properties.timeCreated
| sort by tostring(properties_timeCreated) asc
| take 10

実行結果

f:id:kkkzk:20210321021034p:plain
ResourceGraph2

未接続の管理ディスク

使われず置いたままの管理ディスク検索に。

Resources
| where type =~ "Microsoft.Compute/disks"
| where properties.diskState == "Unattached"

実行結果

f:id:kkkzk:20210321021101p:plain
ResourceGraph3

未接続のパブリック IP アドレス

使われず置いたままのパブリック IP アドレス検索に。

Resources
| where type =~ "Microsoft.Network/publicipaddresses"
| where isnull(properties.ipConfiguration)

実行結果

f:id:kkkzk:20210321021124p:plain
ResourceGraph4

"Blob パブリック アクセスを許可" 設定が有効のストレージ アカウント

ストレージアカウント側の "パブリック アクセス許可" が有効なだけで、 実際にパブリック公開しているかどうかはコンテナー側の設定によります。

Resources
| where type =~ "Microsoft.Storage/storageaccounts"
| where properties.allowBlobPublicAccess == true

実行結果

f:id:kkkzk:20210321021144p:plain
ResourceGraph5

各ストレージ アカウントの "安全な転送が必要" と "Blob パブリックアクセスを許可"、"TLS の最小バージョン" の設定値

原因がわかりませんが、稀に設定値が空欄となり表示されないリソースがあります。
※作成時期が古いものだとなるかも?

Resources
| where type =~ "Microsoft.Storage/storageaccounts"
| project name, resourceGroup, properties.supportsHttpsTrafficOnly, properties.allowBlobPublicAccess, properties.minimumTlsVersion

実行結果

f:id:kkkzk:20210321021205p:plain
ResourceGraph6

Small もしくはインスタンスが 1 台以下の Application Gateway

Small 、もしくはインスタンスが 1 台以下の場合、Application Gateway の SLA 対象外です。

Resources
| where type =~ "Microsoft.Network/applicationgateways"
| where properties.sku.name == "Standard_Small" or properties.sku.capacity <= 1
| project name, properties.sku.name, properties.sku.capacity
| sort by tostring(properties_sku_name), tostring(properties_sku_capacity) asc

実行結果

f:id:kkkzk:20210321021234p:plain
ResourceGraph7

"高速ネットワーク" が無効なネットワーク インターフェイス

これだと NIC の設定値を見ているだけなので、どの VM かがわかりづらいです。
次に VM テーブルとの join 版を掲載しています。

Resources
| where type =~ "Microsoft.Network/NetworkInterfaces"
| where properties.enableAcceleratedNetworking == "false"
| project name, subscriptionId, properties.enableAcceleratedNetworking

実行結果

f:id:kkkzk:20210321021529p:plain
ResourceGraph8

各 VM のネットワーク インターフェイス名と "高速ネットワーク" の設定値 (join 版)

VM のテーブルと NIC のテーブルを join することで、どの VM のどの NIC かがわかりやすくなります。 ※複数 NIC の場合は考慮していません。

Resources
| where type =~ "Microsoft.Compute/virtualmachines"
| project name, resourceGroup, subscriptionId, nic=tostring(split(properties.networkProfile.networkInterfaces[0].id, "/")[8])
| join kind = leftouter ( Resources| where type =~ "Microsoft.Network/NetworkInterfaces") on $left.nic == $right.name
| project vm=name,subscriptionId, resourceGroup, nic, enableAcceleratedNetworking=properties.enableAcceleratedNetworking

実行結果

f:id:kkkzk:20210321021310p:plain
ResourceGraph9

VM の情報と、使用している Dedicated Host 名

Resources
| where type =~ "Microsoft.Compute/virtualmachines"
| project name, resourceGroup, subscriptionId,  dedicatedHost=split(properties.host.id,"/")[8]

実行結果 f:id:kkkzk:20210415100238p:plain

Basic ロードバランサー

Resources
| where type =~ "Microsoft.Network/Loadbalancers"
| where sku.name != "Standard"

実行結果 f:id:kkkzk:20210427230145p:plain

終わりに

あっさりですが、今回はサンプルの紹介でした。
クエリについては習うより慣れろで実際に動かしてみるのが一番かと思いますので、リファレンスを見つつ実際に動かしてみてください。

関数を使いこなせればもっといろいろできて楽しそうなのですが、自分でもまだそこまで扱えておらず join をちょっと試したくらい…
同じような、使ってみたいけどよーわからん、という方の参考になれば嬉しいです。
また、今後新しいクエリを作成できたら、更新していきたいと思います。