例のごとく簡単なことしかやっていないのであまり参考にならないかもしれないですが、アクセスポリシーや自宅からどうやってAmazon Elasticsearch Serviceにデータを流すか、kibanaで閲覧するかは参考になる人がいるかもしれません。前置き終わり。
- なぜMac MiniからAmazon Elasticsearch Serviceへ?
- AWSの設定
- Amazon Elasticsearch Serviceの設定
- データを流す先をMac MiniからAmazon Elasticsearch Serviceに変える
- 各種情報をMackerelで見れるように
なぜMac MiniからAmazon Elasticsearch Serviceへ?
約二年前から自分に関連する可能な限りの情報(お金や位置情報、作業時間などなど…)をElasticSearchに放り込み、kibanaで可視化や検索がさっとできるような環境を自宅のMac Miniで運用していました。
そんなわけで二年ほどMac Miniで運用していましたが、以下のような理由で移行を考えてました。
- Mac Miniも大分古い(5-6年前に買ったやつ)ので、そろそろ買い替えたい
- SSDではなくHDDなので今となってはつらい。地獄かよ
- 新卒入社直後だったので、金なしだった記憶がある…
- ElasticsearchおよびKibanaのバージョンを上げたい
- いくつか使ってみたい機能がある => Kibana 5.0.0 released | Elastic
- 会社ではkibana5を使っているけど、よさそうに見える
- 仕事でAWS連携をやっているにも関わらず、個人ではAWSをほとんど使ったことがなく割と(かなり?)まずい
- 使い勝手とかどういうメトリックが欲しくなりそう、というのは自分もドックフードしてみないと分からない
Mac Miniを新しく買い替えるのが一番無難でコスパも最終的にはよい気がしたのですが、ずっと個人でAWS使ったことないっていうのはどうなのか…というのがひっかかったのでAWS上で運用することにしました。EC2を借りて、そこでElasticsearchやKibanaをインストールして、というのでもよかったのですが、自分の性格的に色々できる環境だと色々やりすぎて本末転倒なことをやりそうな気しかしなかったので、Amazon Elasticsearch Serviceに移行することにしました。
AWSの設定
- AWSのアカウント作成、クレジットカードの登録
- MFAを有効化
- グループの作成
- Elasticsearchの読み書きができればいいので、
AmazonESFullAccess
のポリシーのみを持つグループを作りました - kibanaもダッシュボート等の情報を保存する必要があるので、readだけなくwriteの権限も必要
- Elasticsearchの読み書きができればいいので、
Amazon Elasticsearch Serviceの設定
Create a new domain
で新しいドメインを作る- elasticseachのバージョンを選択。新しいのを使いたかったので、5.1を選んだ
Configure cluster
でインスタンスのタイプを選択- elasticseachの5.1を選ぶにはmicroではなく最低でもsmallを選ぶ必要があるということにここで気づく…
Set up access policy
でアクセスポリシーを選択- IPアドレスベースかロールベースかで選べる
- 自分の場合、自宅や会社からkibanaが見れるといいなと思ったので、ロールで制限した
こんな感じにしておきました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::XXX:user/es-manager" }, "Action": "es:*", "Resource": "arn:aws:es:ap-northeast-1:XXX:domain/YOUR_DOMAIN/*" } ] }
これでElasticsearchやKibanaが立ち上がります。といっても立ち上がってくるまで20-30分くらいかかった気がする。アクセスポリシーを変更してそれが反映されるのも同じくらいの時間がかかるようです。
データを流す先をMac MiniからAmazon Elasticsearch Serviceに変える
自宅のMac Miniでは大体のタスクは
- jenkinsでjobがキックされる
- データ取得元からクロールする
- 取ってきたデータをcurlでElasticsearchに流し込む
といった流れで動いていました(nasne残量の例、自宅の回線速度を取る例)。例えばruby speedtest_logger.rb | curl -XPOST localhost:9200/_bulk --data-binary @-
のエンドポイントをAWSに向ければ終わり、という予定でいましたが、アクセスポリシーの関連でそのままcurlでやるのは難しそうでした。aws-sdkを使うと対応できそうな雰囲気がありますが、Elasticsearchに流し込むプログラムはbash、ruby、perl、pythonと多岐に渡り(どうしてこうなった…)、流し込むjenkinsのjobも50程度まで増えていたので、困りました…。自宅も固定IP環境ではないので、IPのアクセスポリシーでやると運用が難しい。ここが一番時間がかかった。
先人の知恵を調べたところ、proxyを立てて、そこを通すという手が簡単そうでした。goなので簡単にビルドできる。go1.5じゃないといけないのが面倒といえば面倒ですが、割とすぐできる。
- coreos/aws-auth-proxy: HTTP proxy that signs requests for upstream AWS endpoints
- AWS ElasticSearch Service の認証にIAM Roleを使う [aws-auth-proxy編]|ハンズラボエンジニアブログ|ハンズラボ株式会社
これでlocalhostでAWS上のElasticSearchが見えるようになりました。ruby speedtest_logger.rb | curl -XPOST localhost:9200/_bulk --data-binary @-
とやっていたプログラムもポート番号を変えればよいだけなので、簡単に対応できます。これでデータはAmazon ElasticSearch Serviceに流れるようになりました。
kibanaも見れるようになりましたが、しかしちゃんとは動いていないようでした(jsが4xxのエラーを吐いていて管理画面が真っ白)。これについてもnodeでproxyを立てて解決する、というのをdockerに作っている人がいたので、それを使うと動かせるようになりました。
環境変数でawsのkeyを渡します。
docker run -e AWS_ACCESS_KEY_ID=XXX -e AWS_SECRET_ACCESS_KEY=XXX -p 9200:9200 rlister/aws-es-kibana search-XXX.ap-northeast-1.es.amazonaws.com
kibana5だ、わいわい。
各種情報をMackerelで見れるように
Amazon ElasticSearch Serviceの管理画面からは検索可能なドキュメント数やディスク残量などが分かるようになっています。
しかし、普段はMackerelのダッシュボードを見るようにしているので、見る画面が増えるのは面倒です。mackerel-agent-pluginsを使って、同じ情報をMackerelにも登録しましょう。
mackerel-agent-pluginsはMacには公式対応していませんが、それぞれのプラグインはMacでも簡単にビルドして使うことができます(正確に言うと使えるものもあります。elasticseachは大丈夫)。GOPATHに移動してbuildするとよいです。
% cd go/src/github.com/mackerelio % git clone https://github.com/mackerelio/mackerel-agent-plugins.git % cd mackerel-agent-plugins/mackerel-plugin-elasticsearch % go build
./mackerel-plugin-elasticsearch
で動かしてみるとよいでしょう。これで準備は終わったので、設定ファイル(/usr/local/etc/mackerel-agent.conf
)に書きましょう。ひとまずこんな感じで書きました。
[plugin.metrics.elasticsearch]
command = "/Users/yasuhisa/go/src/github.com/mackerelio/mackerel-agent-plugins/mackerel-plugin-elasticsearch/mackerel-plugin-elasticsearch -port=9876"
agentを再起動するとちゃんとメトリックが取れるようになっています。これでディスク残量等も監視できるようになって安心ですね。
AWS童貞を卒業したので、暇ができたらlambdaでbotを作って遊んだりしてみようと思います。