IBM Cloud: IBM Cloud Logs Routing 及びLinux Agent設定

# はじめに
IBM Cloudでは、今までログ監視ツールとしてLog Analysis、監査ログツールとしてActivity Trackerサービスを多くの皆様にご利用頂いてまいりました。この度、これらのサービスの後継として、新サービスIBM Logsを2024年6月よりEU地域で提供を開始しました。2024年8月には日本国内のリージョンでもリリース予定となっております。
今回は、これらIBM Cloud Logsにログ情報を転送するIBM Logs Routingの設定とLinux Agentの設定についてご紹介したいと思います。

# 本稿で利用する環境
+ IBM Cloud Logs：ログ送出ターゲット先となるログ管理ツール
+ IBM Cloud Logs Routing：プラットフォーム及びエージェントログを転送するルーティングサービス
+ IBM Cloud Logs Agent ：ターゲットにログを送出するLinux用エージェント
+ RHEL サーバ：IBM Cloud Logs Agent をインストールするLinuxサーバ

# IBM Cloud Logsのデプロイメント
Qiita記事「[IBM Cloud Logsを使ってみた](https://qiita.com/aratsu-i/items/376f2e4774429cb01177)」を参考に以下関連するインスタンスを作成します。
+ IBM Cloud Logs
+ IBM Cloud Object Storage（ログ保存用）

# IBM Cloud Logs Routingの設定
ログソースからのログを転送するRouting サービスをデプロイメントします。Routingサービスは、リージョン毎にアカウント個別のサービスとなり、各リージョンは独立しており、データを共有しません。
IBM Logs Routing用アカウントは以下２つのAPIを提供します。
+ 管理用API：IBM Cloud Routingの管理を行うエンドポイントとなります。パブリックエンドポイントとIBM Cloud プライベートネットワーク内からアクセスできるプライベートエンドポイントを提供します。
+ 受信用（取込み用）API：ログ情報を受信して、ターゲットに送信します。受信用のAPIに関しては、プライベートエンドポイントのみのサポートの為、パブリックなインターネット環境からの受信は不可となります。以下２つのタイプエンドポイントを提供します。
    + Service Endpoint (CSE)
    + Virtual Private Endpoint (VPE) 
![Box Notes画像 2024-07-25 21.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354579/e22e519a-09dd-893d-ea52-630c17d1ed7f.png)

# Logs Routingテナントの作成／編集
Observabilityメニュー内の[Logs Routingを開きます](https://cloud.ibm.com/login?redirect=%2Fobservability%2Flogs%2Drouting%2Frules)。Logs Routingをデプロイするリージョンの\<Set target>を選択して、ターゲットとなるIBM Logsの設定を行います。Choose typeとして\<Cloud Logs>を選択し、Createボタンを押下して新規のIBM Cloud Logsを作成するか、既に作成済みのIBM Logsターゲットを選択ののち、保存して作成します。
![Box Notes画像 2024-08-08 21.17.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354579/14004fbd-5e8d-e768-539f-29ae6c87769a.png)
## 受信用（取込み用） エンドポイントの設定
### Logs Routerの取込み用エンドポイントの設定
今回は、Logs Routerへのログ取込み用のエンドポイントとして、Virtual Private Endpoint (VPE) を利用します。これにより、VPC内に存在するRHELサーバからVPC内に存在するIBM Cloud Logs Routingの仮想IPアドレスにVPC内通信にて接続する事が可能となります。詳細は、IBM Doc「[VPCの仮想プライベート・エンドポイントを使用してIBM Cloud Logs Routing へのプライベート接続を行う方法](https://cloud.ibm.com/docs/logs-router?topic=logs-router-vpe-connection&interface=api)」を参照して適切に設定してください。
### Logs Routerへのログ取込み用の権限設定
ログをIBM Cloud Logs Routingサービスを通して送信するようにエージェントを構成する場合、APIキーまたはTrusted Profileは、IBM Cloud Logs Routingサービスの `Writer` ロールを持つ必要があります。Logs Routerにエージェントからのログ取込み用の権限設定は、IBM Doc「[IBM Cloud Logs Routingを使用して取り込みの許可を設定](https://cloud.ibm.com/docs/logs-router?topic=logs-router-agent-iam-permissions&interface=cli&locale=ja#agent-iam-permissions-lr-cli)」を参照ください。今回の場合、Trusted Profile名「Logs_Profile」なので、IBM Cloud shellにログイン後、以下のコマンドでLogs RouterにTrusted Profileによる`Writer`権限を付与します。
```:Trusted Profileへの権限付与
Masaharu_Esaki@cloudshell:~$ ibmcloud iam tp-policy-create logs_profile --roles Writer --service-name logs-router
Creating policy under account XXXXXXXXXXXXXXXXXXXXXXXX for trusted profile logs_profile as Masaharu.Esaki@ibm.com...
OK
Trusted profile policy is successfully created
```
:::note warn
GUIでTrusted profilesのAccess policiesを設定しようとしてもIBM Cloud Logs Routingサービスは出てきません。CLIでのみ実施となります。
:::
設定後、以下のようにCLIで設定した内容がAccess policiesには表示されます。
![logs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354579/7aa83d41-72c6-b2c4-4289-a8820202ccd2.png)
なお、Logs Routerを介さずエージェントから直接IBM Logsにログを送信する事も可能です。その際は、Trusted ProfileがIBM Cloud Logsサービスの\<Sender>ロールを持つ必要があります。権限設定の詳細はIBM Doc「[直接送信による取り込みのための権限設定](https://cloud.ibm.com/docs/logs-router?topic=logs-router-agent-iam-permissions&interface=cli&locale=ja#agent-iam-permissions-d-cli)」を参照ください。


# エージェントによるログ採取
IBM Cloud Log Routingでは、以下２つのソースからログを受信できます。
![Box Notes画像 2024-08-09 09.05.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354579/e3b95f83-2208-1cd6-cff8-a0ec407cbd20.png)

+ プラットフォームログを生成するサービスからの受信
+ Kubernetes Service / Red Hat OpenShift on IBM Cloudクラスター及びLinux上のIBM Cloud Logs Routing Agentからの受信

IBM Cloud Logs Routing Agentは、オープンソースであるFluent Bitを採用しており、インフラストラクチャログとアプリケーションログを収集してIBM Logs Routingサービスを介して、IBM Logs等のターゲットに送信します。
今回は、LinuxサーバにデプロイしたIBM Cloud Logs Routing Agentからの受信設定についてご紹介したいと思います。

## エージェントをデプロイするLinuxサーバの注文
今回は、Red Hat Linux環境をエージェントを導入します。
Qiita記事「[IBM Cloud: Trusted Profileを使ったVSI for VPCからの安全なAPI/CLI呼び出し方法](https://qiita.com/testnin2/items/860a3b00a2029e0a2594)」を参考にTrusted Profile付きの新規RHELサーバを注文します。
## エージェントのデプロイ
IBM Doc「[Linux 用の IBM® Cloud Logs Routing エージェントの管理](https://cloud.ibm.com/docs/logs-router?topic=logs-router-agent-linux&locale=ja#agent-linux-deploy)」を参考にRHELサーバにエージェントをデプロイします。エージェントの認証方法として、今回は前項のRHELサーバ払出しの際に付与したTrusted Profileを採用します。
RHELサーバにログイン後、必要なPRMパッケージをダウンロードします。ダウンロードするパッケージバージョン情報については[エージェントのリリースノート](https://cloud.ibm.com/docs/logs-router?topic=logs-router-release-notes-agent)を参照ください。
以下のコマンドでエージェントをインストールします。今回は、IBM Cloud Logs Routing Agent-Version 1.2.3を利用します。
```:エージェントのインストール
rpm -ivh <rpm_filename>
```
エージェントの構成スクリプトファイルをダウンロードします。
```:構成ファイルの入手
https://logs-router-agent-config.s3.us.cloud-object-storage.appdomain.cloud/post-config.sh
```
構成スクリプトファイルを実行します。今回は、以下のパラメータを指定します。
```:構成スクリプト実行
TARGET_HOST=ingester.private.jp-tok.logs-router.cloud.ibm.com
TARGET_PORT=443
TARGET_PATH=/v1/logs/ws
AUTH_MODE=VSITrustedProfile
TRUSTED_PROFILE_ID=Profile-e94d0bf4-7afd-XXXXXXXXXXXXXXXXXXXXXX
 ./post-config.sh -h $TARGET_HOST -p $TARGET_PORT -t $TARGET_PATH -a $AUTH_MODE -d $TRUSTED_PROFILE_ID
```
なお、Logs Routingを介さずに、エージェントから直接IBM Cloud Logsにログを送出する場合は、構成スクリプト実行時に`--send-directly-to-icl`オプションを指定します。
## エージェントの構成ファイルの設定
エージェントの構成スクリプトにより作成された構成ファイルを以下のように編集します。
```:fluent-bit構成ファイル
[root@lxagent ~]# cat /etc/fluent-bit/fluent-bit.conf 
[SERVICE]
  Flush                   1
  Log_Level               info
  Daemon                  off
  Parsers_File            parsers.conf
  Plugins_File            plugins.conf
  HTTP_Server             On
  HTTP_Listen             0.0.0.0
  HTTP_Port               8081
  Health_Check            On
  HC_Errors_Count         1
  HC_Retry_Failure_Count  1
  HC_Period               30

[INPUT]
    # Comment
    Name tail
    Path /var/log/*.log 
#    Path /var/log/secure 
    log_level info
#    Name dummy
#    Dummy {"message": "Hello World"}

@INCLUDE output-logs-router-agent.conf


[root@lxagent ~]# cat /etc/fluent-bit/output-logs-router-agent.conf 
[OUTPUT]
    # fluentbit config
    Name logger-agent-plugin
    Id logs-router-agent-plugin
    Match *
    Retry_Limit 8

    # Connection
    Target_Host ingester.private.jp-tok.logs-router.cloud.ibm.com
    Target_Port 443
    Target_Path /v1/logs/ws

    # Authentication
    Authentication_Mode VSITrustedProfile
    IAM_Environment Production
    Trusted_Profile_ID Profile-e94d0bf4-XXXXXXXXXXXXXXXXXXXXXX
    
    # Logging
    Logging_Level info
```
構成ファイルには、`[Service]` `[Input]` `[Filter]`および`[Output]`の4つのセクションがあります。今回は、以下３つのセクションを利用します。

`[SERVICE]`セクションを構成して、サービスのグローバル・プロパティーを定義できます。今回は、`log_level`に示しているように、グローバルレベルでデフォルト値の`info`を採用してますので、`info`以上のログが採取されます。

`[INPUT]`セクションを構成して、Fluent Bitがデータを収集できるソースを定義できます。必須`Name`キーとして、`tail`を採用してますのでShell コマンドとして`tail -f`と同等の振る舞いをします。他の`[input]`のプラグインについては、[Fluent Bit Official ManualのInputs](https://docs.fluentbit.io/manual/pipeline/inputs)を参照ください。 

`[OUTPUT]`セクションを構成して、タグが一致した後に Fluent Bitがデータを送信する宛先を定義できます。ここには、先ほど構成スクリプトを実行した際に指定したパラメータが反映されております。権限付与等で指定したTrusted Profileが正しく反映している事を確認ください。

なお、エージェントの動作確認の為、`[input]`セクションの`Name`キーに`dummy`を以下のように設定する事により、IBM Logs上に`Hello World`ログが出てきますので、実際のログが生成されなくても、エージェント／Logs Routing／IBM Logsの設定の確認が行えます。
```:Hello World表示
[INPUT]
    # Comment
    Name dummy
    Dummy {"message": "Hello World"}
```
その他、エージェント構成ファイルのセクション設定等の詳細については、IBM Doc「[エージェント構成ファイルについて](https://cloud.ibm.com/docs/logs-router?topic=logs-router-agent-fluentbit)」を参照ください。

### エージェントからのログ送出確認
エージェントの構成ファイルを修正した後は、以下のコマンドでエージェントを再起動してログを送出します。
```:Fluent Bit再起動
systemctl restart fluent-bit
```
万一、正常のIBM Cloud Logs等でログの表示がされない際は、以下のコマンドでエラー等の発生をご確認ください。
```:Fluent Bit手動起動
[root@lxagent ~]# /opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf 
Fluent Bit v3.0.4-ibm
* Copyright (C) 2015-2024 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* https://fluentbit.io

___________.__                        __    __________.__  __          ________  
\_   _____/|  |  __ __   ____   _____/  |_  \______   \__|/  |_  ___  _\_____  \ 
 |    __)  |  | |  |  \_/ __ \ /    \   __\  |    |  _/  \   __\ \  \/ / _(__  < 
 |     \   |  |_|  |  /\  ___/|   |  \  |    |    |   \  ||  |    \   / /       \
 \___  /   |____/____/  \___  >___|  /__|    |______  /__||__|     \_/ /______  /
     \/                     \/     \/               \/                        \/ 

Registering the logger-agent-plugin CommitSHA: d1afb3e29f6fccebef021a07c61c9ff1c30a6c07
Registering the logger-icl-output-plugin with commitSHA: 5bae65e8d7ce704c8dcfbe1231d4736957edb6ee
[2024/08/08 15:26:08] [ info] [fluent bit] version=3.0.4-ibm, commit=, pid=111751
[2024/08/08 15:26:08] [ info] [storage] ver=1.5.2, type=memory, sync=normal, checksum=off, max_chunks_up=128
[2024/08/08 15:26:08] [ info] [cmetrics] version=0.9.0
[2024/08/08 15:26:08] [ info] [ctraces ] version=0.5.1
[2024/08/08 15:26:08] [ info] [input:tail:tail.0] initializing
[2024/08/08 15:26:08] [ info] [input:tail:tail.0] storage_strategy='memory' (memory only)
{"level":"info","ts":"2024-08-08T15:26:08.442664524Z","logger":"logs-router-agent-plugin","caller":"internal/logger-agent-plugin-impl.go:97","msg":"Initializing the plugin","ID":"logs-router-agent-plugin"}
{"level":"info","ts":"2024-08-08T15:26:08.442782791Z","logger":"logs-router-agent-plugin","caller":"internal/logger-agent-plugin-impl.go:131","msg":"Connecting to ingester","URL":"wss://ingester.private.jp-tok.logs-router.cloud.ibm.com:443/v1/logs/ws"}
```
以下のようにIBM Logs上にRHELエージェントからのログを表示する事ができました。
![Box Notes画像 2024-08-09 00.31.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354579/d2ccbf36-ca38-200c-1d8c-4d411871acde.png)
# まとめ
Linuxサーバ上のIBM Cloud Logs Routing Agentから、IBM Cloud Logs Routingを介して、IBM Cloud Logsにログを送出する際の設定についてご紹介しました。IBM Cloud Logs自体のデプロイは非常に簡単ですが、Routingやエージェントの権限設定や各種構成ファイルの設定が非常に重要になります。エージェントの構成ファイルセクション設定を編集し、最適な環境にてご利用ください。
# 参考サイト
+ [IBM Cloud Logsを使ってみた](https://qiita.com/aratsu-i/items/376f2e4774429cb01177)
+ [VPCの仮想プライベート・エンドポイントを使用してIBM Cloud Logs Routing へのプライベート接続を行う方法](https://cloud.ibm.com/docs/logs-router?topic=logs-router-vpe-connection&interface=api)
+ [IBM Cloud Logs Routingを使用して取り込みの許可を設定](https://cloud.ibm.com/docs/logs-router?topic=logs-router-agent-iam-permissions&interface=cli&locale=ja#agent-iam-permissions-lr-cli)
+ [直接送信による取り込みのための権限設定](https://cloud.ibm.com/docs/logs-router?topic=logs-router-agent-iam-permissions&interface=cli&locale=ja#agent-iam-permissions-d-cli)
+ [IBM Cloud: Trusted Profileを使ったVSI for VPCからの安全なAPI/CLI呼び出し方法](https://qiita.com/testnin2/items/860a3b00a2029e0a2594)
+ [Linux 用の IBM® Cloud Logs Routing エージェントの管理](https://cloud.ibm.com/docs/logs-router?topic=logs-router-agent-linux&locale=ja#agent-linux-deploy)
+ [エージェントのリリースノート](https://cloud.ibm.com/docs/logs-router?topic=logs-router-release-notes-agent)
+ [Fluent Bit Official ManualのInputs](https://docs.fluentbit.io/manual/pipeline/inputs)
+ [エージェント構成ファイルについて](https://cloud.ibm.com/docs/logs-router?topic=logs-router-agent-fluentbit)