はじめに
Splunkは様々なデータに対応した統合ログプラットフォームです。
SPLというサーチ言語を利用してログから自分の見たい情報を抽出、Commnadsを活要して集計処理やデータの加工など様々なことが可能です。
本記事ではSplunkそのものや様々なCommandsの解説はしないためSplunkをより詳しく知りたい方はチートシートや公式ドキュメントを参照いただければと思います。日本語マニュアルも充実しています。
やってみること
SplunkのBlog Manage Your Splunk Infrastructure as Code Using Terraformを参考にローカル環境SplunkのリソースをTerraformで管理してみます。
具体的に作成するリソースは以下です。
- ロール
- ユーザー
- インデックス
- ダッシュボード
ダッシュボード以外はほぼSplunkのBlogと同じ手順を辿っています。
利用した環境
今回ローカル環境にSplunkの無料トライアル版をインストールし、その環境で遊んでみました。
無料トライアル版はデータの取り込み量の制限は1日500MBまでとなりますが、60日間無償でSplunkの各種機能を利用可能です。
60日経過後は有償版のライセンスを適用するか、出来ることはかなり減りますがフリー版のライセンスに移行することが可能です。
事前準備
- ローカル環境にSplunkをインストール(こちらの手順は割愛)
- ブラウザから
http://localhost:8000/
でインストール時に作成したadminアカウントでローカルのSplunkに接続できることを確認
- ブラウザから
- TerraformのSplunk ProviderのRequirementsがv0.12のため手元の環境をtfenvを利用して手元のTerraformをv0.12以上に設定
# terraformのVersion管理の補助ツールであるtfenvをインストール
$ brew install tfenv
# インストール可能なversionを確認
$ tfenv list-remote
# 任意のversionをインストール
$ tfenv install <任意のVersion>
# 利用するTerraformのversionを設定
$ tfenv use <任意のVersion>
- 適当なSampleデータが欲しいのでこれもSplunkのチュートリアルからzipを手元にダウンロード
TerraformでSplunkにリソース作成
事前準備が出来たら実際にTerraformを使ってSplunkのリソースを管理してみます。
TerraformでSplunkへ接続
Terraform作業用のディレクトリ(今回はsplunk)を作成し、作業用ディレクトリ配下に移動しmain.tfを作成します。
$ mkdir ./splunk
$ cd ./splunk
$ touch main.tf
作成したmain.tfにprovider情報を記述します。
terraform {
required_providers {
splunk = {
source = "splunk/splunk"
version = "1.4.17"
}
}
}
provider "splunk" {
url = "localhost:8089"
username = "<Splunkインストール時に設定したAdminアカウント>"
password = "<Splunkインストール時に設定したAdminパスワード>"
insecure_skip_verify = true
}
作業ディレクトリの初期化コマンドが無事に成功することを確認します。
$ terraform init
Terraform has been successfully initialized!
と表示されれば完了です。
planを実行
$ terraform fmt
$ terraform plan
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are
needed.
この状態ではまだ何もTerraformではリソースを管理していないためNo changesと表示されます。
ユーザーとインデックス作成
Splunkにテスト用のユーザーとロール、インデックスを作成するためmain.tfに以下を追記します。
// Role
resource "splunk_authorization_roles" "role01" {
name = "terraform-user01-role"
default_app = "search"
imported_roles = ["power", "user"]
capabilities = ["accelerate_datamodel", "change_authentication", "restart_splunkd"]
}
// User
resource "splunk_authentication_users" "user01" {
name = "user01"
email = "sample@sample.sample"
password = "<任意のパスワード>"
force_change_pass = false
roles = ["terraform-user01-role"]
depends_on = [
splunk_authorization_roles.role01
]
}
// Index
resource "splunk_indexes" "index01" {
name = "index01"
max_total_data_size_mb = 1000000
}
テスト用のRoleとユーザー、インデックスを定義するリソースを記述しました。この状態でplanを実行し問題なければapplyします。
$ terraform fmt
# Plan実行、Plan: 3 to add, 0 to change, 0 to destroy.と表示されればOK
$ terraform plan
# Apply実行、Apply complete! Resources: 3 added, 0 changed, 0 destroyed.と表示されればOK
$ terraform apply -auto-approve
Splunk上でもユーザーが作成されたこと、作成したユーザーでもログインが可能なことを確認します。
作成したIndexにテスト用データを投入
テスト用のデータは正直なんでも良いのですが、今回はSplunkのチュートリアルで使われるデータを利用することにしました。
- 事前準備でダウンロードしたデータを解凍し、Splunkに取り込みます
index="index01" host="test"
| timechart span=1h count
では次はこのSPLを使ったダッシュボードの作成をTerraformでしてみたいと思います。
ダッシュボードを作成
ユーザーやインデックス作成まではほぼSplunkのBlogと同じ内容を実施してきましたが、せっかくなのでダッシュボードも作成してみます。
ダッシュボードはTerraformのsplunk providerでは「splunk_data_ui_views」で定義します。
Argument:eai:data
の中にダッシュボードをXMLで定義する必要がありますが、さすがにダッシュボード用のXMLを0から構築するのは残念ながら自分のSplunk力だと無理です。。
なので今回は1度手動でダッシュボードを作成し、SplunkのGUI上でソースのXMLが確認できるのでそれをそのまま流用することにしました。
元になるダッシュボードを手動で作成しXMLをコピー
ダッシュボードの作成方法は割愛しますが、ひとまず以下のダッシュボードを「test-manually」という名前で手動で作成しました。作成したダッシュボード上で「編集」を選択します。
編集画面でソースを選択すると手動で作成したダッシュボードのXMLが確認できます。
次はこれをコピペしてTerraformで適用してみます。
main.tfにsplunk_data_ui_viewsを追記
resource "splunk_data_ui_views" "terraform_operations" {
name = "Terraform"
eai_data = <<-EOT
<form version="1.1">
<label>test-terraform</label>
<fieldset submitButton="false">
<input type="time" token="field1">
<label></label>
<default>
<earliest>0</earliest>
<latest></latest>
</default>
</input>
</fieldset>
<row>
<panel>
<chart>
<search>
<query>index=index01 host=test | timechart span=1h count</query>
<earliest>$field1.earliest$</earliest>
<latest>$field1.latest$</latest>
</search>
<option name="charting.chart">column</option>
<option name="charting.drilldown">none</option>
<option name="refresh.display">progressbar</option>
</chart>
</panel>
</row>
<row>
<panel>
<chart>
<search>
<query>index=index01 host=test sourcetype=access_combined_wcookie | top categoryId</query>
<earliest>$field1.earliest$</earliest>
<latest>$field1.latest$</latest>
</search>
<option name="charting.chart">pie</option>
<option name="charting.drilldown">none</option>
</chart>
</panel>
</row>
</form>
EOT
acl {
app = "search"
owner = "admin"
sharing = "app"
}
}
先ほどコピーしたXMLをArgument:eai:data
の中にコピペします。labelなどは重複しないように一部変更しました。
またApp内で共有するためにaclを定義しsharing対象をappとします。ここを特に指定しないとPrivateなダッシュボードになるようです。
この状態でPlanとApplyをしていきます。
$ terraform fmt
# Plan実行、Plan: 1 to add, 0 to change, 0 to destroy.と表示されればOK
$ terraform plan
# Apply実行、Apply complete! Resources: 1 added, 0 changed, 0 destroyed.と表示されればOK
$ terraform apply -auto-approve
無事にApplyが完了すると、ダッシュボード上でもtest-terraformが作成されたことが確認できます。
Terraformで作成したuser01
でSplunkにログインして、ダッシュボードで確認してみます。
無事に作成したユーザーでもダッシュボードを参照することができました。
終わりに
今回はローカル環境のSplunk Enterpriseの一部のリソースをTerraformで管理してみました。
今回作成したリソースの他にもアラートなど様々なリソースがTerraformで管理できるようです。
GitHubなどを活用し、差分を追える状態やレビューがしやすい環境の整備や、CI/CDと絡めた活用ができそうです。
なお今回はSplunk Enterpriseで検証していますが、Splunk Cloudではどうなのかということも今後検証できたらと思います。