Log Analyticsの検索クエリ結果を自動保存する

初めに

 Log Analyticsの検索クエリ結果については、Azure ポータルからcsvファイルとして保存することが出来ます。この処理を自動化することはできないかと考え、検索クエリ結果をAzure Automationを用いて自動的にAzure Blob Storageに保存する方法を検証したので、今回はその結果について記載します。

目次

1.基本方針
2.前提条件
3.事前準備
4.手順概要
5.作業手順
 1) Azure AD Web Applicationの作成
 2) 必要情報の確認 
 3) Log Analytics ワークスペースのアクセス制御(IAM)設定
 4) Azure Automation Runbookの作成
 5) Azure Automation Runbookのスケジュール設定
6.動作確認 

 

1.基本方針

 Azure Automationを使用する以上、Log Analyticsの検索クエリはGUIではなくPowerShell等で実行する必要が有ります。今回はAzure AutomationにてPowerShell Runbookを作成し、検索クエリを実行するための処理を記載します。その際「Azure Log Analytics REST API」を使用します。また、検索クエリ結果の保存先はblob storageとします。

 

2.前提条件

・Azure PowerShellのモジュールはAz モジュールとします。Azure AutomationにAzモジュールがインポートされ、Azコマンドが実行可能な状態であることを前提とします。
・Azure サブスクリプションが関連付けられているAzure ADの操作権限が有ることを前提とします。

 

3.事前準備

 事前に以下のリソースを作成します。
 ・Log Analytics ワークスペース
 ・Azure Automation アカウント
 ・ストレージアカウント
 ・仮想マシン

 更に仮想マシンをLog Analytics ワークスペースのデータソースとして追加し、検索クエリにて仮想マシンのHeartbeatを取得できるようにします。ストレージアカウントについては、クエリ結果を保存するためのコンテナ―を作成しておきます。

 

4.手順概要

以下の流れで設定を進めます。
1) Azure AD Web Applicationの作成
2) 必要情報の確認
3) Log Analytics Workspaceのアクセス制御(IAM)設定
4) Azure Automation Runbookの作成
5) Azure Automation Runbookのスケジュール設定

 

5.作業手順

1) Azure AD Web Applicationの作成

 基本方針に記載した通り今回は「Azure Log Analytics REST API」使用します。その為にはAzure AD Web Applicationを作成する必要が有ります。まず初めにAzure ポータルへログインし、Azure Active Directoryの画面を開きます。

「アプリの登録」を選択します。

「新規登録」を選択します。

以下の通り設定値を入力し「登録」を選択します。
名前:Azure AD Web アプリケーションにつける任意の名前(今回は Access Log Analytics とします。)
リダイレクト URI:http://localhost:3000/login

作成されたアプリケーションを選択します。

「証明書とシークレット」を選択します。

「新しいクライアントシークレット」を選択します。

「追加」を選択します。
※今回は検証であるため有効期限は既定とします。

表示されたクライアントシークレットを控えます。

「APIのアクセス許可」を選択します。

「アクセス許可の追加」を選択します。

「所属する組織で使用しているAPI」を選択します。

「Log Analytics API」を選択します。

「委任されたアクセス許可」を選択して「Data.Read」をチェックし「アクセス許可の追加」を選択します。


2) 必要情報の確認

 再度、作成したAzure AD Web アプリケーションを選択し以下の2つのIDを確認します。
・アプリケーションID
・ディレクトリID

次にサブスクリプションを開き、サブスクリプションIDを確認します。

以上の3つのIDとWeb アプリケーション作成時に控えたクライアントシークレットをRunbook作成時に使用します。

3) Log Analytics ワークスペースのアクセス制御(IAM)設定

 今回使用するLog Analytics Workspaceを開き「アクセス制御(IAM)」を選択します。

「追加」-「ロールの割り当て追加」を選択し、「Access Log Analytics」に「Log Analytics 閲覧者」のロールを割り当て「保存」を選択します。


4) Azure Automation Runbookの作成

 Automation アカウントを開いて「Runbook」-「Runbookの作成」を選択し、新規でPowerShell Runbookを作成します。

Runbookの編集画面が開きます。

以下のPowerShellスクリプトを記載し「公開」を選択します。

#Azure へログイン
$connectionName = "AzureRunAsConnection"
$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         

