PowerShellでAzure Resource Graphを自動実行し組織全体のリソースを可視化する方法

Azure Resource Graphは、Azureリソースを横断的に検索・分析するための強力なツールです。通常、Azureポータルではリソースの一覧表示やフィルタリングが可能ですが、大規模な環境では手作業での確認が困難になります。特に、複数のサブスクリプションにまたがるリソース管理では、統一的な可視化と効率的な分析が求められます。

そこで、PowerShellを活用しAzure Resource Graphのクエリを自動実行することで、組織全体のリソースを横断的に可視化する方法が有効です。これにより、手動の確認作業を削減し、迅速な情報収集と分析が可能になります。また、定期的なスクリプト実行を設定することで、リソースの異常検知やコスト最適化に活用することもできます。

本記事では、Azure Resource Graphの基本概念からPowerShellを用いたクエリ実行、スケジュール実行の自動化、さらに実践的な応用例まで詳しく解説します。これにより、Azure環境の管理をより効率的に行うための技術を身につけることができます。

目次

Azure Resource Graphの概要

Azure Resource Graphは、Azure環境全体のリソース情報を効率的に検索・分析するためのツールです。AzureポータルやPowerShell、Azure CLIなどから利用でき、大規模な環境でも高速なクエリ実行が可能になります。

Azure Resource Graphの特徴

  • 大規模環境向けの検索機能
    数千、数万単位のリソースを瞬時に検索し、必要な情報を取得できます。
  • 複数のサブスクリプションを横断的に検索可能
    一つのクエリで組織全体のリソースを管理・可視化できます。
  • Kusto Query Language(KQL)を使用
    柔軟で強力なクエリ言語を活用し、詳細な検索条件を指定できます。
  • PowerShellやAzure CLIからの実行が可能
    コマンドラインベースでスクリプトを作成し、自動化が容易になります。

Resource Graphの適用シナリオ

  1. リソースのインベントリ管理
  • 企業全体のAzureリソースの一覧を取得し、可視化する。
  1. コンプライアンス監査
  • セキュリティポリシーに準拠していないリソースを特定する。
  1. コスト最適化
  • 使用されていないリソースを特定し、不要なコストを削減する。
  1. リソースの異常検出
  • 予期しない変更や未承認のリソース作成を検知する。

Azure Resource Graphを活用することで、手作業での確認に頼ることなく、効率的にAzureリソースの状態を把握できるようになります。次のセクションでは、Resource Graphのクエリの基本構造について詳しく解説します。

Azure Resource Graphのクエリの基本構造

Azure Resource Graphでは、Kusto Query Language(KQL)を使用してAzureリソースを効率的に検索・分析できます。KQLは、Azure MonitorやLog Analyticsでも使用されるクエリ言語で、高速なデータ処理が可能です。

基本的なクエリ構文

Azure Resource Graphのクエリは、以下の基本構造を持ちます。

Resources
| where type == "microsoft.compute/virtualmachines"
| project name, location, resourceGroup
| order by name asc

クエリの各要素

  1. Resources
  • Azure Resource Graphのデータソース。Azureのすべてのリソースを対象とする。
  1. where
  • フィルター条件を指定する(例:リソースの種類が「Virtual Machines」)。
  1. project
  • 必要なフィールドのみを取得する(例:リソース名、リージョン、リソースグループ)。
  1. order by
  • 結果を昇順 (asc) や降順 (desc) で並び替える。

よく使うクエリ例

1. すべての仮想マシン(VM)を取得

Resources
| where type == "microsoft.compute/virtualmachines"

2. リソースグループごとのストレージアカウント一覧

Resources
| where type == "microsoft.storage/storageaccounts"
| summarize count() by resourceGroup

3. 東日本リージョンにあるリソースを検索

Resources
| where location == "japaneast"
| project name, type, resourceGroup

4. 作成日時の新しいリソースを上位10件取得

Resources
| order by properties.createdTime desc
| take 10

クエリの実行方法

