布団の中にいたい

Elasticsearchいじったり、Androidアプリ書いたり。最近は数学の勉強が楽しくなってきました。

elasticsearchでanalyzerを試すコマンドラインツールを作った

elasticsearchでanalyzerを試す際に毎回/_analyzeを叩いて検証するのもだんだん面倒臭くなってきたので、さっくり試すためのコマンドラインツールを作りました。

github.com

とりあえず試せることを目指して作ったので機能はかなり少なく、analyze apiのfilterとchar filterは使えません。

README.mdにありますが、使い方は以下。

$ es-analyzer --host http://localhost:9200 --analyzer standard --query "This is a pen."
token   start_offset    end_offset  type    position
this    0   4   <ALPHANUM>    0
is  5   7   <ALPHANUM>    1
a   8   9   <ALPHANUM>    2
pen 10  13  <ALPHANUM>    3

実装はかなりシンプルでフラグの処理に標準パッケージのflag、elasticsearchのリクエストにはolivere/elasticを使っています。

github.com

filterとchar filterは欲しくなったら実装します。あとはamazon esで利用する場合に認証をどうするかとかですかね。

cerebroで毎回hostを入力しなくていいようにする

概要

このところ、elasticsearchの管理をするときにcerebroを使っています。対してデータが入っているわけではないですが、何かしらイベントが発火するとデータが増えていくのを見ているのが楽しいです。 リポジトリは以下。

github.com

さて、cerebroを色々使って便利だと思っていたのですが、毎回参照したホストのURLを入力しなければならないことに辟易していました。入力した履歴からサジェストされるとしても、それが消えると大変面倒です。どうにかいい方法はないものかとcerebroのリポジトリを眺めていると簡単に解決する方法があることが分かりました。

方法

cerebroはそれ自身の設定ファイルを配置する場所としてconfディレクトリを持っています。その中のapplication.confに表示したいhostを記述すれば毎回そのhostを表示してくれます。 記述する場所は以下。

hostは参照したいhostのurlで、nameは文字通りhostの名前を書けばいいです。以下では、hostにとりあえずlocalで動かしているelasticsearchを、nameはざっくりlocal elasticsearchにしています。

# A list of known hosts
hosts = [
  {
    host = "http://localhost:9200"
    name = "local elasticsearch"
  }
]

設定ファイルを編集した状態でcerebroを起動すると、以下のような表示になります。 f:id:asahima_194h:20170901230222p:plain

HOSTSとして先ほど指定したhostが追加されていますね。これで毎回hostのurlを記述しないといけない辛さから解放されます。

まとめ

今回はcerebroで指定したホストを選択できるようにしました。適当に使ってた手前なにも言えないですが、ちゃんとDocumentを読めばもっと便利に使えそうなので色々やってみようと思います。

go test で特定のテストのみを動かす

このところ、自分で使うようのコマンドラインツールを作っているのですが、テストが多くなってきたこととテストに他のソフトウェアを含んでいる影響で激烈にテストが遅くなってきていて若干不満だったのですが、特定のテストだけ実行する方法があったのでメモ。

方法は単純、テスト時に -r で実行したいテスト名をくっつけるだけ。 例として、Sampleという文字列がtest名に含まれたテストを実行した場合は以下

go test ./... -run Sample

サブテストなども指定できるので色々便利そう。詳細は以下ページより

testing - The Go Programming Language

運用しているElasticsearchをAmazon Elasticsearch Serviceに移した

AWSの勉強ついでに、conohaで管理していたelasticsearchをAmazon Elasticsearch Serviceに移行してみました。かかる金額自体はAmazon Elasticsearch Serviceのほうが断然高いですが、まぁ勉強ついでということで。

やったことは以下 - Amazon Elasticsearch Serviceに接続できるようにする - logstashの設定ファイルを作る - logstashでデータを転送する

Amazon Elasticsearch Serviceに接続できるようにする

普通はIAM roleとかでアクセス制限かけたほうがいいと思うんですが、それやるとamazon_es pluginとか使わないといけなくなってしまうので、楽するために一旦IPでアクセスできるようにします。

github.com

きちんとやるならIPでやるのではなく、普通にawsの認証を通してから接続できるようにしたほうがいいと思います。

クラスメソッドさんのブログに色々書いてあるのでその辺見るといいんですかね。

dev.classmethod.jp

logstashの設定ファイルを作る

今回はelasticsearchからelasticsearchへのデータ転送なので改めてpluginをインストールする必要はありません。

ちなみに以下のような感じ。ちょっとデータを変換したいみたいなことを考えているのであれば、filterでいじるといいと思います。elasticsearchの5系以上であれば、似たようなことがelasticsearch標準でできるみたいなので、そっちでもいいかもしれません。

注意点ですが、もしkuromojiのようなanalyzerを指定しているのであれば、予めmappingを適用してください。

input {
    elasticsearch {
        hosts => "localhost:9200"
        index => "indexの名前"
        query => "{}"
    }
}


