Standalone環境における構成のSplunkデプロイ

## SmartStoreとは

SplunkにおけるSmartStore機能とはインデックスデータの格納先をローカルのストレージではなく、Amazon S3などのリモートオブジェクトストアに格納することができる機能です。

Splunk Enterpriseのバージョンとしては、7.2以上から利用可能です。

## SmartStoreのメリット

SmartStoreにはざっくり以下のようなメリットがあるんじゃなかろうかと思います。

* EBSを使う場合に比べてコストを削減することが可能。
* 可用性やデータ回復機能などAWS側に負担してもらうことで運用負担を減らせる。

基本的にAWSを利用しているのであれば使わない手はないんじゃないかな？と思いますが、Splunkで古いインデックスに頻繁にアクセスする場合は、リモート先に頻繁にアクセスすることになるため、パフォーマンス的なところで微妙に心配だったりします。なんでも使える銀の弾丸では無いと思うので、そのあたりの見極めはしっかりしましょう。

## SmartStoreでサポートされていない機能

SmartStoreを使うことでいくつかサポートされなくなる機能がありますが、そんなに気にするようなところはないんじゃないかな？というのが個人的な感想です。たとえば以下のようなものがあります。

* tsidxを削減するオプション`enableTsidxReduction`を`true`にしない。
* `createBloomfilter`を`false`にしない。

この他にもいくつかローカルストレージを使う場合と互換性の無い設定やサポートされていない設定があるので、[ドキュメント](https://docs.splunk.com/Documentation/Splunk/7.3.0/Indexer/ConfigureSmartStore#Settings_in_indexes.conf_that_are_incompatible_with_SmartStore_or_otherwise_restricted)をしっかり読まれると良いと思います。

## SmartStoreを使う上での制約・制限

今回はStandalone環境でのSmartStore構築なので、クラスタ部分は関係ないですが、以下のような制約もあったります。気になった点を以下に記載しましたが、これですべてではないと思うので、ドキュメントをしっかりと参照されることをオススメします。

* インデクサークラスタ環境ではRFとSFを同じ数にする
* homePathとcoldPathは同じパーティションにする
* S3バケットには読み取り、書き込み、削除の権限が必要
* EC2と同じリージョンにバケットをプロビジョニングすること
* 複数のSplunkデプロイメントからひとつのS3を参照しちゃいけない

## ローカルストレージの要件

Splunkのインデックスデータはバケツと呼ばれる塊毎にステージを移行していきます。新しいものから、hot > warm > cold > frozen と進んでいくのですが、SmartStoreはhotからwarmにステージが変わるときにリモートオブジェクトストアに格納されます。なので、ローカルストレージにもある程度のサイズが必要になります。

Splunk社の推奨としては30日間のインデックスが保持できる容量をローカルに確保しておくと良いとのことです。つまり、一日に100GBのインデックスデータが出来上がるなら、3000GBをローカルストレージとして用意しておく必要があるということですね。

## AWS S3の暗号化について

Splunkとして、暗号化方式についてはsse-cを推奨しています。KMSを使ったほうが保守運用が楽ちんだと思いますが、KMSの場合はリクエストに制限がありその制限にひっかかってしまうと、もろもろの処理がエラーになってしまうからだと思われます。KMSを利用する場合はそのあたりをモニタリング／検証する必要があるかと思います。

## 作業手順

それでは簡単に構築手順です。とっても簡単！簡単！

### AWS S3バケットの作成

* AWSマネージメントコンソールからS3のホーム画面を開く
* **バケットを作成する**ボタンを選択する
* **バケット名**に任意の名前を入力する
* **リージョン**はEC2インスタンスと同じリージョンにする
* **次へ**を選択する
* **バージョニング**の設定を有効にする
* **サーバーアクセスログ**の設定を有効にし、適当なs3バケットを選択する
* **Tags**は任意
* **デフォルト暗号化**を有効にし、**AWS-KMS**を選択する
* **次へ**を選択する
* **パブリックアクセスをすべてブロック**をチェックする
* **システムのアクセス許可の管理**は**Amazon S3 ログ配信グループにこのバケットへの書き込みアクセス権限を付与しない**を選択する
* **次へ**を選択する
* **バケットを作成**を選択する

```
AWS S3の設定については各環境毎のポリシーに合わせて作成してください。
```

### Splunk Enterpriseのインストール

これはいわずもがな。普通にそのままインストールしてくだされ

### IAMロールのアタッチ

SmartStoreのドキュメントを読んだのですが、アクションレベルでのポリシー要件が見つけられませんでした・・・ので今回は  S3とKMSのフルアクセスを対象のリソースに対して設定しアタッチしています。。。

どこかに書いてあるよ！とかあれば教えて欲しい。

### 設定ファイルの展開

SmartStoreの設定に必要な最低限の設定ファイルは`indexes.conf`だけです。`$SPLUNK_HOME/etc/system/local`とかに作ってもいいですが、私は設定ファイルをAppにまとめてアップロードするようにしているので、その方法でやります。

まずは以下のような構成でローカルマシンにディレクトリ/ファイルを用意します。

```
smartstore_config
├── local
│   ├── app.conf
│   ├── indexes.conf
│   └── server.conf
└── metadata
    └── local.meta
```

`app.conf`の中身はこんな感じ。これはお決まりです。

```
[install]
state = enabled

[package]
check_for_updates = false

[ui]
is_visible = false
is_manageable = false
```

`indexes.conf`はこんな感じ。コメントをつけているので、なんとなくわかるかと思います！

```
[default]
# すべてのインデックスがremote_storeボリュームを参照するようにします。
remotePath = volume:remote_store/$_index_name

# remote_storeボリュームのストレージタイプはremoteにします。
[volume:remote_store]
storageType = remote

# 利用するS3のバケットを指定します。
path = s3://<s3 bucket name>

# AWS IAMを使って認証する場合、以下の設定は不要です。
# remote.s3.access_key = <S3 access key>
# remote.s3.secret_key = <S3 secret key>
# remote.s3.endpoint = https:|http://<S3 host>

# AWS KMSを利用する場合には以下の設定が必要です。
remote.s3.encryption = sse-kms
remote.s3.kms.key_id = <kms id>
```

`server.conf`はcachemanagerの設定のデフォルト値を並べているだけです。これはなくてもOKです。デフォルト値なので。

```
[cachemanager]
max_concurrent_downloads = 8
max_concurrent_uploads = 8
eviction_policy = lru
enable_eviction_priorities = true
eviction_padding = 5120
max_cache_size = 0
persist_pending_upload_from_external = true
persistent_id_set_remove_min_sync_secs = 5
enable_open_on_stale_object = true
hotlist_recency_secs = 86400
hotlist_bloom_filter_recency_hours = 360
```

`local.meta`はこんなかんじ。これもお決まりです。

```
[]
access = read : [ * ], write : [ admin ]
export = system
```

ここまで用意できたら、この例で行くと`smartstore_config`をSplunkがインストールされたインスタンスの`/opt/splunk/etc/apps/`配下（$SPLUNK_HOMEが/opt/splunkである前提）にそのままアップロード！

そしてSplunkを起動すればOKです！！

## まとめ

SmartStoreを使えば運用の負担を減らせるし、コストも削減できるしでいいことだらけですね！ただし、大規模に使っているケースではサーチのパフォーマンスとかAWS側の制約・制限を気にする必要があったりしますので、そのへんはご注意を！

また実際には枯れきれていないですし、変な不具合にあたったこともありますが、どんどんやってしまえば良いと思います！！

というわけで良いSplunkライフを！！！！