Azure Resource Graphのクエリは、以下の方法で実行できます。

  1. Azureポータル → 「Resource Graph Explorer」を開く
  2. PowerShellSearch-AzGraph コマンドを使用
  3. Azure CLIaz graph query コマンドを使用

次のセクションでは、PowerShellを用いてAzure Resource Graphのクエリを実行する方法について詳しく解説します。

PowerShellでAzure Resource Graphを操作する準備

Azure Resource GraphをPowerShellで利用するには、必要なモジュールのインストールやAzureへのログインが必要です。ここでは、環境の準備手順について説明します。

1. PowerShellの実行環境を準備する

Azure Resource Graphを操作するには、Azure PowerShell モジュールが必要です。以下のコマンドを実行して、最新のモジュールをインストールまたは更新してください。

# 最新のAzure PowerShellモジュールをインストール
Install-Module -Name Az -Scope CurrentUser -Force -AllowClobber

# 既にインストールされている場合は、最新バージョンに更新
Update-Module -Name Az

補足

  • モジュールが未インストールの場合、初回実行時にインストールを求められる場合があります。
  • -Scope CurrentUser を指定することで管理者権限なしでインストールできます。

2. Azureアカウントにログインする

Azure Resource Graphを利用するには、Azureアカウントにログインする必要があります。以下のコマンドを実行してください。

# Azureにログイン
Connect-AzAccount

成功すると、Azureのサブスクリプション情報が表示されます。複数のサブスクリプションがある場合、以下のコマンドで使用するサブスクリプションを指定できます。

# 使用するサブスクリプションを指定
Set-AzContext -SubscriptionId "your-subscription-id"

3. Azure Resource Graphモジュールのインストール

Azure Resource GraphをPowerShellで操作するためには、Az.ResourceGraph モジュールを使用します。以下のコマンドでインストールしてください。

# Azure Resource Graphモジュールをインストール
Install-Module -Name Az.ResourceGraph -Scope CurrentUser -Force

インストールが完了したら、正しく動作するか確認するために、以下のコマンドを実行します。

# Azure Resource Graphモジュールの確認
Get-Command -Module Az.ResourceGraph

4. Azure Resource Graphのサポート状態を確認

現在の環境でAzure Resource Graphが使用可能か確認するには、以下のコマンドを実行します。

# サブスクリプションでResource Graphが利用可能か確認
Get-AzResourceGraphQuery -Query "Resources | limit 1"

エラーが出ずに結果が表示されれば、正常にセットアップが完了しています。


次のセクションでは、実際にPowerShellスクリプトを用いてAzure Resource Graphを自動実行する方法について解説します。

PowerShellスクリプトでResource Graphを自動実行する方法

PowerShellを用いてAzure Resource Graphのクエリを自動実行することで、組織全体のリソースを定期的に収集し、分析することが可能になります。ここでは、実際のスクリプトを交えてその方法を解説します。


1. 基本的なAzure Resource Graphクエリの実行

PowerShellでは、Search-AzGraph コマンドを使用してResource Graphのクエリを実行できます。以下の例では、すべての仮想マシン(VM)の一覧を取得します。

# Azure Resource Graphクエリを実行
$query = "Resources | where type == 'microsoft.compute/virtualmachines' | project name, location, resourceGroup"

# クエリの実行
$result = Search-AzGraph -Query $query

# 結果を表示
$result | Format-Table -AutoSize

このスクリプトは、組織全体の仮想マシンの名前・リージョン・リソースグループを取得し、表形式で表示します。


2. サブスクリプションを横断するクエリの実行

Azure Resource Graphは複数のサブスクリプションを横断して検索できます。以下のスクリプトでは、すべてのサブスクリプションを対象にクエリを実行します。

# サブスクリプションをすべて取得
$subscriptions = Get-AzSubscription