output {
    elasticsearch {
        hosts => "elasticsearch serviceのhost"
        index => "indexの名前"
    }
}

logstashでデータを転送する

別段継続的に動かすものでもないので、コマンド一発で終わらせます。

コマンドは以下

sudo /usr/share/logstash/bin/logstash -f logstash.conf --path.settings /etc/logstash

あとは、awsの方のelasticsearchを叩いてきちんとデータが挿入されているかを確認すれば終了です。 ちゃんと動いてるか確認したいなら、logstashとelasticsearchのログを見たり、一旦outputをstdoutにしてrubydebugとかで吐き出させてみるといいと思います。

まとめ

今回は、logstashを使って、既に運用しているelasticsearchからamazon elasticsearch serviceへlogstashを使用して、データ転送を行いました。今回はlogstashを使いましたが、データ転送の手段としては、embulkなどもあるので、使いやすいものを使うといいと思います。

「Amazon Web Services ではじめる新米プログラマのためのクラウド超入門」を読んだ

周囲で聞こえてくる「AMI」・「IAM」みたいな単語があまりにも分からず、MTGでも何を言っているのか分からないという状況で非常に申し訳ない気持ちになったのでAWSの勉強をすることに。 amazonで色々本を探していた中で、簡単そうで評価が高かった「Amazon Web Services ではじめる新米プログラマのためのクラウド超入門」を読むことにしました。

Amazon Web Servicesではじめる新米プログラマのためのクラウド超入門 (CodeZine BOOKS)

Amazon Web Servicesではじめる新米プログラマのためのクラウド超入門 (CodeZine BOOKS)

感想

ざっくりとした感想としては、AWSを知らない人向けに中核になっているサービスを使ってみて慣れてみようという感じ。個人的にEC2は立てて遊んだりしたことがあったのですが、ELB・S3・CloudWatchだったりは名前だけ知っているような状態だったので、どういうサービスなのかだったり、実際使ってみたりで色々勉強になりました。あと前職でOpenStackを使っていたこともあって、「何がどれに対応する」みたいなことを考えながら読めたので楽しかったです。

今回はDocker周りは必要なかったので読んでいませんが、何かしら必要になったら読み返そうかと思います。とりあえずは今回この本を読んでえた知識で何かしらやってみようかと思います。

cerebroを使ってみる

elasticsearchでSolrのような管理系UIが欲しかったのですが、5系以降ではsite pluginが廃止になった影響で今まで使われていたelasticsearch-headやelasticsearch-kopfが使えなくなってました。kopfはスタンドアロンのアプリケーションになってるみたいですが、同じ作者さんがcerebroというものを作っていたので作っていたので試してみました。

github.com

インストー

基本的にはgithubのREADMEに書かれてることをやればいいです。

wget https://github.com/lmenezes/cerebro/releases/download/v0.6.6/cerebro-0.6.6.tgz
tar xvf cerebro-0.6.6.tgz
cd cerebro-0.6.6

# 起動
bin/cerebro

簡単でいいですね。 起動画面は以下です。

f:id:asahima_194h:20170729182246p:plain

あとはhostsの部分にelasticsearchのhostのurlを書けば、indexの情報などが見れます。 kibanaのdev toolsと同じようにクエリもかけて、発行したクエリの履歴なども見れて大変便利でした。

機会があれば使ってみるといいかもしれません。

ubuntu16.04にelasticsearch + kibanaを導入する

前の記事でkibanaの前にnginxをおいて認証をかけるみたいな記事を書きましたが、elasticsearch + kibana自体のインストールも少し手こずったのでメモ書き程度にまとめます。

やること

javaのインストー

elasticsearchはjavaで書かれたソフトウェアなので実行環境としてjavaを入れる必要があります。

sudo apt-get update
sudo apt-get install openjdk-8-jdk-headless

elasticsearch

インストールは公式のドキュメントに従います

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list

sudo apt-get update
sudo apt-get install elasticsearch

起動は以下

sudo service elasticsearch start

細かい設定ファイルは/etc/elasticsearch以下にあるので、メモリを調整したかったりするときは、この辺のファイルをいじるといいと思います。

elasticsearchはリクエストを受け付けるように9200ポート、他ノードとの連携用に9300ポートを利用しているみたいです。その辺のポートが開いていなければ順次ポートをずらしていくみたいです。

kibana

elasticsearchが導入できていたらそのままapt-getで入れられます。

sudo apt-get update
sudo apt-get install kibana

kibanaの起動は以下

sudo service kibana start

kibanaって前まで静的コンテツをelasticsearch配下に置くイメージだったんですが、いつの間にかnodejsのアプリケーションになってたんですね。調べて見る限りでは、elasticsearch 5系からsite pluginが廃止になった影響で使えなくなったのが理由みたいです。 elasticsearch-headとかも使えないっぽいので注意が必要そうです。

まとめ

今回はubuntuにelasticsearchとkibanaを導入しました。kibanaがnodejsのアプリケーションになってるのは衝撃でしたが、問題なくインストールできました。今度は管理系UIを調べて導入してみようかと思います。