Log Analytics / Sentinel のログ取り込み時にフィルターをかけるワークスペース変換 DCR の使い方

# 本記事について

Azure Log Analytics や Microsoft Sentinel にログを送るときに、不要なデータを削減したり、逆に列を追加して取り込み後に利用しやすくしたりしたいケースがあるかと思います。Azure Monitor Agent で取り込むデータについては、Data Collection Rule (DCR) にて簡単に扱えますが、Azure リソースログなどプラットフォーム側で送られるログなどは別の方式でこのフィルタリングを行います。その方式が、本記事でご紹介する[ワークスペース変換 DCR](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/tutorial-workspace-transformations-portal) です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/18423a09-216a-8a4d-496e-b663f7b293ed.png)

なお本機能は、2022年11月に（ひっそりと) 一般提供開始のアナウンスがされています。

https://techcommunity.microsoft.com/t5/azure-observability-blog/announcing-ga-of-revamped-custom-logs-features/ba-p/3687366

この記事では、Azure AD サインインログ (SigninLogs) を例に、ワークスペース変換DCRで不要なレコードやカラムを削減したり、逆にユーザー独自のカラムを追加したりする方法を見ていきます。

# Azure Log Analytics における変換について

Azure Log Analytics での変換は、大きく分けて以下の3方式があります

* Azure Monitor Agent の DCR による変換

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/233ed156-a081-f0dc-e665-464c0e15db07.png)

* カスタムログ用のログインジェスト API の DCR による変換

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/78f5b865-1e74-051a-601a-d330394b2076.png)

* Log Analytics ワークスペースに直接適用されるワークスペース変換 DCR による変換

本記事では３つめのワークスペース変換 DCR を扱います。それ以外の変換について確認されたい方は下記をご覧ください。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/essentials/data-collection-transformations#how-transformations-work

また、変換の構造体について詳細を確認されたい方は下記の公式ドキュメントをご参照ください。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/essentials/data-collection-transformations-structure

# ワークスペース変換 DCR を実際に使ってみる

## 設定

ここから実際に、ワークスペース変換 DCR を Azure AD サインインログに対して適用していきます。比較のため DCR 無しのワークスペースとワークスペース変換 DCR を適用するワークスペースの２つを用意してみます。あらかじめ両ワークスペースに Azure AD からサインインログが転送されるよう設定しておきます。

ワークスペース変換 DCR の適用はとても簡単です。Log Analytics ワークスペースのテーブルタブで対象にしたいテーブルを選びます。右の・・・をクリックし、「変換の作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/a4211f4d-a884-e35a-78c7-d72c150ec6ab.png)

まず基本タブでルールを格納することになるデータ収集ルール (DCR) をひとつ作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/f3d701c5-61a0-360a-9ebe-21b4b6a64ab5.png)

次にスキーマと変換では、変換エディターを開きます。クエリは下記のようにしてみます。

```
source
| where UserDisplayName contains "Yoshiaki"
| extend City_CF = LocationDetails.city
| project-away AlternateSignInName
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/110c42da-0b6c-46f3-341f-fcb34b76b1a8.png)

あとはこのルールを作成して30分ほど待てば、自動的にフィルター処理が開始されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/f9e8781d-7aee-699e-4c90-0dccdade4721.png)


補足として、下記でフィルターで利用できる KQL を簡単に解説します。

## 行を削減する - where 句の利用

テーブルに入ってくるデータで不要な行を削減するには where 句が利用できます。上記の例では、UserDisplayName に "Yoshiaki" という文字列があるときのみログを格納することになります。このように特定の条件にあてはまるレコードのみ残したい場合は、where 句で記述します。

## 列を追加する - extend 句の利用

列を追加したい時は、extend 句を利用します。上記では、LocationDetails の中に入ってしまっている City の情報を列として追加しています。注意点としては、この列名の最後を _CF としなければならないことがあります。

## 列を削減する - project-away 句の利用

元々入っている列で、削減したいものは project-away で落とすことができます。上記では、AlternateSignInName 列を削減しています。

## 結果の確認

### DCR の確認

まず、作成された DCR の中身を見て見ましょう。今回、DCRTest2 というワークスペースにのみ DCRTest という名前の DCR をセットしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/453fd866-e9bf-9d9b-a9c5-7ddfc548a9cd.png)

DCR の中身は ARM テンプレートで見ることができます。テンプレートのエクスポートタブを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/9e8e94a5-5646-00a1-f034-d50e0fb3ea85.png)

重要なのは、下記の部分です。

```JSON
"dataFlows": [
                    {
                        "streams": [
                            "Microsoft-Table-SigninLogs"
                        ],
                        "destinations": [
                            "dc86c4b58296480f9f424b9ad83189b0"
                        ],
                        "transformKql": "source\n| where UserDisplayName contains \"Yoshiaki\"\n| extend City_CF = LocationDetails.city\n| project-away AlternateSignInName\n\n"
                    }
                ]
```

"transformKql" というキーに対して、値としてさきほどの KQL クエリが入っていることが分かります。この書き方は他の DCR とも共通です。

### クエリによるデータの確認

ワークスペース変換 DCR をセットしていないワークスペースとセットしたワークスペースで、サインインログの中身を比較してみます。下記のように全く同じログを転送しているはずなのにレコード数が違うことが分かります。これは、上記の where 句で特定のレコードしか来ないように設定したことによります。また、DCR により AlternateSignInName 列が削除され、City_CF 列が追加されていることもわかります。

* ワークスペース変換 DCR をセットしていないワークスペース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/e1c2297d-c229-fc5b-7d42-15eb6dec4195.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/96e8b115-e669-73fd-4765-1738225cad7d.png)


* ワークスペース変換 DCR をセットしたワークスペース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/cd9ff559-e33e-8d3b-58e6-6935f478eb35.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/f3384331-49c0-5297-cf99-b55622e9c3e5.png)

# 注意点

こちらのワークスペース変換 DCR はデータの圧縮にも強力な手段となります。ただし、課金体系として50%以上料金を減らすことはできないようになっています。

> 変換によって受信データが 50% を超えて削減された場合、50% を超えるフィルター処理されたデータ量に対して課金されます。

詳細は下記をご参照ください。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/essentials/data-collection-transformations#cost-for-transformations

# 最後に

本記事では、Log Analytics のワークスペース変換 DCR を使って取り込むログデータを加工する過程を見ていきました。本記事の内容が Azure Log Analytics や Sentinel を活用する際の一助となれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。