どうも、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 == 200
が true
になります。
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 == 200
は true
となります。
ということで
このスクリプトを cron とか Jenkins とかで叩かせることでインデックスのメンテナンスがカジュアルに自動化出来たりしますね。あと、API が提供されているので HTTP のライブラリを利用することで簡単に実装することが出来ました。
引続き、精進致します。
元記事はこちらです。
「Elasticsearch のインデックスを削除するスクリプトを書いたメモ」