はじめに
先日の投稿で、Azure Log Analytics ワークフローにログ (Power Automate クラウド フローの実行履歴) をインポートする際、「Azure Log Analytics Data Collector」コネクタの「Send Data (送信データ)」アクションを使いました。
しかし、Azure Monitor HTTP Data Collector API で作成されたテーブルは、「データ エクスポート」や「基本ログ」などが利用できません。
これらの機能を利用するためには、データ収集ルールベースのカスタム テーブルに移行する必要があります。
よって、今回は先日の投稿で構築した環境でこれらの機能を利用するために、以下の 3 点 (下図の緑色の部分) を行います。
- Azure Monitor HTTP Data Collector API で作成されたテーブルをデータ収集ルール (DCR:Data Collection Rule) ベースのものに移行する
- データ収集エンドポイント (DCE:Data Collection Endpoint) と データ収集ルールを作成する
- ロジックアプリで収集した Power Automate クラウド フローの実行履歴を Logs ingestion API を使って Azure Log Analytics ワークスペースにインポートする
データ収集ルールベースのテーブルに移行
以下のドキュメントを参考に、Azure Monitor HTTP Data Collector API で作成されたテーブルをデータ収集ルールベースのものに移行します。
「Log Analytics 共同作成者」ロールを割り当てる
Azure Log Analytics ワークスペースで「Log Analytics 共同作成者」ロールを割り当てます。
今回は、Postman を使って操作するので、先日の投稿で Azure AD に登録したアプリケーションのサービス プリンシパルにこのロールを割り当てます。
移行対象のテーブルを移行
以下の API に対してリクエストします。
POST /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.operationalinsights/workspaces/{workspaceName}/tables/{tableName}/migrate?api-version=2021-12-01-preview
パス | 設定値 |
---|---|
{subscriptionId} |
Log Analytics ワークスペースが属する サブスクリプション ID |
{resourceGroupName} |
Log Analytics ワークスペースが属する リソース グループ名 |
{workspaceName} |
Log Analytics ワークスペース名 |
{tableName} |
移行対象のテーブル名 |
なお、api-version
は、執筆時では 2021-12-01-preview
を指定しました。
※すでに「プライベート プレビュー」でないため
Postman でリクエストする場合は、Azure AD から取得したアクセストークンとともに、以下の URL にリクエストを送信します。
POST https://management.azure.com/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/ppt-dev-sys-d-rg-3/providers/microsoft.operationalinsights/workspaces/ppt-dev-sys-d-ws-1/tables/FlowRunHistory_CL/migrate?api-version=2021-12-01-preview
※Azure CLI 「az rest」 を使ってもできます。
その後、Log Analytics ワークスペースの [設定] カテゴリ配下の [テーブル (プレビュー)] を開くと、移行したテーブルを見つけることができます。
これで、Azure Monitor でデータ収集エンドポイント (DCE) とデータ収集ルール (DCR) を構成できるようになります。
データ収集エンドポイントとデータ収集ルールを作成
ここでは、以下のことを行います。
- データ収集エンドポイント (DCE) を作成する
- データ収集ルール (DCR) を作成する
- DCR リソースで「監視メトリック発行者」ロールを割り当てる
データ収集エンドポイントを作成
データ収集エンドポイントは、Azure Monitor に追加できるデータ取り込みのインターフェースです。
概要については、以下のドキュメントをご参照ください。
それでは、以下のチュートリアル (Create data collection endpoint) を参考に、Azure ポータルでリソースを作成します。
注意点として、データ収集エンドポイントは、データが送信される Azure Log Analytics ワークスペースと同じリージョンにデプロイする必要があります。
データ収集ルールを作成
データ収集ルールは、Azure Log Analytics ワークスペースへのデータ取り込みパイプライン (ETL:Extract Transform Load みたいな) です。
概要については、以下のドキュメントをご参照ください。
ARM テンプレートを作成
それでは、以下のチュートリアル (Create data collection rule) を参考に、このチュートリアルに掲載されている ARM (Azure Resource Manager) テンプレートを加工してデプロイに用います。
※今回のケース (移行) では、Azure ポータルでは作れなかったため。
まず、以下のように ARM テンプレートを作ってみました。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"dataCollectionRuleName": {
"type": "String",
"metadata": {
"description": "Specifies the name of the Data Collection Rule to create."
}
},
"location": {
"defaultValue": "japaneast",
"allowedValues": [
"japaneast",
"japanwest"
],
"type": "String",
"metadata": {
"description": "Specifies the location in which to create the Data Collection Rule."
}
},
"workspaceResourceId": {
"type": "String",
"metadata": {
"description": "Specifies the Azure resource ID of the Log Analytics workspace to use."
}
},
"workspaceName": {
"type": "String",
"metadata": {
"description": "Specifies the name of the Log Analytics workspace to use."
}
},
"endpointResourceId": {
"type": "String",
"metadata": {
"description": "Specifies the Azure resource ID of the Data Collection Endpoint to use."
}
}
},
"resources": [
{
"type": "Microsoft.Insights/dataCollectionRules",
"apiVersion": "2021-09-01-preview",
"name": "[parameters('dataCollectionRuleName')]",
"location": "[parameters('location')]",
"properties": {
"dataCollectionEndpointId": "[parameters('endpointResourceId')]",
"streamDeclarations": {
"Custom-FlowRunRawData": {
"columns": [
{
"name": "Time",
"type": "datetime"
},
{
"name": "EnvironmentName",
"type": "string"
},
{
"name": "FlowName",
"type": "string"
},
{
"name": "DisplayName",
"type": "string"
},
{
"name": "RunName",
"type": "string"
},
{
"name": "StartTime",
"type": "datetime"
},
{
"name": "EndTime",
"type": "datetime"
},
{
"name": "Status",
"type": "string"
}
]
}
},
"destinations": {
"logAnalytics": [
{
"workspaceResourceId": "[parameters('workspaceResourceId')]",
"name": "[parameters('workspaceName')]"
}
]
},
"dataFlows": [
{
"streams": [
"Custom-FlowRunRawData"
],
"destinations": [
"[parameters('workspaceName')]"
],
"transformKql": "source | project TimeGenerated = Time, EnvironmentName_g = toguid(EnvironmentName), FlowName_g = toguid(FlowName), DisplayName_s = DisplayName, RunName_s = RunName, StartTime_t = StartTime, EndTime_t = EndTime, Status_s = Status",
"outputStream": "Custom-FlowRunHistory_CL"
}
]
}
}
],
"outputs": {
"dataCollectionRuleId": {
"type": "String",
"value": "[resourceId('Microsoft.Insights/dataCollectionRules', parameters('dataCollectionRuleName'))]"
}
}
}
DCR では、次のプロパティを構成します。
プロパティ | 設定内容 |
---|---|
dataCollectionEndpointId |
データ収集エンドポイントのリソース ID を指定 |
streamDeclarations |
データ収集エンドポイントで受信するソースデータ (JSON) の列を定義 |
destinations |
宛先の Azure Log Analytics ワークスペース (リソース ID とワークスペース名) を指定 |
dataFlows |
データフローのルールを定義 |
以下より、streamDeclarations
プロパティと dataFlows
プロパティについて、さらに深掘りします。
streamDeclarations プロパティ
先日の投稿で、ログとして保存したい情報をピックアップしたところを参考に、各列の名前とデータ型を定義します。
Azure Monitor HTTP Data Collector API を利用した場合では、TimeGenerated
フィールド (ログが記録されたときのタイムスタンプ) 値は指定してもしなくてもどちらでも良かったですが、Logs ingestion API ではこれは必須となりますので、TimeGenerated
フィールドに挿入するための列 (上図では Time
) を追加します。
"streamDeclarations": {
"Custom-FlowRunRawData": {
"columns": [
{
"name": "Time",
"type": "datetime"
},
{
"name": "EnvironmentName",
"type": "string"
},
{
"name": "FlowName",
"type": "string"
},
{
"name": "DisplayName",
"type": "string"
},
{
"name": "RunName",
"type": "string"
},
{
"name": "StartTime",
"type": "datetime"
},
{
"name": "EndTime",
"type": "datetime"
},
{
"name": "Status",
"type": "string"
}
]
}
}
dataFlows プロパティ
配下の各パラメーターについて説明します。
- streams
入力ストリームの名前を指定します。
ここでは、streamDeclarations
プロパティの Custom-FlowRunRawData
を指定します。
"streams": [
"Custom-FlowRunRawData"
]
- destinations
フローがデータを送信する宛先の名前を指定します。
ここでは、宛先となる Azure Log Analytics ワークスペース名を指定します。
"destinations": [
"[parameters('workspaceName')]"
]
- transformKql
ソースデータをカスタムテーブルに保存する前に変換するためのクエリを記述します。チュートリアルを参考に Kusto クエリ言語で書きました。
"transformKql": "source | project TimeGenerated = Time, EnvironmentName_g = toguid(EnvironmentName), FlowName_g = toguid(FlowName), DisplayName_s = DisplayName, RunName_s = RunName, StartTime_t = StartTime, EndTime_t = EndTime, Status_s = Status"
記述したクエリについて、以下で簡単に説明します。
source
| project
TimeGenerated = Time,
EnvironmentName_g = toguid(EnvironmentName),
FlowName_g = toguid(FlowName),
DisplayName_s = DisplayName,
RunName_s = RunName,
StartTime_t = StartTime,
EndTime_t = EndTime,
Status_s = Status
TimeGenerated
フィールドに挿入する値は前述したとおり必須なので、そのために用意した Time
列の値を挿入します。
EnvironmentName_g
と FlowName_g
フィールドのデータ型は guid
であり、ソースデータの EnvironmentName
と FlowName
列のデータ型は string
なので、値を変換して挿入します。
その他のフィールドはソースデータ側、カスタムテーブル側ともに同じデータ型なので、そのまま値を挿入します。
- outputStream
前述で移行したカスタムテーブル名を指定します。
ここでは、Custom-FlowRunHistory_CL
を指定します。このカスタムテーブル名の先頭にプリフィックス Custom-
が付いていますが、これはデータ収集ルールに宛先がカスタムテーブルであることを示すために付いています。
"outputStream": "Custom-FlowRunHistory_CL"
デプロイ
前述で作成した ARM テンプレートを用いてデプロイします。
必要な情報をメモっておく
デプロイする際に必要な情報 (リソース ID) をメモっておきます。
- Workspace Resource Id
宛先の Azure Log Analytics ワークスペースの「リソース ID」をメモっておきます。対象リソースの [JSON ビュー] を開いて「リソース ID」を入手します。
- Endpoint Resource Id
データ収集エンドポイントの「リソース ID」をメモっておきます。先ほどと同様の手順で「リソース ID」を入手します。
カスタム テンプレートのデプロイ
それでは、デプロイします。
[カスタム テンプレートのデプロイ] を開き、[エディターで独自のテンプレートを作成する] をクリックします。
エディターに前述で作成した ARM テンプレートをコピペして [保存] をクリックします。
各パラメーターを入力して [確認と作成] をクリックし、データ収集ルールを作成します。
パラメーター | 設定値 |
---|---|
サブスクリプション | デプロイ先のサブスクリプション |
リソース グループ | デプロイ先のリソース グループ |
リージョン | デプロイ先のリージョン |
Data Collection Rule Name | デプロイするデータ収集ルールの名前 |
Location | リージョンと同じもの |
Workspace Resource Id | 先ほど入手した Azure Log Analytics ワークスペースのリソース ID |
Workspace Name | Azure Log Analytics ワークスペース名 |
Endpoint Resource Id | 先ほど入手したデータ収集エンドポイントのリソース ID |
「監視メトリック発行者」ロールを割り当てる
データ収集ルールが作成できたら、アプリケーションにそのルールへのアクセス許可を付与します。
先日の投稿で Azure AD に登録したアプリケーションのサービス プリンシパルに「監視メトリック発行者」ロールを割り当てます。
これにより、アプリケーションがデータ収集エンドポイントとデータ収集ルールにデータを送信できるようになります。
ロジックアプリで収集した Power Automate クラウド フローの実行履歴を Logs ingestion API を使って Azure Log Analytics ワークスペースにインポート
Azure AD アクセストークンを取得
Logs ingestion API にアクセスするために、まず Azure AD からアクセストークンを取得します。
先日の投稿で Azure AD に登録したアプリケーションから以下の値をメモっておきます。
- アプリケーション (クライアント) ID
- クライアント シークレット
- ディレクトリ (テナント) ID
そして、HTTP アクションの各パラメーターを入力します。
パラメーター | 設定値 |
---|---|
メソッド | POST |
URI | https://login.microsoftonline.com/{ディレクトリ (テナント) ID}/oauth2/v2.0/token |
ヘッダー | キー : Content-Type 値 : application/x-www-form-urlencoded
|
本文 | client_id={アプリケーション (クライアント) ID}&scope=https://monitor.azure.com//.default&client_secret={クライアント シークレット}&grant_type=client_credentials |
Azure Log Analytics ワークスペースにインポート
必要な情報をメモっておく
- データ収集エンドポイントのログ インジェスト URI
前述で作成したデータ収集エンドポイントの「ログ インジェスト URI」をメモっておきます。
- データ収集ルールの Immutable Id
前述で作成したデータ収集ルールの「Immutable Id」をメモっておきます。対象リソースの [JSON ビュー] を開いて、リソース JSON から「immutableId」の値を入手します。
Logs ingestion API にログを POST
Logs ingestion API の完全な URI は、以下のようになります。
{DCE のログ インジェスト URI}/dataCollectionRules/{DCR の Immutable Id}/streams/{ストリーム名}
https://ppt-dev-sys-d-dce-bat-1-xxxx.japaneast-1.ingest.monitor.azure.com/dataCollectionRules/dcr-dd0d8a0722db4b6d886ddaa9f5b19691/streams/Custom-FlowRunRawData
そして、HTTP アクションの各パラメーターを入力します。
パラメーター | 設定値 |
---|---|
メソッド | POST |
URI | Logs ingestion API の完全な URI |
ヘッダー | (1)キー : Authorization (1)値 : Bearer {Azure AD アクセストークン} (2)キー : Content-Type (2)値 : application/json
|
クエリ | キー : api-version 値 : 2021-11-01-preview
|
本文 | 「Get Flow Run」アクションの実行後にログとしてピックアップした情報を格納した変数 |
Azure Log Analytics ワークスペースで検索してみる
先日の投稿と同様に、送信されたログデータが格納されているか確認するため、以下のクエリを実行します。
FlowRunHistory_CL
| order by TimeGenerated desc nulls last
| project TimeGenerated, DisplayName_s, RunName_s, StartTime_t, EndTime_t, Status_s, EnvironmentName_g, FlowName_g
同様に Power Automate クラウド フローの実行履歴が格納されていることが確認できました。
まとめ
この投稿では、HTTP Data Collector API で作成されたテーブルをデータ収集ルールベースのものに移行し、ログデータのインポートする手段を HTTP Data Collector API から Logs ingestion API に置き換えました。
データ収集ルールベースのテーブルに移行しても HTTP Data Collector API で Azure Log Analytics ワークスペースにログデータをインポートすることはできます。ただし、データのエクスポートルールを追加していたとしても、HTTP Data Collector API を介したログデータはこのルールには適用されません (エクスポートされません) でした。
また、このようにカスタムテーブルを移行するケースでデータ収集ルールを作成する場合、現時点 (執筆時) では ARM テンプレートを用いてデプロイする方法しかありません。今後に期待しましょう。