Oracle Cloud で Linux のログ監視を実装する

:::note alert
2023年4月ぐらいからカスタムログを Service Connector Hub で Noticication 連携ができなくなっており、現状この手順では実装できないのでご注意ください。
手順の修正については追々確認いたします。
:::


# はじめに
OCI を利用頂く際に運用監視の観点でログ監視をお願いすることがあります。これまで実績のある方法で実装頂くことが多かったのですが、OCI のサービスでできないだろうか、っと思ったので調べて実装してみました。

# ゴール
- インスタンス(Linux) の特定のファイル(/var/log/messages)で特定の文字列を監視する
- 特定の文字列を検出した際にはメールで通知する
- OCI のサービスを利用して実装する

# 事前に検討すべきこと
- 適用範囲（インスタンス単位 or コンパートメント単位）
- 監視対象ファイル
- 監視対象ファイルのサイズ
- 監視対象文字列

# 利用するサービス
- Instance (監視対象として利用)
- Logging (対象ログをクラウドへ保管)
- Notifications (メール通知)
- Service Connector Hub (Loggin と Notifications の連携と監視対象文字列のチェック)

# 大まかな構成イメージ
```
 ┌──────────────┐  ┌──────────────────────────────────────────────────┐
 │              │  │                                                  │
 │              │  │ ┌───────────┐  ┌────────────┐  ┌───────────────┐ │  ┌────────┐
 │ ┌─────────┐  │  │ │           │  │ Service    │  │               │ │  │        │
 │ │  Agent  ├──┼──┼─►  Logging  ├──┤► Connector ├──► Notifications ├─┼──┤  Mail  │
 │ └────┬────┘  │  │ │           │  │   Hub      │  │               │ │  │        │
 │      │       │  │ └───────────┘  └────────────┘  └───────────────┘ │  └────────┘
 │      │       │  │                                                  │
 │      │       │  │                                                  │
 │      │       │  │                                                  │
 │ ┌────▼─────┐ │  │                       OCI                        │
 │ │ Log File │ │  └──────────────────────────────────────────────────┘
 │ └──────────┘ │
 │              │
 │              │
 │   Instance   │
 │              │
 └──────────────┘
```

# 前提条件
- VCN やインスタンスは作成済み
- admin 権限またはそれ相応の権限
- インスタンスは Custom Logs Monitoring Agent が有効であること
    - 作成済みのインスタンスの details から Oracle Cloud Agent のタブを確認して Custom Log Monitoring が Enabled となっていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/c0677d68-87f6-d177-66be-1927c6963a8a.png)


# 手順
## Dynamic Group の作成
OCI のロギングサービスがインスタンスの Custom Log Monitoring と連携しログの収集をできるようにするために Dynamic Group に該当のインスタンスまたはコンパートメントを登録する。

今回はテスト用に作成したインスタンスのみを対象とします。
インスタンスの OCID をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/74bf3319-0f08-e426-962d-573732c7329a.png)

メニューから dynamic groups で検索し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/c30769ed-0757-bccb-a596-863f34b5b6af.png)

customlog_dynamicgroup という名前で、以下のルールで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/8858e808-d0ea-6146-d659-4b64c3139dc0.png)

## Logging サービスでログ収集の設定をする
logs を検索してクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/992d5967-562a-3e75-c796-7fa78971a1b6.png)

Create custom log をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/7dbe8ff0-17f6-d51b-f701-4fe5a0e6059c.png)

Custom log name を入力し、Log group のところにある Create New Group をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/a3769f7e-65ea-d8eb-48f6-f97bf04881d9.png)

以下のように Name と Description を入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/051ef08c-17c4-8d46-a7c2-6dffb14108f9.png)

作成したロググループが選択されるので、Create custom log をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/c9a479fa-22cc-8f66-f2e2-0b8eb3f66bdb.png)


Create new configuration が選択されていることを確認し、Configuration name と Description を入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/03518f1a-bb16-b3c5-0b05-882ce46b5332.png)


先程作成した Dynamic Group を選択する。
Create policy to っという警告文が表示されるので、そこの create をクリックし、必要な policy を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/d8cae7f4-df8e-544f-1018-993dd6d0bcd7.png)

クリックすると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/6258ab68-ff86-9ad8-c29a-ebaa030db34a.png)