Login-AzAccount `
        -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 

#パラメータ設定
$tenantId = "Azure AD のディレクトリID"
$clientId       = "Azure AD Web アプリケーションのアプリケーションID"      
$clientSecret   = "Azure AD Web アプリケーションのクライアントシークレット"  

$subscriptionId = "サブスクリプションのサブスクリプションID"
$workspaceRgName="Log Analyticsワークスペースのリソースグループ名"
$workspacename = "Log Analyticsワークスペース名"

$strageAccountRgName = "ストレージアカウントのリソースグループ名"
$strageAccountName = "ストレージアカウント名"
$containerName = "ストレージアカウントのコンテナー名"

#認証Tokenの取得
$loginURL       = "https://login.microsoftonline.com/$tenantId/oauth2/token"
$resource       = "https://management.azure.com/"         
$body           = @{grant_type="client_credentials";resource=$resource;client_id=$clientId;client_secret=$clientSecret}
$oauth          = Invoke-RestMethod -Method Post -Uri $loginURL -Body $body
$headerParams = @{"Authorization" = "Bearer " + $oauth.access_token} 

#検索クエリ例(12月の全Heartbeatを取得)
$body = @{query = 
'let startdatetime=datetime(2019-12-01T00:00:00);
let enddatetime=datetime(2019-12-30T23:59:59);
Heartbeat | where TimeGenerated between(startdatetime .. enddatetime)
'
}| ConvertTo-Json

#REST APIの呼び出し(検索クエリの実行)
$url="https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$workspaceRgName/providers/Microsoft.OperationalInsights/workspaces/$workspacename/api/query?api-version=2017-01-01-preview"
$result = Invoke-RestMethod -UseBasicParsing -Headers $headerParams -Uri $url -Method Post -Body $body -ContentType "application/json"

#検索クエリ結果の整形
$headerRow = $null
$headerRow = $result.tables[0].columns | Select-Object ColumnName
$columnsCount = $headerRow.Count
$logData = @()
foreach ($row in $result.tables[0].rows) {
    $data = new-object PSObject
    for ($i = 0; $i -lt $columnsCount; $i++) {
        $data | add-member -membertype NoteProperty -name $headerRow[$i].ColumnName -value $row[$i]
    }
    $logData += $data
    $data = $null
}

#Azure Automationのローカル環境へCSV出力
$logData | export-csv .\logAnalytics.csv -NoTypeInformation

#csvファイルをblobへアップロード
$storageAccount = Get-AzStorageAccount -ResourceGroupName $strageAccountRgName -Name $strageAccountName
$ctx = $storageAccount.Context
Set-AzStorageBlobContent -File ".\logAnalytics.csv" -Container $containerName -Blob "logAnalytics.csv" -Context $ctx -Force
```

5) Azure Automation Runbookのスケジュール設定

 最後にRunbookにAzure Automationのスケジュールを関連付ければ作業は終了です。Runbookを開き「スケジュール」-「スケジュールの追加」を選択します。

「スケジュールをRunbookにリンクします」-「新しいスケジュールを作成します」を選択し、任意の新しいスケジュールを作成し「OK」を選択します。

6.動作確認

 検索クエリ結果保存先に指定したストレージアカウントのコンテナーを開きcsvファイルが保存されていることを確認します。

また、csvファイルを開いて以下のようにクエリ結果が保存されていることを確認します。

動作を確認することが出来たところで今回は終了とします。

7.参考資料

Azure Log Analytics REST API
https://dev.loganalytics.io/documentation/Overview

いいね (この記事が参考になった人の数:3)
(↑参考になった場合はハートマークを押して評価お願いします)
読み込み中...

注意事項・免責事項

※技術情報につきましては投稿日時点の情報となります。投稿日以降に仕様等が変更されていることがありますのでご了承ください。

※公式な技術情報の紹介の他、当社による検証結果および経験に基づく独自の見解が含まれている場合がございます。

※これらの技術情報によって被ったいかなる損害についても、当社は一切責任を負わないものといたします。十分な確認・検証の上、ご活用お願いたします。

※当サイトはマイクロソフト社によるサポートページではございません。パーソルプロセス&テクノロジー株式会社が運営しているサイトのため、マイクロソフト社によるサポートを希望される方は適切な問い合わせ先にご確認ください。
 【重要】マイクロソフト社のサポートをお求めの方は、問い合わせ窓口をご確認ください