【Splunk】9997/TCP(S2S)でなくHTTPS(HEC)を使用したデータ転送

こんばんは。torippy1024です。
本日は、Splunk Cloudにデータを転送する際に、標準の9997/TCPでなく、443(HTTPS)にて転送を行う方式について記事を書きます。


## Splunkにおけるログ転送ポート

Splunkにおいて、ログをForwarderからIndexerに転送する際の転送ポートは、デフォルトでは9997/TCPを使用します。

しかし、Splunk Cloudを使用する際に、間にFWやプロキシサーバーが入っており、構成上または社内ポリシーによる制限がある場合など、9997ポートでなく別の通信ポートを使用したい場合があります。

![スクリーンショット 2025-03-17 16.52.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/f8699245-0856-4da1-9c26-669550efd58e.png)

このような状況に対応するためには、HEC(HTTP Event Collector)という機能があります。HECを使うことで、443ポート(HTTPS)を使ってログ転送を行うことができます。

https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector

ちなみに、Splunkの各コンポーネントが通信するポートは以下に記載されています。(Splunk Enterpriseのドキュメントで、Splunk Cloudだとちょっと違うところがあるかもしれませんが)
https://docs.splunk.com/Documentation/Splunk/latest/InheritedDeployment/Ports

## HECを使用したログ転送方式

HECを使用したログ転送方式には、大きく二つの方法があります。
(1)イベント登録APIを実行する方式と、(2)httpoutによってログ転送する方式です。

どちらの方法であっても、Splunk CloudからHECトークンを発行し、そのトークンを使用してHTTPS通信を行うことは変わりません。

(1)の方式は、イベントを登録するためには都度APIを実行する必要があるのに対し、(2)の方法は、Forwarderがログを転送する際に9997ポートによる転送をHTTPSでカプセル化して転送するもののようです。

単にHECと言う時は、HTTPプロトコルを使用してログデータを転送することであるため、上記のどちらを指しているのか判別しづらい時があります。ただ最初に書いた、構成上または社内ポリシーによる制限がある場合の代替手段とする場合は(2)の方式を考えることが多いため、HECだけでなく、httpoutという呼び方をしたほうが意図が明確になると思われます。


## HECを使用したイベント登録手順

それでは、実際にHECを使ったイベント登録手順を試してみます。

### HTTPトークンの発行
(1)にしろ(2)にしろ、HECトークンの発行は必須です。
Splunk Cloudからトークンを発行します。ただ特にこの作業は難しくありません。

Splunkにログインし、「設定」-「データ入力」を選択します。
次に、「HTTPイベントコレクター」の「新規作成」を選択します。

その後、トークン一覧より「新規トークン」を選択し、必要な項目を入力します。

![スクリーンショット 2025-03-17 15.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/8fcbd13a-0447-4e96-8480-e890e1acf19d.png)

|項目名|説明|値の例|
|---|---|---|
|名前|トークンの名称。任意の値。|test-token|
|ソース名上書き|HECを登録するイベントに対して設定するsourceの値。何も指定しないとhttp:<トークンの名前>となる。|hec|
|詳細|トークンの説明。省略可能|test|
|インデクサー確認を有効化|インデクサー確認(Indexer acknowledgement)を有効化するかのチェック欄。テスト目的であればなしでよい。|(チェックあり/なし)|

入力設定では、ソースタイプ、HECによってイベントを登録できるインデックス、デフォルト登録先インデックスを指定します。今回はテストのため、許可されたインデックスとデフォルトインデックスに「main」を指定しておきます。

![スクリーンショット 2025-03-17 15.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/bcbdd1a8-a3d6-4380-977d-c3293381ac38.png)

確認画面で「実行」を選択するとトークンが作成されます。

![スクリーンショット 2025-03-17 15.25.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/d757d58c-2e9c-4ba6-b9bb-2ca5423713b3.png)

![スクリーンショット 2025-03-17 15.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/adfdf010-a513-4276-a67b-d23d3e270b98.png)

公式ドキュメントの手順は以下です。
https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector#Configure_HTTP_Event_Collector_on_Splunk_Cloud_Platform

### (1)イベント登録APIを実行する手順

トークンさえ取得できれば、あとは簡単です。
手元にある端末より、以下コマンドを実行することでイベントを登録できます。

サンプル
https://docs.splunk.com/Documentation/Splunk/latest/Data/HECExamples#Explicit_JSON_fields_example

```
curl "https://inputs.prd-p-abcde.splunkcloud:8088/services/collector" \
    -H "Authorization: Splunk 92d66a00-a594-4482-ab4d-37a8cb598721" \
    -d '{"event": "Hello, world!", "sourcetype": "manual"}'
```

上記は、Splunk Cloudトライアル環境でのコマンド例です。トライアル環境ではポートは8088を使用することに注意してください。本番環境では443ポートを使用します。またURLについても、若干の違いが発生します。

Splunk Cloudトライアル環境と本番環境との差異は以下のドキュメントを参照してください。
Splunk Cloud Platform deployment types
https://docs.splunk.com/Documentation/SplunkCloud/latest/Admin/TypesofSplunkClouddeployment

### (2)httpoutによってログ転送する手順

Forwarderから、9997ポートでなくHECを使った通信でログを転送するには、outputs.confを修正します。
以下のように、outputs.confに[httpout]stanzaを追加します。これでForwarderがHECを使用してログを転送するようになります。
(逆に言うと、[tcpout]stanzaで定義されている従来の9997ポートによる転送はできなくなるため注意してください)

```
sudo vi /opt/splunkforwarder/etc/system/local/outputs.conf 

--- (以下を追記) ---
[httpout]
httpEventCollectorToken = 92d66a00-a594-4482-ab4d-37a8cb598721
uri = https://inputs.prd-p-abcde.splunkcloud:8088
------

/opt/splunkforwarder/bin/splunk restart
```

再起動すると、httpEventCollectorTokenの値は暗号化され、元の値は確認できなくなることには注意が必要です。もし間違えてしまった場合は、再度暗号化前トークンの値を確認し、上書きしてForwarderを再起動しましょう。

無事にSplunk Cloudにログが転送されるようになったら成功です。

公式ドキュメントは以下です。
https://docs.splunk.com/Documentation/Forwarder/latest/Forwarder/Configureforwardingwithoutputs.conf


## HECを使用する上での注意/考慮事項

HECを利用する際には、いくつかの注意事項があります。
- Indexer Acknowledgement(Indexer側のデータ受取確認)などの機能が利用できない
    - HECによってIndexerに送信したイベントが、正常にインデックス化されたことまで確認するための機能です。しかし本機能はSplunk Cloud上のHECでは使用できません。
    - https://docs.splunk.com/Documentation/Splunk/latest/Data/AboutHECIDXAck
- 中継Forwarderを経由した多段転送ができない
    - UF -(1)-> HF -(2)-> Splunk Cloudという経路があった場合、(1)(2)を両方HECとすることはできない。(1)を9997、(2)をHECとすることは可能。
- 大量データの送受信を行う場合キューがあふれデータの欠損や多重登録の恐れがある
    - Splunk Cloudにデータ転送し、受け取りは完了(200 OK)となったが、Indexer側のトラブルや再起動などでインデックス化が行われなかった場合(データ欠損)
    - HTTPリクエストの一部のデータのみが転送されインデックス化されたが、その後HTTPリクエストが再送された場合(データ重複)

そもそもHECとは、本来9997ポートでの通信を行うはずだったものを、少し無理やりにHTTPSでカプセル化して通信できるようにしたものなので、Splunkとしてはできる限り9997ポートでの通信を採用することを推奨しているようです。

以上です。