Azure Log Analytics の Log Ingest API (ログインジェスト API)  によるデータ取り込みの方法 (with Postman)

# 本記事について

Azure Log Analytics に任意のデータを取り込む時に用いられる方法として、旧来 [Log Analytics HTTP Data Collector API](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/data-collector-api?tabs=powershell) という Web API がありました。ただ、こちらはリリースからずっとパブリックプレビュー状態であり、それに代わるものが求められていました。そして、2022年に新しくリリースされたのが、[Azure Monitor Log Ingest API (ログインジェスト API) ](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/logs-ingestion-api-overview)になります。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/logs-ingestion-api-overview

本記事では、まだまだ情報が少ないこの Log Ingest API について、特に Postman を利用してデータ取り込みを行っていく方法を Step by Step で見ていきたいと思います。（公式ドキュメントはチュートリアルで PowerShell を使っていますが、少し本質的な部分がわかりづらいため、本記事では Postman を用い最も基本的なところを確認していきます。）

https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/tutorial-logs-ingestion-portal

なお、実際に活用する際には、Python SDK などを利用することになるかと思います。こちらについても記事を書いておりますので、合わせてご覧いただければと思います。

https://qiita.com/YoshiakiOi/items/4f52d6c45686b1de7554

# Log Ingest API でデータを取り込む

## Azure AD アプリケーションの準備

Log Ingest API を利用するには、Azure AD アプリケーションが必要になります。これは、Azure AD のアプリの登録から作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/1ea19f46-8a52-8143-7a59-a13e9203885d.png)

＋新規登録をクリックし、名前を入れて登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/4660c3d1-0f62-c76e-c781-2ea1d4c40f98.png)

アプリのページを開いたら、証明書とシークレットタブから「新しいクライアントシークレット」へ進みシークレットを作成します。追加する際に、シークレットの値を控えておきます。また、アプリケーション ID (クライアント ID) も同じく後ほど利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/834ebf1d-a816-f614-1b6f-58e12f536a8f.png)

## データ収集エンドポイントの作成

次にデータ収集エンドポイントを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/5217e5b5-3148-8b09-d519-b0d14a825215.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/f2987ffc-3939-7f15-fe59-e6d0cad15c39.png)

## カスタムログテーブルの作成と データ収集ルール (DCR) の作成

Log Analytics のテーブルタブで、今回 Log Ingest API 経由でログを送る先となるテーブルを作成します。DCR ベースの新しいカスタムログを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/738e1b22-136f-1c44-2770-f4a767c3e577.png)

テーブル名を入れ、新しい Data Collection Rule (DCR) をひとつ作成します。データ収集エンドポイントは先ほどのものを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/7b6768f3-2e5c-2104-56bf-50c142cb873a.png)

次にスキーマとサンプルですが、今回は以下の JSON を使ってみます。ローカルにファイルを保存してアップロードします。

```
{
    "TimeGenerated": "2023-03-25 14:42:00",
    "User": "Yoshiaki Oi",
    "Result": "Success"
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/a0f3e1eb-2cc1-52b0-a07e-6f821080771d.png)

「次へ」へ進み作成します。

## DCR のアクセス許可

作成した DCR のアクセス制御で、さきほどのアプリケーションに監視メトリック発行者の権限を付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/03d88843-31a3-5ccb-9137-73aaf1502843.png)

## Postman の準備とリクエストの送信

Postman から HTTP リクエストを送ります。

### Bearer トークンの取得

まず、Log Ingest API のリクエストを投げるのに必要な Bearer トークンを取得します。この Bearer トークンはさきほど作成した Azure AD アプリケーションを使って受け取ります。

```
POST https://login.microsoftonline.com/<Azure AD テナント ID>/oauth2/token
```

Header
```
Content-Type: application/x-www-form-urlencoded
```

Body
```
grant_type: client_credentials
client_id: <Azure AD アプリケーションのアプリケーションID (クライアントID)>
client_secret: <Azure AD アプリケーションのシークレット>
resource: https://monitor.azure.com/
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/7ea4dd21-c14a-0269-8e6b-be6cc5ee078b.png)

### Log Ingest API へリクエストを送信

そして、その Bearer トークンを使って Log Ingest API にリクエストを投げます。

```
POST https://<データ収集エンドポイントのURI>/dataCollectionRules/<DCR の Immutable ID>/streams/Custom-<カスタムログのテーブル名 (_CL含む)>?api-version=2021-11-01-preview
```

< > のデータはそれぞれ下記のように収集します。

* データ収集エンドポイントの URI: これはデータ収集エンドポイントのページに書かれています。（ログインジェストと書かれているものです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/999b5dec-cff5-1eed-82b8-95d55846f822.png)


* DCR の Immutable ID: これは DCR ページで概要を JSON ビューに切り替えると出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/f3fed9e6-7149-a0f6-6894-aec48067345b.png)

Header と Body はそれぞれ下記のようにします。Body は JSON を配列の括弧でくくります。（レコードが一個だったとしても。）

https://github.com/Azure/azure-sdk-for-net/issues/34638

Header
```
Authorization: Bearer <取得した Bearer トークン>
Content-Type: application/json
```

Body
```JSON
[
    {
        "TimeGenerated": "2023-03-25 10:23:00",
        "User": "Yoshiaki Oi",
        "Result": "Success"
    },
     {
        "TimeGenerated": "2023-03-25 11:12:00",
        "User": "Taro Maikuro",
        "Result": "Failure"
    }
]
```

リクエストを正しく送信できると、204 No Content で返ってきますが、検索するとデータが入っていることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/1f62a16e-a789-66f4-7041-fafa92a62500.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/020a19c8-b3c7-b370-4a54-1644c090fdea.png)

以上が、Log Ingest API を使って Log Analytics ワークスペースにログデータを送信する方法になります。

# 最後に

本記事では、新しくリリースされた Log Ingest API を使ったログデータの取り込み方法を見ていきました。本記事の内容が Azure Log Analytics や Sentinel を活用する際の一助となれば幸いです。

また、姉妹編として、AMA と DCR をベースとしたサーバーから取り込むカスタムログの方式に関しても記事を公開しました。アプリケーションコードの開発なしで、サーバーからテキストログを簡単に取りこむ方法についてお探しの方はこちらをご覧ください。

https://qiita.com/YoshiakiOi/items/0a93fe3bbde8845fe3d0

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