# すべてのサブスクリプションでクエリを実行
foreach ($sub in $subscriptions) {
    Set-AzContext -SubscriptionId $sub.Id
    $query = "Resources | where type == 'microsoft.compute/virtualmachines' | project name, location, resourceGroup"
    $result = Search-AzGraph -Query $query
    Write-Host "=== Subscription: $($sub.Name) ==="
    $result | Format-Table -AutoSize
}

このスクリプトは、すべてのサブスクリプションでVMを検索し、各サブスクリプションごとに結果を表示します。


3. クエリ結果をCSVファイルに保存

クエリ結果をCSVファイルに出力することで、後で分析しやすくなります。以下のスクリプトでは、結果を AzureResources.csv に保存します。

# クエリの定義
$query = "Resources | where type == 'microsoft.compute/virtualmachines' | project name, location, resourceGroup"

# クエリの実行
$result = Search-AzGraph -Query $query

# CSVファイルとして保存
$result | Export-Csv -Path "AzureResources.csv" -NoTypeInformation

Write-Host "クエリ結果をAzureResources.csvに保存しました。"

4. スクリプトの自動実行設定(タスクスケジューラ)

PowerShellスクリプトを定期的に実行するには、Windowsのタスクスケジューラを使用します。

手順:

  1. PowerShellスクリプトを保存
    上記のスクリプトを C:\Scripts\AzureQuery.ps1 として保存します。
  2. タスクスケジューラを開く
  • 「タスクスケジューラ」を開きます。
  • 「基本タスクの作成」から新しいタスクを追加します。
  1. トリガーの設定
  • 実行頻度(毎日・毎時間など)を指定します。
  1. アクションの設定
  • 「プログラムの開始」を選択し、以下を入力:
    • プログラム/スクリプト: powershell.exe
    • 引数の追加: -File "C:\Scripts\AzureQuery.ps1"
  1. 完了
  • タスクを保存し、スケジュール通りに実行されることを確認します。

5. ログの出力とエラーハンドリング

スクリプトの実行状況を確認するために、ログファイルを作成し、エラーが発生した場合に記録する仕組みを追加できます。

# ログファイルのパス
$logPath = "C:\Scripts\AzureQuery.log"

# クエリの実行
try {
    $query = "Resources | where type == 'microsoft.compute/virtualmachines' | project name, location, resourceGroup"
    $result = Search-AzGraph -Query $query
    $result | Export-Csv -Path "AzureResources.csv" -NoTypeInformation
    Add-Content -Path $logPath -Value "$(Get-Date) - クエリ実行成功"
} catch {
    Add-Content -Path $logPath -Value "$(Get-Date) - エラー: $_"
}

このスクリプトを実行すると、成功した場合は AzureResources.csv に結果が保存され、エラーが発生した場合は AzureQuery.log にエラーメッセージが記録されます。


まとめ

  • Search-AzGraph コマンドを使うことで、PowerShellでAzure Resource Graphのクエリを実行できる。
  • 複数のサブスクリプションを横断して検索可能。
  • クエリ結果をCSVファイルに保存し、分析に活用できる。
  • タスクスケジューラを使って自動化することで、定期的な実行が可能。
  • ログ機能を実装することで、エラー時の原因追跡が容易になる。

次のセクションでは、組織全体のリソースを横断的に確認するテクニックについて詳しく解説します。

組織全体のリソースを横断的に確認するテクニック

Azure Resource Graphを活用すれば、複数のサブスクリプションにまたがるリソースを横断的に検索・分析できます。大規模な組織では、異なるチームやプロジェクトごとに複数のAzureサブスクリプションを持つことが一般的ですが、これらを個別に管理するのは非効率です。

ここでは、Azure Resource GraphとPowerShellを組み合わせて、組織全体のリソースを包括的に可視化する方法を解説します。


1. すべてのサブスクリプションのリソースを取得する

Azure Resource Graphのクエリは、デフォルトですべてのサブスクリプションを対象に検索を実行できます。以下のPowerShellスクリプトを使用すれば、組織全体のリソース一覧を取得できます。

