Go4Day 6

Elasticsearchのオペレーションを楽にするツールを作成した話

Elasticsearch(以降ES)のインデックス作成や、エイリアスの追加・削除、マッピングの更新などのオペレーションをcurlでやるのが辛くなったので、es-cliというツールを作りました。そのツールの紹介と、使ったライブラリを書こうと思います。


なぜ作ったか

突然ですが、ESでインデックスの作成やエイリアスの作成するの面倒じゃないですか?

例えばインデックスの作成

curl -XPUT http://localhost:9200/new_index -d '{"settings":{...}, "mappings": {...}}'

エイリアスの作成

curl -XPOST http://localhost:9200/_aliases -d '{"actions": [{"add": {"index": "test_index", "alias": "test_alias"}}}]}'

これ、覚えるだけでも大変で、更に長いので打つのが面倒ではないですか?

更に、新しくインデックスを作成して、エイリアスを張り替えて・・・となると、こういったのを何度も打つ必要が出てきます。これは非常に辛いので、こういった、ESのオペレーションを楽にするためのツールを作りました。


できたもの

対応しているコマンドを一部抜粋したものがこちらです。詳しくはREADMEに書いています。

$ es-cli list index

$ es-cli create index <index_name> <detail_json_file>
$ es-cli create index <index_name> # Read detail json by stdin
$ es-cli copy index <src_index_name> <dst_index_name>
$ es-cli count index <index_name> # Return total count of documents
$ es-cli delete index <index_name>

例えば、先程のインデックスを作成する例では

$ es-cli create index new_index

{
"settings": ...
"mappings": ...
}

エイリアスの追加は


$ es-cli add alias test_alias test_index

こんな感じで実行できます。

余談ですが、試しに作ってたインデックスで、test_1test_2、・・・のようにtest_*インデックスが大量にあって削除したい場合、パイプを使って削除できます。

$ es-cli list index | grep -E ^test_ | xargs -I{} es-cli delete index {}


どう作ったか

es-cliには大きく分けて2つの概念があります

1. main

1. Executer

1. BaseClient

mainはパラメータから適切に値を読み取り、Executerに値を渡します。

ExecuterBaseClientを使って、与えられたコマンドをよしなに実行してくれるものです。2つ責任を持っています

1. コマンドライン引数から適切なBaseClientのメソッドを呼び出す

2. 標準入力の読み取りなど

BaseClientは基本的にESのAPIを叩くためのもので、2つ責任を持っています。

1. ESへのリクエスト

2. ESからのレスポンスの処理。エラー処理や、レスポンスからの必要な項目の取り出し

ExecuterBaseClientは、テストをしやすいようにしておくため、interfaceベースで作成しています。

こんな感じのinterfaceになっています。

Executer

type Executer interface {

Run(ctx context.Context, operation string, target string, args Args) (Result, error)
}

BaseClient

type BaseClient interface {

// Index
ListIndex(ctx context.Context) (Indices, error)
CreateIndex(ctx context.Context, indexName string, mappingJSON string) error
CopyIndex(ctx context.Context, srcIndexName string, dstIndexName string) (Task, error)
DeleteIndex(ctx context.Context, indexName string) error
CountIndex(ctx context.Context, indexName string) (Count, error)
SearchIndex(ctx context.Context, indexName string, query string) (SearchResponse, error)
BulkIndex(ctx context.Context, body string) error
...


何を使ったか

使ったライブラリは次です。