作成した Dynamic Group を指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/4ce6c41f-d21a-a655-cce6-133ee61aaf72.png)

Input Type、 Input name, File Paths を以下のように設定し、Create custom log をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/008daaf5-06cc-48f4-cf7c-8fd08d2eb434.png)

作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/ae40186f-e406-77a1-56fd-dd1fb5906a45.png)

## Notificaton の作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/626cb18f-7a1f-bc0b-5ee6-d78d25ad16fd.png)

Create Topic をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/dc28855b-64d1-25bf-1831-314e7ba8efbc.png)

以下のように Name と Description を入力し、Create をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/ba033f37-8b0d-d407-a8b4-bc88391ca036.png)

作成された monitor-messages-topic をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/7c60784f-8b7a-c720-dcec-c4283aac41ad.png)

Create Subscription をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/dd770d48-c619-5611-7e0a-4ba54190a35a.png)

Email を選択し、受信可能なアドレスを入力して create をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/4033126a-9ee8-2beb-539b-62c190694eb1.png)

以下のように Pending ステータスとなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/7b5b1666-eb66-c26c-75e3-4d3e8b0769c8.png)

指定したアドレスに以下のメールが届くので、 Confirm Subscription をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/8a056f6e-e02a-43bd-a50c-1b7717840476.png)

ブラウザが開き以下のように表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/bde97360-6838-2440-2a5d-6ac08188f5bf.png)

ステータスが Active に変わる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/ca6f3f11-83be-a97d-8081-da0790a897b1.png)


## Service Connector Hub の設定
hub と検索し、Service Connector hub をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/b72518aa-a38c-2c31-1e29-934582a3e4cd.png)

Create Service Connector をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/2448c474-b116-6b89-1935-ee963eb1d5f6.png)

Connector Name と Description を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/983e804d-8356-6e7d-7624-05ac55e39923.png)

※なぜか以下の順番でないと選択できたい
Source に Logging を選択し、Log Group と Logs に指定したものを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/05456512-8f90-fcc7-2732-c444593baac8.png)


最後に target に Notifications を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/2cf7f57f-1c21-bff4-c5c4-9a1d1994a89f.png)

Log Filter Task にて Property と Operator と Value を指定する。
今回はテストとして hogehoge という文字列を拾いたいのでこの様に指定した。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/1f3ae308-9b3e-55aa-75fc-de4b3e775edb.png)

Configure Target で Topic に先程作成したものを選択すし、Message Format は Send formatted messages にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/6bc7ea02-3ab3-b384-3649-e0431ffecc55.png)

以下の警告文が表示されるので、create をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/a8dbe4ce-2956-e2ed-1476-861038af2925.png)
問題なければ以下のように変わる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/3e1102d9-7b65-2f7a-896b-e4df7597c73c.png)

Create をクリックし完了。


# 動作確認
今回は対象が messages なのでインスタンスにログインし、以下のような logger を実行します

```
[opc@instance01 ~]$ logger -ip kern.warn hogehoge
```

念の為、messages を確認すると、たしかに記録されています。

```
[opc@instance01 ~]$ sudo tail -f /var/log/messages
Nov 17 07:48:38 instance01 systemd: Started Session c6935 of user root.
Nov 17 07:48:38 instance01 systemd: Started Session c6936 of user root.
Nov 17 07:49:01 instance01 systemd: Started Session 2890 of user root.
Nov 17 07:50:01 instance01 systemd: Started Session 2891 of user root.
Nov 17 07:52:42 instance01 systemd: Created slice User Slice of opc.
Nov 17 07:52:42 instance01 systemd-logind: New session 2892 of user opc.
Nov 17 07:52:42 instance01 systemd: Started Session 2892 of user opc.
Nov 17 07:52:42 instance01 dbus[1284]: [system] Activating service name='org.freedesktop.problems' (using servicehelper)
Nov 17 07:52:42 instance01 dbus[1284]: [system] Successfully activated service 'org.freedesktop.problems'
Nov 17 07:53:45 instance01 opc[6954]: hogehoge
```

メールが届きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/df1216e2-f3d1-607e-83ad-64ca11ec1065.png)

本文を見ると、 Source にインスタンス名、Subject にログファイル、Details/JSON にメッセージが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/d2d1b91e-b0db-8fa8-ba55-ba4255b4f4f6.png)