# すべてのサブスクリプションのリソースを取得
$query = "Resources | project name, type, location, subscriptionId"

# クエリの実行
$result = Search-AzGraph -Query $query

# 結果を表示
$result | Format-Table -AutoSize

このスクリプトでは、リソースの名前、種類、リージョン、サブスクリプションIDを一覧で表示します。特に subscriptionId を含めることで、どのサブスクリプションに属しているかを明確にできます。


2. サブスクリプションごとのリソース数を集計

組織全体のリソース数をサブスクリプションごとに集計したい場合、以下のクエリを使用します。

$query = "Resources | summarize count() by subscriptionId"

$result = Search-AzGraph -Query $query

$result | Format-Table -AutoSize

出力例:

subscriptionId                     count_
----------------------------------  ------
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  320
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy  150

このように、各サブスクリプションにどれだけのリソースが存在するか を素早く確認できます。


3. 使用していないリソースの検出

コスト削減やガバナンスの観点から、使用されていないリソース(例えば、稼働していない仮想マシン)を特定することが重要です。以下のスクリプトでは、停止中の仮想マシンを検索します。

$query = @"
Resources
| where type == 'microsoft.compute/virtualmachines'
| where properties.extended.instanceView.powerState == 'VM deallocated'
| project name, resourceGroup, subscriptionId
"@

$result = Search-AzGraph -Query $query

$result | Format-Table -AutoSize

このスクリプトを実行すると、停止状態 (VM deallocated) の仮想マシン一覧を取得できます。


4. 特定のタグが設定されていないリソースを検索

Azureでは、タグを利用してリソースの分類を管理するのが一般的です。しかし、タグが設定されていないリソースがあると、管理が煩雑になります。以下のクエリでは、特定のタグ(例: Environment)が設定されていないリソースを検索できます。

$query = @"
Resources
| where isnull(tags['Environment'])
| project name, type, subscriptionId
"@

$result = Search-AzGraph -Query $query

$result | Format-Table -AutoSize

このクエリを使えば、タグ管理の不備を素早く特定し、改善策を講じることができます。


5. 組織全体のストレージアカウントの公開状態を確認

セキュリティ対策として、ストレージアカウントの公開設定をチェックすることは重要です。以下のクエリを使用すれば、インターネットに公開されているストレージアカウントを検出できます。

$query = @"
Resources
| where type == 'microsoft.storage/storageaccounts'
| where properties.allowBlobPublicAccess == true
| project name, resourceGroup, subscriptionId
"@

$result = Search-AzGraph -Query $query

$result | Format-Table -AutoSize

このスクリプトを定期的に実行することで、セキュリティリスクを早期に発見できます。


6. クエリ結果をJSONまたはCSVに保存

クエリ結果をCSVやJSONに保存することで、後から分析しやすくなります。

CSVファイルに保存:

$result | Export-Csv -Path "AzureResources.csv" -NoTypeInformation

JSONファイルに保存:

$result | ConvertTo-Json -Depth 10 | Out-File "AzureResources.json"

これにより、Power BIなどの外部ツールでデータを可視化しやすくなります。


まとめ

  • Azure Resource Graphを使用すると、組織全体のリソースを横断的に検索できる。
  • 複数のサブスクリプションを対象に、効率的にリソースの情報を取得・分析可能。
  • タグ未設定のリソースや停止中の仮想マシン、公開ストレージアカウントなどのリスクを検出できる。
  • クエリ結果をCSVやJSONに保存することで、さらなる分析に活用可能。

次のセクションでは、クエリ結果をCSVやJSON形式で出力する方法について詳しく解説します。

クエリ結果をCSVやJSON形式で出力する方法

Azure Resource Graphのクエリ結果をCSVやJSON形式で保存すると、後の分析やレポート作成が容易になります。特に、大規模な組織ではデータの可視化や外部ツールとの連携が重要です。ここでは、PowerShellを用いてAzure Resource Graphのデータをエクスポートする方法を解説します。


