【Splunk】クラスター環境(C1)のSplunk Enterprise初期構築手順

こんにちは。torippy1024です。
Splunkのオンプレ製品であるSplunk Enterpriseには、SVA(Splunk Validated Architecture)と呼ばれるベストプラクティスアーキテクチャーが存在しています。

About Splunk Validated Architectures
https://docs.splunk.com/Documentation/SVA/current/Architectures/About


今回は、その中でもおそらく最も一般的な構成だと考えられるC1トポロジー(Seach Headはシングル、IndexerはCluster)の構築手順を示します。

Distributed Clustered Deployment - Single Site (C1 / C11)
https://docs.splunk.com/Documentation/SVA/current/Architectures/C1C11

また、今回はIndexer Clusterを構築します。
トライアルライセンスではクラスターを構築できないため、Deveploper License(https://dev.splunk.com/enterprise/dev_license )などのライセンスファイルを取得してから作業するようにしてください。

### 【1】構成図
今回構築するSplunk Enterpriseの分散環境は以下の通りです。
()内が通信ポートです。

![20250123_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/61400001-f1c1-af59-7600-c8e2b8d1db18.png)

上記では、Deployment Server/License Manager/Monitoring Consoleと他サーバーとの通信は省略しています。正確な通信ポートの一覧を知りたい場合は以下も参考してください。
(以下のドキュメントでは、Indexer ClusterのReplication Portを9887にしていますが、本資料では9100で構成します)
https://docs.splunk.com/Documentation/Splunk/latest/InheritedDeployment/Ports

### 【2】用意するサーバー一覧

本手順では、AWS EC2を計8VMを使用して検証しています。全てスペック共通です。
- OS: Ubuntu22.04
- CPU: 2vCPU
- メモリ: 4GB
- ディスク: 50GB SSD

|サーバー名|ロール|splunkサーバー名/splunkデフォルトホスト名|
|---|---|---|
|Server#1|Deployment Server/License Manager/Monitoring Console|DS_LM_MC|
|Server#2|Cluster Manager|CM|
|Server#3|Search Head|SH|
|Server#4|Indexer#1|IDX1|
|Server#5|Indexer#2|IDX2|
|Server#6|Indexer#3|IDX3|
|Server#7|Universal Forwarder#1|UF1|
|Server#8|Universal Forwarder#2|UF2|

### 【3】Splunk Enterpriseのインストール

まず、Forwarderとして利用する想定のサーバー以外の全サーバー(Server#1~Server#6)に対し、Splunk Enterpriseをインストールします。
本記事では、執筆時に最新版であった9.4.0をインストールします。

Splunk Enterpriseのインストールメディアの取得先リンクは以下より取得可能です。
https://www.splunk.com/en_us/download/splunk-enterprise.html

Splunk Enterpriseインストール(Forwarder以外のサーバーに対して実施)
```
ssh torippy1024@xxx.xxx.xxx.xxx
sudo mkdir /opt/splunk
sudo useradd -m splunk
sudo passwd splunk
(パスワードを入力)
wget -O splunk-9.4.0-6b4ebe426ca6-linux-amd64.tgz "https://download.splunk.com/products/splunk/releases/9.4.0/linux/splunk-9.4.0-6b4ebe426ca6-linux-amd64.tgz"
sudo tar xzf splunk-9.4.0-6b4ebe426ca6-linux-amd64.tgz -C /opt
sudo /opt/splunk/bin/splunk start --accept-license --answer-yes --seed-passwd password
sudo /opt/splunk/bin/splunk set servername DS_LM_MC
sudo /opt/splunk/bin/splunk set default-hostname DS_LM_MC
sudo /opt/splunk/bin/splunk stop
sudo chown -R splunk:splunk /opt/splunk
sudo /opt/splunk/bin/splunk enable boot-start -user splunk
sudo -u splunk /opt/splunk/bin/splunk start
```
※splunk set servernameとsplunk set default-hostnameで指定している箇所は、サーバーによって変更するようにしてください。

Linux用のインストール手順は以下にも記載されています。
https://docs.splunk.com/Documentation/Splunk/latest/Installation/InstallonLinux

### 【4】個別のサーバー設定
次に、Splunk Enterpriseをインストールしたサーバーに対して、それぞれのロールに応じた設定を行います。
作業順序は、サーバー番号とは異なり、以下の順序で作業するのが効率的なので、この順序で作業します。
(1)DS_LM_MC(LM作業)
(2)CM
(3)IDX1,IDX2,IDX3
(4)SH
(5)DS_LM_MC(MC作業)

#### (1)DS_LM_MCの設定

DS_LM_MCは、Deployment Server/License Manager/Monitoring Consoleと複数の役割を持っているため、やることがたくさんあります。
手順の関係で、まずLicense Managerとしての作業を実施し、その他のサーバーの作業が終わってから残りのMonitoring Consoleとしての作業を実施します。

##### Deployment Serverとしての設定
Deployment Serverに対する作業は特にないので省略します。

##### License Managerとしての設定
Deployment Serverに対する作業は以下の通りです。
- Licenseの登録

最初にライセンスの登録を行います。Splunk Enterpriseをインストールした直後は、トライアルライセンスが適用されています。
トライアルライセンスのままだとIndexer Clusterを構築することができないため、正式なライセンスを登録するのが最初の作業となります。ライセンス登録作業はGUIにて実施します。

- (1)http:< DS_LM_MCのIPアドレス >:8000/en-US/account/loginにアクセスしログイン
- (2)Web GUIより、Settings > Licensing -> Add license -> Choose fileにて、ライセンスをアップロード
- (3)DS_LM_MCのSplunkプロセスを再起動(GUIでもCLIでもどちらからやっても問題なし)

![スクリーンショット 2025-01-22 15.52.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/63399265-f8de-1a8d-94d5-ca34c83084df.png)


#### (2)CM(Cluster Manager)としての設定
次にIndexer Clusterを構築します。
Cluster Managerに対する作業は以下の通りです。
- License Managerの配下として登録
- サーバーをCluster Managerとして設定
- Indexer Discoveryのキーを設定
- Indexer Clusterメンバーをログ転送先に指定(Indexer Discoveryの指定)
- 再起動

```
sudo -u splunk /opt/splunk/bin/splunk edit licenser-localpeer -manager_uri https://<DS_LM_MCのIPアドレス>:8089

sudo -u splunk /opt/splunk/bin/splunk edit cluster-config -mode manager -replication_factor 2 -search_factor 2 -secret idxclusterkey -cluster_label idx-cluster

sudo -u splunk vi /opt/splunk/etc/system/local/server.conf
(以下を末尾に追記)
---
[indexer_discovery]
pass4SymmKey = idxfwdkey
---

sudo -u splunk vi /opt/splunk/etc/system/local/outputs.conf
(以下を末尾に追記)
--
[tcpout]
defaultGroup = default-autolb-group

[tcpout:default-autolb-group]
indexerDiscovery = idxc1

[indexer_discovery:idxc1]
manager_uri = https://localhost:8089
pass4SymmKey = idxfwdkey
---

sudo -u splunk /opt/splunk/bin/splunk restart
```

確認コマンド
```
sudo -u splunk cat /opt/splunk/etc/system/local/server.conf
(以下のように表示。pass4SymmKeyの値は暗号化されているため異なっている)
---
[clustering]
cluster_label = idx-cluster
mode = manager
pass4SymmKey = $7$wL1uAr2QBZP5P3SqtxaQlC67PQYrp/SnOWRrfzzoC/mm7ivC3Z7NMtqC
replication_factor = 2

[indexer_discovery]
pass4SymmKey = $7$1kNrONRtk7EsoQPXq8c8fV/oqv9+9rUejeLJRSpwFQO01fx+WoNlYiI=
---

sudo -u splunk cat /opt/splunk/etc/system/local/outputs.conf
(以下のように表示)
---
[tcpout]
defaultGroup = default-autolb-group

[tcpout:default-autolb-group]
indexerDiscovery = idxc1

[indexer_discovery:idxc1]
manager_uri = https://localhost:8089
pass4SymmKey = $7$bhWlmv9cpfpf8dDzAeRRcZZSgZ71CA7DQu2Fec4kTXxU1zBKqtojtDM=
---

sudo -u splunk /opt/splunk/bin/splunk show cluster-status
(以下のように、Indexer Clusterの状態が表示される。まだClusterのメンバーは存在しない)
---
 Replication factor not met
 Search factor not met
 All data is not searchable
 Indexing Ready NO
 HA Mode: Disabled
---
```

参考：
Manage licenses from the CLI
https://docs.splunk.com/Documentation/Splunk/latest/Admin/LicenserCLIcommands

Configure the manager node with the CLI
https://docs.splunk.com/Documentation/Splunk/latest/Indexer/ConfiguremanagerwithCLI

Use indexer discovery to connect forwarders to peer nodes
https://docs.splunk.com/Documentation/Splunk/latest/Indexer/indexerdiscovery


#### (3)Indexerの設定
Indexer#1~#3に対する作業は以下の通りです。
- License Managerの配下として登録
- Indexer ClusterメンバーにPeerモードで参加
- Forwarderからのログ転送を受け付けるためのリスニングポート(9997)の解放
- 再起動

```
sudo -u splunk /opt/splunk/bin/splunk edit licenser-localpeer -manager_uri https://<DS_LM_MCのIPアドレス>:8089

sudo -u splunk /opt/splunk/bin/splunk edit cluster-config -mode peer -manager_uri https://<CMのIPアドレス>:8089 -secret idxclusterkey -replication_port 9100

sudo -u splunk /opt/splunk/bin/splunk enable listen 9997

sudo -u splunk /opt/splunk/bin/splunk restart
```

確認コマンド
```
sudo -u splunk cat /opt/splunk/etc/system/local/server.conf
(以下のように表示)
---
[replication_port://9100]

[clustering]
manager_uri = https://<CMのIPアドレス>:8089
mode = peer
pass4SymmKey = $7$p9FFBTp4m4/QIdfG+bTLkgaxtCfb/WRY9iAgxcYZfq3jBpVeGNZ+V+P6

[license]
manager_uri = https://<DS_LM_MCのIPアドレス>:8089
---

sudo -u splunk /opt/splunk/bin/splunk display listen
(以下のように表示)
---
Receiving is enabled on port 9997.
---
```

#### (4)SH(Search Head)としての設定
Search Headに対する作業は以下の通りです。
- License Managerの配下として登録
- Indexer ClusterメンバーにSearch Headモードで参加
- Indexer Clusterメンバーをログ転送先に指定(Indexer Discoveryの指定)
- Splunk WebのHTTPS化
- 再起動

```
sudo -u splunk /opt/splunk/bin/splunk edit licenser-localpeer -manager_uri https://<DS_LM_MCのIPアドレス>:8089

sudo -u splunk /opt/splunk/bin/splunk edit cluster-config -mode searchhead -manager_uri https://<CMの内部IPアドレス>:8089 -secret idxclusterkey

sudo -u splunk vi /opt/splunk/etc/system/local/outputs.conf
(以下を末尾に追記)
--
[tcpout]
defaultGroup = default-autolb-group

[tcpout:default-autolb-group]
indexerDiscovery = idxc1

[indexer_discovery:idxc1]
manager_uri = https://<CMの内部IPアドレス>:8089
pass4SymmKey = idxfwdkey
---

sudo -u splunk vi /opt/splunk/etc/system/local/web.conf
(以下を末尾に追記)
---
[settings]
enableSplunkWebSSL = 1
---

sudo -u splunk /opt/splunk/bin/splunk restart
```

確認コマンド
```
sudo -u splunk cat /opt/splunk/etc/system/local/server.conf
(以下のように表示)
---
[license]
manager_uri = https://<DS_LM_MCの内部IPアドレス>:8089

[clustering]
manager_uri = https://<CMの内部IPアドレス>:8089
mode = searchhead
pass4SymmKey = $7$8Seul0DaNBs/LUE6F0GxH8XfVYR/rIWh0AH23TqoCcA3PB2QrqpFa6Fa
---

sudo -u splunk cat /opt/splunk/etc/system/local/outputs.conf
(以下のように表示)
---
[tcpout]
defaultGroup = default-autolb-group

[tcpout:default-autolb-group]
indexerDiscovery = idxc1

[indexer_discovery:idxc1]
manager_uri = https://<CMの内部IPアドレス>:8089
pass4SymmKey = $7$bhWlmv9cpfpf8dDzAeRRcZZSgZ71CA7DQu2Fec4kTXxU1zBKqtojtDM=
---

sudo -u splunk cat /opt/splunk/etc/system/local/web.conf
(以下のように表示)
---
[settings]
enableSplunkWebSSL = 1
---
```

#### (5)DS_LM_MCの設定

最後に、Monitoring Consoleとしての設定を行います。この作業については、全てをCLIで実施するのではなく、Webブラウザでの作業が含まれるので少々複雑になります。

##### Monitoring Consoleとしての設定
Monitoring Consoleに対する作業は以下の通りです。
- MCを分散モードとして構成[Web]
- CM/SH/Indexerを分散サーチピア(リモートインスタンス)として追加[Web]
- Indexer ClusterメンバーにSearch Headモードで参加
- Indexer Clusterメンバーを内部ログ転送先に指定
- Splunk WebのHTTPS化
- 再起動
- CM/SH/Indexerのロールを変更[Web]


MCを分散モードとして構成/CM/SH/Indexerを分散サーチピア(リモートインスタンス)として追加するためには、MCの以下にログインします。

https://< MCの外部IPアドレス >:8000/en-US/app/splunk_monitoring_console/monitoringconsole_configure

![スクリーンショット 2025-01-22 16.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/9c12a065-f5f5-cdf4-d4c8-e6ed58ecfdcf.png)

Modeを「Distributed」に変更し「Apply Changes」-「Save」を選択すると、上記のように分散モードに切り替わります。
またこの時点ではRemote Instancesには何も表示されていません。

次に、[Setting]-[Distributed Search]を選択すると、分散サーチピアの登録画面に遷移します。
https://< MCの外部IPアドレス >:8000/en-US/manager/splunk_monitoring_console/search/distributed/peers 

![スクリーンショット 2025-01-22 16.40.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/3cf69668-5c15-6612-c1ad-c1d382ac3335.png)

Search Head、Cluster Managerについて、https://< 内部IPアドレス >:8089を、Peer URIにそれぞれ指定して登録すると、分散サーチピア画面にSearch Head、Cluster Managerが表示されるようになります。

続いて、Indexer Clusterメンバーへの参加とログ転送、HTTPS化を行います。

```
sudo -u splunk /opt/splunk/bin/splunk edit cluster-config -mode searchhead -manager_uri https://<CMの内部IPアドレス>:8089　-secret idxclusterkey

sudo -u splunk vi /opt/splunk/etc/system/local/outputs.conf
(以下を末尾に追記)
--
[tcpout]
defaultGroup = default-autolb-group

[tcpout:default-autolb-group]
indexerDiscovery = idxc1

[indexer_discovery:idxc1]
manager_uri = https://<CMの内部IPアドレス>:8089
pass4SymmKey = idxfwdkey
---

sudo -u splunk vi /opt/splunk/etc/system/local/web.conf
(以下を末尾に追記)
---
[settings]
enableSplunkWebSSL = 1
---

sudo -u splunk /opt/splunk/bin/splunk restart
```

確認コマンド
```
sudo -u splunk cat /opt/splunk/etc/system/local/outputs.conf
(以下のように表示)
---
[tcpout]
defaultGroup = default-autolb-group

[tcpout:default-autolb-group]
indexerDiscovery = idxc1

[indexer_discovery:idxc1]
manager_uri = https://<CMのIPアドレス>:8089
pass4SymmKey = $7$bhWlmv9cpfpf8dDzAeRRcZZSgZ71CA7DQu2Fec4kTXxU1zBKqtojtDM=
---

sudo -u splunk cat /opt/splunk/etc/system/local/web.conf
(以下のように表示)
---
[settings]
enableSplunkWebSSL = 1
---
```

最後に、各サーバーのロール変更をMCから実施します。

https://< DS_LM_MCのIPアドレス >:8000/en-US/app/splunk_monitoring_console/monitoringconsole_configure

以下の通り、サーバーロールを設定すれば完了です。画面上でロールを編集した後は、最後に必ず「Apply Changes(変更内容を適用)」-「Save(保存)」を選択するようにしてください。
そうしないと画面上では反映されているように見えますが、実際には反映されていない状態になってしまいます。

|サーバー名|サーバーロール|
|---|---|
|DS_LM_MC|Deployment Server, License Manager, Search Head※|
|CM|Cluster Manager|
|SH|Search Head, KV Store|
|IDX1|Indexer|
|IDX2|Indexer|
|IDX3|Indexer|

※設定を反映する際、Deployment Serverに複数のロールを付与するなと警告が表示されますが、無視してしまって構いません。


### 【5】Forwarderの初期設定
次に、末端のForwarderを構築します。こちらも説明は省略します。
以下の記事にある【4】中継Forwarderの設定とおおよそ同じ作業ですが、今回はIndexer Discoveryの設定も追加で入れています。
https://qiita.com/torippy1024/items/fec7d22d7b6b593ea92a#4forwarder%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A

```
ssh torippy1024@xxx.xxx.xxx.xxx
sudo mkdir /opt/splunkforwarder
sudo useradd -m splunkfwd
sudo passwd splunkfwd
(パスワードを入力)
wget -O splunkforwarder-9.4.0-6b4ebe426ca6-linux-amd64.tgz "https://download.splunk.com/products/universalforwarder/releases/9.4.0/linux/splunkforwarder-9.4.0-6b4ebe426ca6-linux-amd64.tgz"
sudo tar xzf splunkforwarder-9.4.0-6b4ebe426ca6-linux-amd64.tgz -C /opt
sudo /opt/splunkforwarder/bin/splunk start --accept-license --answer-yes --seed-passwd password
sudo /opt/splunkforwarder/bin/splunk set servername UF1
sudo /opt/splunkforwarder/bin/splunk set default-hostname UF1
sudo /opt/splunkforwarder/bin/splunk stop
sudo chown -R splunkfwd:splunkfwd /opt/splunkforwarder
sudo /opt/splunkforwarder/bin/splunk enable boot-start -user splunkfwd
sudo -u splunkfwd /opt/splunkforwarder/bin/splunk start

sudo -u splunkfwd vi /opt/splunkforwarder/etc/system/local/outputs.conf
(以下を末尾に追記)
--
[tcpout]
defaultGroup = default-autolb-group

[tcpout:default-autolb-group]
indexerDiscovery = idxc1

[indexer_discovery:idxc1]
manager_uri = https://<CMの内部IPアドレス>:8089
pass4SymmKey = idxfwdkey

sudo -u splunkfwd /opt/splunkforwarder/bin/splunk restart
---
```
※splunk set servernameとsplunk set default-hostnameで指定している箇所は、サーバーによって変更するようにしてください。

確認コマンド
```
sudo -u splunkfwd cat /opt/splunkforwarder/etc/system/local/outputs.conf
(以下のように表示)
---
[tcpout]
defaultGroup = default-autolb-group

[tcpout:default-autolb-group]
indexerDiscovery = idxc1

[indexer_discovery:idxc1]
manager_uri = https://<CMのIPアドレス>:8089
pass4SymmKey = $7$bhWlmv9cpfpf8dDzAeRRcZZSgZ71CA7DQu2Fec4kTXxU1zBKqtojtDM=
---
```

#### 【補足】Indexer Discoveryとは

Search HeadやCluster Manager、Monitoring Consoleの内部ログをインデックスとして保存する際に、Indexer Discoveryという機能を使って転送先のIndexerを指定しています。

概要としては、この機能は、Indexer Clusterを構成しているIndexerのリストをCluster Managerが保有しているので、Cluster Managerに問い合わせしてそのリストをもらって、そのリストに向けてログを転送させるための機能です。

本来この機能は、Forwarderが転送先Indexerを識別するために使用する機能ですが、内部ログを転送するためにSearch HeadやMonitoring Consoleにも同じ設定をしています。

参考：Use indexer discovery to connect forwarders to peer nodes
https://docs.splunk.com/Documentation/Splunk/latest/Indexer/indexerdiscovery

### 作業結果確認

全ての作業が終わったら、Search Headにログインし、サーチを実行してみます。
https://< SHの外部IPアドレス >:8000/en-US/app/search/search

以下サーチを実行し、全8台のサーバーの内部ログがインデックス化されていることが確認できれば作業は完了です。

```
index=_internal
| dedup host
| table host
```

![スクリーンショット 2025-01-23 15.11.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/f64d0cd1-93dc-cae9-ffff-1fc139a54cc8.png)


### その他参考資料

License Managerの構築手順
https://docs.splunk.com/Documentation/Splunk/latest/Admin/Configurealicensemanager

Indexer Clusterの構築手順
https://docs.splunk.com/Documentation/Splunk/latest/Indexer/Clusterdeploymentoverview

Indexer ClusterへのSearch Head追加手順(CLI)
https://docs.splunk.com/Documentation/Splunk/latest/Indexer/ConfiguresearchheadwithCLI

Monitoring Consoleの構築手順
https://docs.splunk.com/Documentation/Splunk/latest/DMC/Configureindistributedmode


以上です。