OCI のサービスを利用するだけで、シンプルなログ監視ができました。

# 挙動について確認する
検出した文字列の挙動について確認してみます。

## 一度に複数の文字列が出た場合どうなる？
以下のように logger を10回連続で投げてみる。

````
[opc@instance01 ~]$ for i in {1..10}
> do
> logger -ip kern.warn hogehoge
> done
[opc@instance01 ~]$ sudo tail -f /var/log/messages
Nov 17 08:23:53 instance01 opc[14842]: hogehoge
Nov 17 08:23:53 instance01 opc[14843]: hogehoge
Nov 17 08:23:53 instance01 opc[14844]: hogehoge
Nov 17 08:23:53 instance01 opc[14845]: hogehoge
Nov 17 08:23:53 instance01 opc[14846]: hogehoge
Nov 17 08:23:53 instance01 opc[14847]: hogehoge
Nov 17 08:23:53 instance01 opc[14848]: hogehoge
Nov 17 08:23:53 instance01 opc[14849]: hogehoge
Nov 17 08:23:53 instance01 opc[14850]: hogehoge
Nov 17 08:23:53 instance01 opc[14851]: hogehoge
````

以下のように10通のメールが届きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/6c36d6ca-d87b-9b1b-2332-d855a0e379cc.png)

## どのタイミングでログがチェックされている？
Custom Log などには unified-monitoring-agent という systemd のサービスが動いている。

```
[opc@instance01 ~]$ systemctl status unified-monitoring-agent
● unified-monitoring-agent.service - unified-monitoring-agent: Fluentd based data collector for Oracle Cloud Infrastructure
   Loaded: loaded (/usr/lib/systemd/system/unified-monitoring-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2021-11-17 07:23:54 GMT; 1h 39min ago
     Docs: https://docs.cloud.oracle.com/
  Process: 31338 ExecStop=/bin/kill -TERM ${MAINPID} (code=exited, status=0/SUCCESS)
  Process: 31346 ExecStart=/opt/unified-monitoring-agent/embedded/bin/fluentd --log /var/log/unified-monitoring-agent/unified-monitoring-agent.log --daemon /var/run/unified-monitoring-agent/unified-monitoring-agent.pid --log-rotate-size 1048576 --log-rotate-age 10 $EXTRA_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 31355 (fluentd)
   Memory: 95.2M (limit: 5.0G)
   CGroup: /system.slice/unified-monitoring-agent.service
           ├─31355 /opt/unified-monitoring-agent/embedded/bin/ruby /opt/unified-moni...
           └─31359 /opt/unified-monitoring-agent/embedded/bin/ruby -Eascii-8bit:asci...

11月 17 07:23:50 instance01 systemd[1]: Starting unified-monitoring-agent: Fluent.....
11月 17 07:23:54 instance01 systemd[1]: Started unified-monitoring-agent: Fluentd...e.
Hint: Some lines were ellipsized, use -l to show in full.
```

この agent のログが `/var/log/unified-monitoring-agent/unified-monitoring-agent.log` に吐かれていて、これを見ると約5分に動作している模様。
この5分間間隔の中で検出された回数分のメールが飛ぶ、っということのようです。

# ログの検索
カスタムログを設定すると Logging サービスにログが保管される(デフォルトで1ヶ月保持され、最大6ヶ月保管可能)。
保管されたログは以下のようにあとから検索することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/47e8d456-68ce-4732-14c2-e327abcb4704.png)



# 料金
## Notifications
今回メール通知に利用したサービス。
料金は以下の URL より確認できます。
https://www.oracle.com/jp/devops/notifications/

この記事を書いた時点では以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/c5929382-34b6-cbab-7a4a-8bda6d5deed5.png)

## Logging
カスタムログ(今回は /var/log/messages)の取り込み・保管に利用したサービス。
料金は以下の URL より確認できます。
https://www.oracle.com/jp/devops/logging/

この記事を書いた時点では以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/0ea4261f-bb56-52c0-83eb-2f78bd3b8bd4.png)

## Service Connector Hub
Logs で保管したログから特定の文字列が検出した場合、Notificatons でメール通知する、っという連携に利用したサービス。
料金は以下の URL より確認できます。
https://www.oracle.com/jp/devops/service-connector-hub/

この記事を書いた時点では以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/147474a2-d01b-4a01-2896-00e773f3bfb8.png)