1. CSV形式でエクスポートする

CSV(Comma Separated Values)形式は、ExcelやPower BIなどのツールで簡単に扱うことができます。以下のスクリプトは、Azureリソースの一覧を取得し、CSVファイルに保存する方法を示します。

# クエリの定義(仮想マシンの一覧を取得)
$query = @"
Resources
| where type == 'microsoft.compute/virtualmachines'
| project name, location, resourceGroup, subscriptionId
"@

# クエリの実行
$result = Search-AzGraph -Query $query

# 結果をCSVファイルとして保存
$csvPath = "C:\Reports\AzureResources.csv"
$result | Export-Csv -Path $csvPath -NoTypeInformation

Write-Host "クエリ結果を $csvPath に保存しました。"

ポイント:

  • Export-Csv -NoTypeInformation を使用すると、不要な型情報を除外できます。
  • $csvPath にファイルの保存先を指定できます。(例: "C:\Reports\AzureResources.csv"

2. JSON形式でエクスポートする

JSON(JavaScript Object Notation)形式は、構造化データの保存に適しており、APIやデータ分析ツールとの連携に便利です。以下のスクリプトは、AzureリソースのデータをJSON形式で保存する方法を示します。

# クエリの定義
$query = @"
Resources
| where type == 'microsoft.compute/virtualmachines'
| project name, location, resourceGroup, subscriptionId
"@

# クエリの実行
$result = Search-AzGraph -Query $query

# 結果をJSONファイルとして保存
$jsonPath = "C:\Reports\AzureResources.json"
$result | ConvertTo-Json -Depth 10 | Out-File $jsonPath

Write-Host "クエリ結果を $jsonPath に保存しました。"

ポイント:

  • ConvertTo-Json -Depth 10 を使用して、入れ子構造(ネストされたデータ)を正しく出力。
  • Out-File を使用してJSONファイルに保存。

3. ファイル保存を自動化する

スクリプトをスケジュール実行し、定期的にデータを保存することで、リソースの変化を監視できます。以下のスクリプトは、現在の日付を含むファイル名でエクスポートし、履歴を残す方法です。

# 日付付きのファイル名を作成
$date = Get-Date -Format "yyyyMMdd-HHmm"
$csvPath = "C:\Reports\AzureResources_$date.csv"
$jsonPath = "C:\Reports\AzureResources_$date.json"

# クエリの定義
$query = @"
Resources
| where type == 'microsoft.compute/virtualmachines'
| project name, location, resourceGroup, subscriptionId
"@

# クエリの実行
$result = Search-AzGraph -Query $query

# CSVとJSONに保存
$result | Export-Csv -Path $csvPath -NoTypeInformation
$result | ConvertTo-Json -Depth 10 | Out-File $jsonPath

Write-Host "CSV: $csvPath"
Write-Host "JSON: $jsonPath"

このスクリプトの利点:

  • Get-Date -Format "yyyyMMdd-HHmm" を使って、ファイル名に日付を追加。
  • 履歴を保持できるので、過去のデータと比較可能。

4. ファイルをクラウドストレージにアップロード

データをAzure StorageやOneDriveに自動アップロードすることで、他のチームと共有できます。

Azure Storageにアップロード

# Azure Storageアカウントの情報
$storageAccountName = "yourstorageaccount"
$containerName = "reports"
$storageKey = "your-storage-key"

# Azureストレージアカウントに接続
$context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageKey

# ファイルをアップロード
Set-AzStorageBlobContent -File $csvPath -Container $containerName -Blob (Split-Path $csvPath -Leaf) -Context $context

5. ファイルをメールで送信する

PowerShellでメールを送信し、Azureリソースのレポートを定期的に受け取ることも可能です。

# メールの設定
$smtpServer = "smtp.office365.com"
$from = "your-email@example.com"
$to = "recipient@example.com"
$subject = "Azureリソースレポート"
$body = "最新のAzureリソース一覧を添付しています。"

# 添付ファイル
$attachment = "C:\Reports\AzureResources.csv"

# メール送信
Send-MailMessage -SmtpServer $smtpServer -UseSsl -Credential (Get-Credential) `
-From $from -To $to -Subject $subject -Body $body -Attachments $attachment

ポイント:

  • Send-MailMessage を使用して、レポートを自動送信。
  • Get-Credential で送信者の認証情報を入力。

まとめ

  • Export-Csv でクエリ結果をCSV形式で保存 → Excelなどで分析可能
  • ConvertTo-Json でJSON形式で保存 → APIやデータ分析ツールと連携可能
  • 日付付きのファイル名で保存すれば、過去データとの比較が容易
  • Azure Storageやメール送信機能を活用すれば、レポートの自動配信が可能

次のセクションでは、スクリプトをスケジュール実行し、自動化する方法について詳しく解説します。

自動化のためのスケジュール実行と監視設定

Azure Resource Graphのクエリを定期的に実行し、リソースの変化を自動で監視することで、不要なコストの削減やセキュリティリスクの早期発見が可能になります。
ここでは、PowerShellスクリプトをWindowsのタスクスケジューラを使用して自動化する方法を解説します。


1. PowerShellスクリプトを準備する

まず、Azure Resource Graphのクエリを定期実行するPowerShellスクリプトを作成します。
以下のスクリプトでは、Azureリソースの一覧を取得し、CSVとして保存する処理を行います。

# ログの記録
$logPath = "C:\Reports\AzureQuery.log"
Add-Content -Path $logPath -Value "$(Get-Date) - スクリプト開始"

# クエリ定義(すべてのリソース一覧)
$query = @"
Resources
| project name, type, location, subscriptionId
"@

# クエリ実行
try {
    $result = Search-AzGraph -Query $query
    $csvPath = "C:\Reports\AzureResources_$(Get-Date -Format 'yyyyMMdd-HHmm').csv"
    $result | Export-Csv -Path $csvPath -NoTypeInformation
    Add-Content -Path $logPath -Value "$(Get-Date) - クエリ成功: $csvPath"
} catch {
    Add-Content -Path $logPath -Value "$(Get-Date) - エラー発生: $_"
}

ポイント:

  • Azure Resource Graph を利用し、すべてのリソースを一覧取得
  • $(Get-Date -Format 'yyyyMMdd-HHmm') で日付をつけたファイルを生成
  • try {} を使い、エラー発生時にログを記録
  • C:\Reports\AzureQuery.log に実行結果を記録

このスクリプトを C:\Scripts\AzureQuery.ps1 というファイル名で保存します。


2. Windowsタスクスケジューラで自動実行を設定する

① タスクスケジューラを開く

  1. Windowsキー + R を押し、taskschd.msc と入力し Enter
  2. 「タスク スケジューラ ライブラリ」内で「基本タスクの作成」をクリック

② 基本タスクを作成

  1. 名前: Azure Resource Graph Query
  2. 説明: Azure Resource Graphのクエリを定期実行し、結果をCSVに保存
  3. トリガー: 毎日(または 1時間ごと など必要に応じて設定)

③ アクションを設定

  1. プログラムの開始 を選択
  2. プログラム/スクリプト: powershell.exe
  3. 引数の追加:
   -ExecutionPolicy Bypass -File "C:\Scripts\AzureQuery.ps1"
  1. 開始(オプション): C:\Scripts\

④ タスクの設定を確認

  • 「タスクのプロパティを開く」にチェックを入れて完了
  • 「最上位の特権で実行する」にチェック(管理者権限で実行する場合)

確認:

  1. 設定が完了したら、「タスク スケジューラ」から手動で「実行」して動作確認
  2. C:\Reports\ にCSVファイルが生成されているかチェック

3. スクリプトの監視設定(エラーハンドリング)

定期実行されたスクリプトが正常に動作しているかを確認するために、エラーログを監視 する方法を紹介します。

エラー通知をメールで送信

エラーが発生した場合に管理者にメールで通知するスクリプトを追加します。

# メール送信の設定
$smtpServer = "smtp.office365.com"
$from = "your-email@example.com"
$to = "admin@example.com"
$subject = "Azure Resource Graph クエリ実行エラー"
$body = "スクリプトの実行中にエラーが発生しました。ログファイルを確認してください。"

# エラーログの確認
$logPath = "C:\Reports\AzureQuery.log"
$logContent = Get-Content $logPath | Select-String "エラー"

# エラーがあればメール送信
if ($logContent) {
    Send-MailMessage -SmtpServer $smtpServer -UseSsl -Credential (Get-Credential) `
    -From $from -To $to -Subject $subject -Body $body
}

