この記事は Splunk Advent Calendar 2024 4日目の記事です。
Splunk Advent Calender は昨年も参加していまして二年連続の参加です。
Splunk の Ingest Actions(取り込みアクション)
今回ご紹介するのは、Splunk の Ingest Actions(取り込みアクション)についてです。
Splunk はいろいろな活用方法がありますが、一日のログ取り込み容量によるライセンスが存在しています。
Ingest Actions により、
- 取り込み前にデータを成形したり
- Splunk にインデックス化しなくても良いログを別途書き出す
ことができます。
9.2 以前は別途書き出すといっても、AWS の S3 にしか出力できませんでしたが、Splunk 9.3 より、NFS サーバーやローカルなどのローカルのファイルシステムにも保存できるようになりました。
普段 OpenStack や VMware といったプライベート環境だったり、パブリッククラウドだとしても GCP や Azure、Oracle Cloud など使われていて、AWS と縁が無かった方も利用できるようになりました。
ドキュメントにも下記のように書かれており、ライセンス面も問題ないと考えられます。
Ingest-based licenses: Data that is filtered or routed by the ingest actions feature, such that the data does not get added to an index, does not count against your license.
メリット
ここで別の場所に書き出されたログは、Splunk のサーチ機能は使えませんが、
- Splunk Universal Forwarder による高機能なログ収集
- Splunk のデプロイサーバーによる設定一元管理
- Splunk のプロトコルによるより安定した通信
といったメリットはありますので、独自に syslog サーバーを立てるよりは、既存の Splunk のシステムを使えた方が便利な場合もあります。
試してみる
今回は Splunk 9.3.2 で試してみます。
取り込みアクション設定画面の表示
設定 → 取り込みアクションを選択します
一部日本語化されていませんが、Destinations を選択 New Destination → ファイルシステムを選びます
保存先の設定
名前とディレクトリパスを入力します。
実際の保存先は、年/月/日でサブディレクトリが作られるので、別途古くなったログを削除する仕組みを作る際も簡単に判断できます。
[Partition by sourcetype as secondary key] により、保存先は下記のようになります。
[Partition by sourcetype as secondary key] なし(デフォルト)
file://(指定のパス)/year={YYYY}/month={MM}/day={DD}/events_{lt}_{et}_{field_create_epoch}_{32b_seq_num}_{peer_guid}.ndjson.gz
[Partition by sourcetype as secondary key] あり
file://(指定のパス)/year={YYYY}/month={MM}/day={DD}/sourcetype={sourcetype}/events_{lt}_{et}_{field_create_epoch}_{32b_seq_num}_{peer_guid}.ndjson.gz
追加設定
この画面ではログ保存の詳細設定ができます。
プレビューが表示されているのでわかりやすいです。
圧縮方式は下記の三つから選べます。
- gzip(デフォルト)
- zstd
- lz4
- 無効(非圧縮)
Linux サーバーの /var/log/ などでおなじみの gzip が使われており有名なところではありますが、
zstd は近年登場した圧縮方式で、圧縮率が高く高速だそうです。
lz4 は圧縮率よりもさらに速度を重視する場合に選ばれるようです。
保存したログの使い道次第ですが、zstd を基本にしてもよいのかなと思います。
保存先登録完了
このように登録されれば完了です。
取り込めたログの確認
ディレクトリ構成
下記のように保存されます。
# ll /export/splunk/year\=2024/month\=12/day\=03/
total 36
-rw------- 1 root root 8002 Dec 3 23:54 events_1733230800_1733227200_0_000000_43E00985-8B55-49DC-AA73-A5578E3276EB.log.zst
-rw------- 1 root root 513 Dec 3 23:54 events_1733234400_1733230800_0_000000_43E00985-8B55-49DC-AA73-A5578E3276EB.log.zst
-rw------- 1 root root 832 Dec 3 23:54 events_1733238000_1733234400_0_000000_43E00985-8B55-49DC-AA73-A5578E3276EB.log.zst
-rw------- 1 root root 19581 Dec 3 23:54 events_1733263200_1733259600_0_000000_43E00985-8B55-49DC-AA73-A5578E3276EB.log.zst
[Partition by sourcetype as secondary key] なしで設定したため、パスには時刻情報しかありません。
ファイル名の 1733230800_1733227200 は Unixtime ですので、ファイル名からおおよその時刻を推定することもできます。
保存形式に関する注意点
raw 形式で出力した場合、付属の情報が無くなってしまうので、
複数の種類のログがある場合、少なくとも sourcetype 別のディレクトリがあるとよいですし、
複数のホストのログを集約する場合は、syslog 形式のようにログの中にホスト名がある形式が望ましいと思います。
json 形式であれば、
{"time":123456789,"event":"2022-01-02 12:00:00, 000 -0700 INFO event - 2","host":"some-host","source":"/some/folder/sample.log","sourcetype":"some-sourcetype"}
zstd ファイルの注意点
zstd 圧縮で保存すると、拡張子が zst となります。
zcat などは gzip 形式に対応したコマンドですので、zstd ファイルを取り扱うには
- zstdcat
- zstdgrep
- zstdless
といったコマンドを使うことになります。
json で書き出した場合、jq コマンドと組み合わせることになりますが、jq は直接圧縮ファイルを取り扱えないので、直接 grep などしやすい raw 形式が良いのかなとは思います。
まとめ
Splunk 9.3 で導入されたIngest Actions(取り込みアクション)のローカル保存により、これまでコスト面から Splunk を導入できなかった環境や、将来的に正式なライセンスを購入予定だけど・・・といった場面でも利用しやすくなったと思います。
Splunk のサーチ機能が全く使えないのでとりあえずためておくといった使い方にはなってしまうと思いますが、
GUI で設定でき、簡単に試せますので気になった方は是非使ってみて下さい。