Azure Logic Apps で使用している処理・テキストを横断検索する🔍

## はじめに
Logic Apps では複雑な処理を組むことも多く、どのロジックに何を使用しているか等を検索したいシーンも多いのではないでしょうか。
本記事は `KQL(Kusto クエリ)`と`Azure Resource Graph`を使って、ロジックを横断的に検索する方法についてご紹介します。

Power Automate を使用されている方はぜひこちらもご覧ください↓

https://qiita.com/SnorlaxDX/private/f8a9683a29e994dafa78

## Azure Resource Graph & KQL とは
### Azure Resource Graph
Azure Resource Graph は、Azure 環境全体にわたるリソースの状態やプロパティを迅速に探索・クエリすることができるサービスです。このツールを使用すると、Azure Logic Apps を含むさまざまな Azure 内リソースの詳細情報をフィルタしたり、グループ化したりして簡単に把握することができるため、管理や可視化に優れています。

https://learn.microsoft.com/ja-jp/azure/governance/resource-graph/overview

### KQLとは
Azure 内で利用できるクエリ照会言語です。主にAzure Data Explorer や Azure Log Analytics で使用されることが多いかと思います。SQLと似た構文で、各種データをクエリすることが可能です。

https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/

KQL についてもっと知りたい方はぜひ以下の記事もご覧ください↓

https://qiita.com/Yishishi/items/a074be0079ed4df66e5f

https://qiita.com/nextread/items/615ea20bd64817662d5c

## ロジックの検索を行うには

### 基本的なクエリ
それでは、実際にロジックの検索をしてみます。
シンプルに、ロジックアプリの一覧を取得して、特定のキーワードに当てはまる処理が入っているロジックを検索しています。

```plaintext
resources
| where type == "microsoft.logic/workflows" //ロジックアプリ一覧を取得
| where properties contains "検索したい文字を入力" //大文字、小文字を問わず検索
```
下図は、teams というワードが入っているロジックを検索しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/451e4f69-57d9-27fc-685f-8108fd6d4db2.png)

`properties`列に Logic Apps のコードビューで見た際の JSON が格納されているため、`properties`に対して `contains`演算子（大文字と小文字を区別しない文字列を含む）で検索しています。

:::note warn
今回は teams というワードで検索しましたが、どのチャネルに通知をしているか知りたいといった場合は、チャネル名では検索できず、チャネルIDでの検索が必要となります。
詳細についてはロジックのコードビューより、どのテキストで検索するのが適切か確認してみてください。
:::


### もう少し情報を絞りたい
#### 出てくる列を絞りたい！
基本のクエリでは、出てくる表示列が多いため、必要な情報を確認するために横スクロールする必要があります。
`project`演算子を使用することで、必要な列を絞り込んで表示することが出来ます。
以下の例では、ロジックアプリの名前が格納されている name列、リソースグループが格納されている resourceGroup列、コードが格納されている properties列のみを表示した例です。

```plaintext
resources
| where type == "microsoft.logic/workflows" //ロジックアプリ一覧を取得
| where properties contains "teams" //大文字、小文字を問わず検索
| project name,resourceGroup,properties //必要な列を絞る
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/baad48f2-4ab2-f9b4-5a7d-75031c2d36c1.png)


#### 有効か無効か知りたい！
コードが格納されている properties列のJSON中に、更に state というプロパティがある為、それを抽出することで、ロジックが有効であるか無効であるかを別の列で確認することが出来ます。`extend`演算子で新たな列を作り、 `parse_json`演算子で properties の JSONを解析して、state だけを取り出します。
state には「Enabled（有効）」「Disabled（無効）」の値があり、ロジックが有効であるか、無効であるか確認することが出来ます。

```plaintext
resources
| where type == "microsoft.logic/workflows" //ロジックアプリ一覧を取得
| where properties contains "teams" //大文字、小文字を問わず検索
| project name,resourceGroup,properties //必要な列を絞る
| extend state = parse_json(properties).state //propertiesからステータスを抽出
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/3cb506ae-86b8-6dba-3abb-3762a28f3a43.png)




#### ロジックが作られた日を知りたい！
上記と同じくextend と parse_json を使用します。ただし、作成時刻はUTCで格納されている為、分かりやすいように日本時間に変換するクエリを追加します。

```plaintext
resources
| where type == "microsoft.logic/workflows" //ロジックアプリ一覧を取得
| where properties contains "teams" //大文字、小文字を問わず検索
| project name,resourceGroup,properties //必要な列を絞る
| extend state = parse_json(properties).state //propertiesからステータスを抽出
| extend createdTimeUTC = parse_json(properties).createdTime　//UTCでの作成時刻を抽出
| extend createdTimeJST = datetime_add('hour',9,todatetime(createdTimeUTC))  //UTC時刻をJSTに変換
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457767/fd545b7e-e0b0-4f56-c005-1ee4705ab096.png)

## おわりに
Azure Resource GraphとKQLを使用して、Azure Logic Appsのロジックを横断的に検索する方法を紹介しました。普段クエリを使用しない方でも簡単に、シンプルな方法でロジックの検索が出来るかと思います。少しでもお役に立てば幸いです。