このスクリプトの利点:

  • ログファイル内に "エラー" の文字が含まれていた場合にメールを送信
  • Send-MailMessage を利用して、管理者に通知

4. Azure Monitorを活用した監視

Azure Monitor を使用すれば、Azure Resource Graphのデータを監視し、異常があった場合にアラートを発信できます。

① Log AnalyticsでAzure Resource Graphを監視

  1. Azureポータルにログイン
  2. 「Monitor」→「Log Analytics ワークスペース」を開く
  3. 「クエリ」タブで Resources を検索
  4. 異常リソース(未使用VM、タグ未設定リソースなど)をクエリ
   Resources
   | where isnull(tags['Environment'])
  1. アラートを設定し、Teamsやメールに通知

まとめ

  • Windowsタスクスケジューラを利用し、スクリプトを定期実行
  • エラーログを記録し、異常時にはメールで通知
  • Azure Monitorを活用し、リソースの変化を監視

次のセクションでは、リソースの異常検出とアラート通知の設定方法を詳しく解説します。

応用例:リソースの異常検出とアラート通知

Azure Resource GraphとPowerShellを組み合わせることで、リソースの異常検出を自動化し、メールやMicrosoft Teamsで通知を行うことができます。本セクションでは、異常検出の具体例とアラート通知の設定方法を解説します。


