どうも、cloudpackかっぱ@inokara)です。

はじめに

Elasticsearch はカジュアルにログを溜めることが出来て、検索も可視化もらっく楽ですがインデックスのメンテナンスはちゃんとしたいところです。ということで、 Elasticsearch の API の復習を兼ねて Ruby で作ってみました。


スクリプト


Index API

はじめに

使っているのは以下の二つの API です。

indices exists で削除対象となるインデックスが存在していたら delete index を利用して削除します。

とても簡単ですな。とは言え、一応、二つの API を叩いてみましょう。

indices exists

HEAD メソッドを利用します。

curl -XHEAD 'http://localhost:9200/logstash-YYYY.MM.DD/'

対象のインデックスが存在している場合には以下のように出力されます。

* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 9200 (#0)
> HEAD /logstash-YYYY.MM.DD HTTP/1.1
> User-Agent: curl/7.36.0
> Host: localhost:9200
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/plain; charset=UTF-8
< Content-Length: 0
<
* Connection #0 to host localhost left intact

存在しない場合には…

* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 9200 (#0)
> HEAD /logstash-2014.07.21/ HTTP/1.1
> User-Agent: curl/7.36.0
> Host: localhost:9200
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Content-Type: text/plain; charset=UTF-8
< Content-Length: 0
<
* Connection #0 to host localhost left intact

404 が返ってきますね。

そして、Ruby を利用して以下のように書きました。

request_uri = URI.parse("http://#{config[:host]}:#{config[:port]}/#{index_name}")
request = Net::HTTP::Head.new(request_uri.path)
res = Net::HTTP.start(request_uri.host, request_uri.port) do |http|
    http.read_timeout = 30
    http.request(request)
end

インデックスが存在する場合には res.code == 200true になります。

delete index

DELETE メソッドを利用します。

curl -XDELETE 'http://localhost:9200/logstash-YYYY.MM.DD/'

インデックスが正常に削除された場合には…

* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 9200 (#0)
> DELETE /logstash-YYYY.MM.DD/ HTTP/1.1
> User-Agent: curl/7.36.0
> Host: localhost:9200
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=UTF-8
< Content-Length: 21
<
* Connection #0 to host localhost left intact
{"acknowledged":true}

レスポンスボディは {"acknowledged":true} となります。また、インデックスが存在しない等の理由で削除に失敗すると…

* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 9200 (#0)
> DELETE /logstash-YYYY.MM.PP/ HTTP/1.1
> User-Agent: curl/7.36.0
> Host: localhost:9200
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Content-Type: application/json; charset=UTF-8
< Content-Length: 77
<
* Connection #0 to host localhost left intact
{"error":"IndexMissingException[[logstash-YYYY.MM.PP] missing]","status":404}

レスポンスボディは {"error":"IndexMissingException[[logstash-YYYY.MM.PP] missing]","status":404} で返ってきますね。

request_uri = URI.parse("http://#{config[:host]}:#{config[:port]}/#{index_name}")
request = Net::HTTP::Delete.new(request_uri.path)
res = Net::HTTP.start(request_uri.host, request_uri.port) do |http|
    http.read_timeout = 30
    http.request(request)
end

インデックスの削除が成功したら res.code == 200true となります。


ということで

このスクリプトを cron とか Jenkins とかで叩かせることでインデックスのメンテナンスがカジュアルに自動化出来たりしますね。あと、API が提供されているので HTTP のライブラリを利用することで簡単に実装することが出来ました。

引続き、精進致します。

元記事はこちらです。
Elasticsearch のインデックスを削除するスクリプトを書いたメモ