この記事は更新から24ヶ月以上経過しているため、最新の情報を別途確認することを推奨いたします。
初めに
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