1. 異常なリソースの検出

異常なリソースとは?

  • 停止中の仮想マシン(未使用VM) → コスト削減の対象
  • タグ未設定のリソース → 管理が難しくなる
  • インターネットに公開されたストレージアカウント → セキュリティリスク
  • 過剰に作成されたリソース → 意図しないデプロイの可能性

2. 異常検出クエリの作成

① 停止中の仮想マシンを検出

$query = @"
Resources
| where type == 'microsoft.compute/virtualmachines'
| where properties.extended.instanceView.powerState == 'VM deallocated'
| project name, resourceGroup, subscriptionId
"@

未使用VMを特定し、コスト削減のための削除候補にする

② タグが設定されていないリソースを検出

$query = @"
Resources
| where isnull(tags['Environment'])
| project name, type, subscriptionId
"@

タグなしリソースを特定し、運用ポリシーに従って分類

③ インターネットに公開されたストレージアカウントを検出

$query = @"
Resources
| where type == 'microsoft.storage/storageaccounts'
| where properties.allowBlobPublicAccess == true
| project name, resourceGroup, subscriptionId
"@

セキュリティリスクがあるストレージを特定し、設定変更を推奨


3. PowerShellで異常検出&メール通知

異常を検出し、管理者にメール通知を送るPowerShellスクリプトを作成します。

# ログの記録
$logPath = "C:\Reports\AzureAlerts.log"
Add-Content -Path $logPath -Value "$(Get-Date) - スクリプト開始"

# クエリ(停止中のVMを検索)
$query = @"
Resources
| where type == 'microsoft.compute/virtualmachines'
| where properties.extended.instanceView.powerState == 'VM deallocated'
| project name, resourceGroup, subscriptionId
"@

