【Splunk】DockerでSplunkのログ転送ができる環境（All-In-One, UF）をほぼCLIで構築してみる

どうも、おはこんばんわ。

今更ながらDockerでSplunkを実装したかったので、やってみた。


##バージョン
・Docker 2.3.0.3 (Windows) [Download link](https://www.docker.com/)

・Splunk Enterprise 8.0.4.1 [Docker hub](https://hub.docker.com/r/splunk/splunk)
　バージョン毎のレポジトリも存在するので、気になる方はDocker Hubで検索してみてください。

・Splunk Universal Forwarder 8.0.4.1 [Docker hub]()
　バージョン毎のレポジトリも存在するので、気になる方はDocker Hubで検索してみてください。

##Splunkの構成
++++++++++++++++++++++++++
+　Client < === > AIO < === > UF　+
++++++++++++++++++++++++++
AIO = Splunk All-In-One
UF  = Splunk Universal Forwarder

##使用ポート
|通信名|送信元|宛先|UDP/TCP|ポート番号|備考|
|:---|:---|:---|:---|:---|:---|
|Splunk Web|Client|AIO|TCP|8000|Default|
|ログ転送|UF|AIO|TCP|9997|Default|
|Deploy polling|UF|AIO|TCP|8089|Default|
|App配布|AIO|UF|TCP|8089|Default|
*詳しくは、右記公式マニュアルを参照してください。[link](https://docs.splunk.com/Documentation/Splunk/8.0.4/InheritedDeployment/Ports)

##Splunk Enterprise のイメージをダウンロードしてみる
```
docker pull splunk/splunk:latest
```
1秒くらいで終わります。

##ダウンロードしたイメージを確認してみる
```
docker images
REPOSITORY TAG IMAGE ID CREATED 
splunk/splunk latest 74d1b0a6924f X weeks ago
```
ちゃんといますね。

##Splunk Enterprise を run してみる
```
docker run -d -p 8000:8000 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=password" --name splunk splunk/splunk:latest
```
検証用なので、ほぼデフォルトで稼働させます。

##ステータスも確認してみる
```
docker exec -it -u splunk splunk /bin/bash -c "/opt/splunk/bin/splunk status"
splunkd is running (PID: 687).
splunk helpers are running (PIDs: 688 702 764 787).
```
どうやら最初からデーモンが開始されている様です。

##ついでにバージョンを確認してみる
```
docker exec -it -u splunk splunk /bin/bash -c "/opt/splunk/bin/splunk version" 
Splunk 8.0.4.1 (build ab7a85abaa98)
```

##Splunk Web にアクセスしてみる
```
<IP_ADDR>:8000
```
>デフォルトのユーザ情報は以下の通りです。
>Username = admin
>Password = password

Splunk のホーム画面が表示されたらOKです。
*画像が貼れなくて申し訳ない。

表示できたらUFの実装をサクサクやってみましょう！

##Universal Forwarder のイメージをダウンロードしてみる
```
docker pull splunk/universalforwarder:latest
```
これも1秒くらいで終わります。

##ダウンロードしたイメージを確認してみる
```
docker images
REPOSITORY TAG IMAGE ID CREATED 
splunk/universalforwarder latest 596e5124bd2b X weeks ago
```

##Universal Forwarder を runしてみる
```
docker run -d -p 9997:9997 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=password" --name uf splunk/universalforwarder:latest
```
Enterprise と同様デフォルトで稼働させます。

##ステータスを確認してみる
```
docker exec -it -u splunk uf /bin/bash -c "/opt/splunkforwarder/bin/splunk status"
splunkd is running (PID: 727).
splunk helpers are running (PIDs: 729).
```

##ついでにバージョンを確認してみる
```
docker exec -it -u splunk uf /bin/bash -c "/opt/splunkforwarder/bin/splunk version"
Splunk Universal Forwarder 8.0.4.1 (build ab7a85abaa98)
```

##UF から All-In-One にログの転送する為の準備①をしてみる（All-In-One側の受信ポート設定）
```
#App作成コマンド
docker exec -it -u splunk splunk /bin/bash -c "mkdir -p /opt/splunk/etc/apps/{<APP_NAME>/local,/<APP_NAME>/metadata}"
docker exec -it -u splunk splunk /bin/bash -c "touch /opt/splunk/etc/apps/<APP_NAME>/local/app.conf"
docker exec -it -u splunk splunk /bin/bash -c "touch /opt/splunk/etc/apps/<APP_NAME>/metadata/local.meta"
docker exec -it -u splunk splunk /bin/bash -c "touch /opt/splunk/etc/apps/<APP_NAME>/local/inputs.conf"
docker exec -it -u splunk splunk /bin/bash -c "echo -e "[ui]\\nis_visible" "=" "false\\n\\n[launcher]\\nversions" "=" "1.0.0\\n" >> /opt/splunk/etc/apps/<APP_NAME>/local/app.conf"
docker exec -it -u splunk splunk /bin/bash -c "echo -e "[]\\naccess" "=" "read" ":" "[" "\*" "]," "write" ":" "[" "\*" "]\\nexport" >> /opt/splunk/etc/apps/<APP_NAME>/metadata/local.meta"
docker exec -it -u splunk splunk /bin/bash -c "echo -e "[splunktcp://9997]\\nconnection_host" "=" "ip\\n" >> /opt/splunk/etc/apps/<APP_NAME>/local/inputs.conf"

#確認コマンド
docker exec -it -u splunk splunk /bin/bash -c "ls -lR /opt/splunk/etc/apps/<APP_NAME>"
docker exec -it -u splunk splunk /bin/bash -c "cat /opt/splunk/etc/apps/<APP_NAME>/local/app.conf"
docker exec -it -u splunk splunk /bin/bash -c "cat /opt/splunk/etc/apps/<APP_NAME>/metadata/local.meta"
docker exec -it -u splunk splunk /bin/bash -c "cat /opt/splunk/etc/apps/<APP_NAME>/local/inputs.conf"
```
>\<APP_NAME>、はお好みに変更してください。
*センスの無いコマンドはご愛敬で。。。

##UF から All-In-One にログの転送する為の準備②をしてみる（UF側で Target Deployment Server）
```
docker exec -it -u splunk uf /bin/bash -c "/opt/splunkforwarder/bin/splunk set deploy-poll <IP_ADDR>:8089"
```
>\<IP_ADDR>は、「All-In-One」のIPアドレスを入力します。

##UF から All-In-One にログの転送する為の準備③をしてみる（UF配布用ログ転送Appの作成）
```
#App作成コマンド
docker exec -it -u splunk splunk /bin/bash -c "mkdir -p /opt/splunk/etc/deployment-apps/{<APP_NAME>/local,/<APP_NAME>/metadata}"
docker exec -it -u splunk splunk /bin/bash -c "touch /opt/splunk/etc/deployment-apps/<APP_NAME>/app.conf"
docker exec -it -u splunk splunk /bin/bash -c "touch /opt/splunk/etc/deployment-apps/<APP_NAME>/metadata/local.meta"
docker exec -it -u splunk splunk /bin/bash -c "touch /opt/splunk/etc/deployment-apps/<APP_NAME>/local/outputs.conf"
docker exec -it -u splunk splunk /bin/bash -c "echo -e "[ui]\\nis_visible" "=" "false\\n\\n[launcher]\\nversions" "=" "1.0.0\\n" >> /opt/splunk/etc/deployment-apps/<APP_NAME>/local/app.conf"
docker exec -it -u splunk splunk /bin/bash -c "echo -e "[]\\naccess" "=" "read" ":" "[" "\*" "]," "write" ":" "[" "\*" "]\\nexport" "=" "system\\n" >> /opt/splunk/etc/deployment-apps/<APP_NAME>/metadata/local.meta"
docker exec -it -u splunk splunk /bin/bash -c "echo -e "[tcpout]\\ndefaultGroup" "=" "test\\nuseACK" "=" "true\\n\\n[tcpout:test]\\nserver" "=" "<IP_ADDR>\\n" >> /opt/splunk/etc/deployment-apps/<APP_NAME>/local/outputs.conf"

#確認コマンド
docker exec -it -u splunk splunk /bin/bash -c "ls -lR /opt/splunk/etc/deployment-apps/"
docker exec -it -u splunk splunk /bin/bash -c "cat /opt/splunk/etc/deployment-apps/<APP_NAME>/local/app.conf"
docker exec -it -u splunk splunk /bin/bash -c "cat /opt/splunk/etc/deployment-apps/<APP_NAME>/metadata/local.meta"
docker exec -it -u splunk splunk /bin/bash -c "cat /opt/splunk/etc/deployment-apps/<APP_NAME>/local/outputs.conf"
```
>\<IP_ADDR>は、「All-In-One」のIPアドレスを入力します。
>\<APP_NAME>、はお好みに変更してください。

上記で作成したAppをUFに配布されます。

##UF から All-In-One にログの転送する為の準備④をしてみる（サーバクラスの作成）
```
#serverclass.conf作成コマンド
docker exec -it -u splunk splunk /bin/bash -c "touch /opt/splunk/etc/system/local/serverclass.conf"
docker exec -it -u splunk splunk /bin/bash -c "echo -e "[general]\\nrestartSplunkd" "=" "true\\nrestartSplunkWeb" "=" "false\\nstateOnClient" "=" "enabled\\n\\n[serverClass:<CLASS_NAME>]\\nwhitelist.0" "=" "<IP_ADDR>\\n\\n[serverClass:<CLASS_NAME>:app:<APP_NAME>]\\n" >> /opt/splunk/etc/system/local/serverclass.conf"

#確認コマンド
docker exec -it -u splunk splunk /bin/bash -c "cat /opt/splunk/etc/system/local/serverclass.conf"
```
>\<APP_NAME>は、「UF配布用ログ転送Appの作成」の<APP_NAME>と一致させてください。
>\<IP_ADDR>は、「UF」のIPアドレスを入力します。
>\<CLASS_NAME>は、お好みに変更してください。

##UF から All-In-One にログの転送する為の準備⑤をしてみる（デプロイ）
```
docker exec -it -u splunk splunk /bin/bash -c "/opt/splunk/bin/splunk reload deploy-server"
Splunk username: admin
Password:
Reloading serverclass(es).
```
サクセス！！

##UF が Deployment Server と疎通ができたか確認してみる
Splunk Web にアクセスして、確認してみましょう。
・アクセスURLは、右記です。<http://localhost:8000/ja-JP/manager/system/deploymentserver>
・アクセス方法は、「Splunk Web」→右上「設定」→「フォーワーダー管理」に遷移した後、「クライアント」に存在していれば疎通OKです。

##ログの転送確認をしてみる
最後の確認も Splunk Web で確認します。
・アクセスURLは、右記です。<http://localhost:8000/ja-JP/app/search/search>
・アクセス方法は、「Splunk Web」→左部App「Search & Reporting」
・アクセス後、サーチバーへ以下のサーチ分を実行してみましょう。

```
index=_internal clientip="<UF_IP_ADDR>"
```
結果が表示されたらOKです。
*画像が無いのは申し訳ないです。。。

##おわりに
Dockerで構築ってすっごい簡単ですし、不要になったら消せるので、気軽に試してみてください！
その際に参考になれば幸いです。

また、今回はUFの内部ログのみ収集をしていますが、様々なログを収集できるので、詳しくは公式マニュアルか他の方々のサイトを参考にしていただければと思います。
もし機会があれば、そのあたりも書こうかなって思います。
（何時迄にはと言ってない。。。）

10-4, 10-10