# クエリの実行
try {
    $result = Search-AzGraph -Query $query

    # 結果をログに記録
    if ($result.Count -gt 0) {
        $csvPath = "C:\Reports\AzureAlerts_$(Get-Date -Format 'yyyyMMdd-HHmm').csv"
        $result | Export-Csv -Path $csvPath -NoTypeInformation
        Add-Content -Path $logPath -Value "$(Get-Date) - 異常検出: $csvPath"

        # メール通知の設定
        $smtpServer = "smtp.office365.com"
        $from = "your-email@example.com"
        $to = "admin@example.com"
        $subject = "【警告】停止中のVMが検出されました"
        $body = "停止中のVMリストを添付しています。"

        # メール送信
        Send-MailMessage -SmtpServer $smtpServer -UseSsl -Credential (Get-Credential) `
        -From $from -To $to -Subject $subject -Body $body -Attachments $csvPath
    }
} catch {
    Add-Content -Path $logPath -Value "$(Get-Date) - エラー発生: $_"
}

ポイント:

  • 異常リソースをCSVに保存
  • 異常があればメール通知
  • エラー発生時にログを記録

4. Microsoft Teamsに通知を送る

メールだけでなく、Microsoft Teamsにも異常を通知 できます。
Incoming Webhook を利用すると、PowerShellからTeamsにメッセージを送信できます。

① Webhookの設定

  1. Microsoft Teamsのチームで、「Connectors」 を開く
  2. 「Incoming Webhook」 を追加し、Webhook URLを取得

② PowerShellスクリプトでTeamsに通知

# Microsoft Teams Webhook URL
$teamsWebhookUrl = "https://outlook.office.com/webhook/xxxxx"

# Teams通知メッセージ
$teamsMessage = @{
    title = "Azureリソース異常検出"
    text = "停止中の仮想マシンが検出されました。詳細はCSVファイルを確認してください。"
}

# JSONデータに変換
$teamsBody = ConvertTo-Json -Depth 3 -InputObject $teamsMessage

# TeamsにPOSTリクエスト
Invoke-RestMethod -Uri $teamsWebhookUrl -Method Post -ContentType "application/json" -Body $teamsBody

5. Azure Monitorでアラート設定

PowerShellスクリプトの手動監視が面倒な場合、Azure Monitorのアラート機能 を利用することも可能です。

Azure Monitorで異常を監視する手順

  1. Azureポータルにログイン
  2. 「Monitor」 → 「アラート」 → 「ルールの作成」
  3. シグナルを選択(例: Azure Resource Graph のクエリ結果)
  4. 異常リソースがある場合にアラートをトリガー
  5. 通知アクションに メールやTeamsを設定

まとめ

  • PowerShellでAzure Resource Graphを使い、異常リソースを検出
  • 異常検出後にメールやTeamsで管理者に通知
  • Azure Monitorのアラートと連携し、監視を自動化

次のセクションでは、本記事のまとめを行います。

まとめ

本記事では、PowerShellを用いてAzure Resource Graphを自動実行し、組織全体のリソースを可視化する方法を詳しく解説しました。

  • Azure Resource Graphの基本概念 を理解し、効率的にリソースを検索・分析できることを学びました。
  • PowerShellを活用してクエリを自動実行する方法 を具体的なスクリプトとともに紹介しました。
  • 複数のサブスクリプションを横断してリソースを管理するテクニック を解説しました。
  • 取得したデータをCSVやJSONに保存し、定期的な監視を可能にする方法 を紹介しました。
  • スケジュール実行を設定してPowerShellスクリプトを自動化する方法 を学びました。
  • 異常リソース(停止中のVM、タグ未設定リソース、公開ストレージ)の検出方法 を説明しました。
  • メールやMicrosoft Teamsで異常通知を行う方法 を紹介し、運用の自動化を進める手法を解説しました。

PowerShellとAzure Resource Graphを組み合わせることで、Azureリソースの管理が大幅に効率化され、コスト削減やセキュリティ強化につながります。ぜひ、本記事で紹介したスクリプトを活用し、組織のAzure環境の可視化と監視を自動化してみてください。

コメント

コメントする

目次