自宅簡易サーバにRaspberryPi

RaspberryPiで収集したデータを見える化したいけど、
外部のサーバやサービスを借りるとお金かかるし、
家に本格的なサーバを立てても設備代や電気代かかる・・・。
そもそも手軽に使えたら何でも良いんだけどと思い、
そのままRaspberryPi内でログ見える化の環境を構築しました。

完成図

Elasticsearch×kibana×Fluentd で構築します。 こんな感じに様々なデータが簡単にグラフ化できました。

用意したもの

RaspberryPi 2(Raspbian Jessie with PIXEL)
※ネットワークへの接続やapt-get updateなど最低限のセッティングは完了しているものとする

注意

RaspberryPiはそのコンセプトから安定稼働する作りではありません。
ちょっとした学習や研究用にサーバを立てたいときは便利ですが、
中期以上の継続的な稼働が必要な場合はちゃんとサーバを用意しましょう。

Elasticsearch

Javaの確認

OSがRaspbian Jessieであれば、Javaがインストールされているはずですが一応確認。

$ java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode)

バージョン1.8以上が必要なので、古ければアップデートしましょう。

Elasticsearchのインストール

Elasticsearchとkibanaはバージョンの組み合わせによっては動かないことがあるようなので、
今回は動作が確認されている以下バージョンでやります。

  • Elasticsearch 2.4.1
  • kibana 4.6.2

以下コマンドで、Elasticsearchの公式HPからzipをダウンロードし、
ディレクトリに展開していきます。

$ wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.4.1/elasticsearch-2.4.1.zip
$ unzip elasticsearch-2.4.1.zip
$ rm elasticsearch-2.4.1.zip
$ mv elasticsearch-2.4.1 elasticsearch
$ cd elasticsearch
$ ./bin/elasticsearch

起動確認は以下コマンド。
curlすると返ってきます。

$ curl -XGET http://localhost:9200/
{
  "name" : "Micro",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "",
  "version" : {
    "number" : "2.4.1",
    "build_hash" : "",
    "build_timestamp" : "2016-09-27T18:57:55Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.2"
  },
  "tagline" : "You Know, for Search"
}

kibana

同様にkibana(4.6.2)を公式ページからダウンロードします。
以下URLからRaspberry Piのバージョンに合わせてダウンロードしてください。
RaspberryPi 2の場合:LINUX 32-BIT
RaspberryPi 3の場合:LINUX 64-BIT
https://www.elastic.co/downloads/past-releases/kibana-4-6-2

以下wgetコマンドはRaspberryPi2(32bit版)の場合

$ wget https://download.elastic.co/kibana/kibana/kibana-4.6.2-linux-x86.tar.gz
$ tar xvfz kibana-4.6.2-linux-x86.tar.gz
$ rm kibana-4.6.2-linux-x86.tar.gz
$ mv kibana-4.6.2-linux-x86 kibana
$ cd kibana
$ ./bin/kibana

しかし実行するとエラーが出ます。

./kibana/bin/../node/bin/node: 1: ./kibana/bin/../node/bin/node: Syntax error: "(" unexpected

これはダウンロードしたkibanaのファイルがRaspberryPiのCPU(ARM)アーキテクチャではないためです。
エラーが出るnodeとnpmをRaspberryPiのものに変更してあげます。
※kibanaのダウンロードページでDEBのパッケージもダウンロードできますが、
これも中身がi386アーキテクチャ用なのでdpkgでインストールできません。

$ wget http://node-arm.herokuapp.com/node_latest_armhf.deb
$ sudo apt-get remove npm node
$ sudo dpkg -i node_latest_armhf.deb
$ rm node_latest_armhf.deb
$ cd kibana/node/bin
$ mv node node.orig
$ mv npm npm.orig
$ ln -s `which node` node
$ ln -s `which npm` npm
$ cd ../../
$ ./bin/kibana

これでhttp://localhost:5601にアクセスするとkibanaのページが表示されます。

fluentd

fluentdはelasticsearchにデータを集めるために使用します。

fluentdのインストール

# インストールから設定まで
$ sudo apt-get install gem
$ sudo gem install fluentd --no-ri --no-rdoc
$ sudo fluent-gem install fluent-plugin-elasticsearch
$ fluentd --setup ./fluent

# 起動とテスト
$ fluentd -c ./fluent/fluent.conf -vv &
$ echo '{"json":"message"}' | fluent-cat debug.test

debug.test: {“json”:“message”} OKのような応答があれば初期設定は完了です。

fluentdの設定ファイル

fluentdに来たログをElasticsearchに飛ばす設定をします。
※fluentdを理解していないので、動作はしますが適切でない可能性が高いです。参考程度に見てください。

vim ~/fluent/fluent.conf

するとデフォルトの設定値が書いてありますが、
それを以下の内容にしてElasticsearchに飛ぶようにします。

<source>
    type forward
</source>

<match log.**>
    @type elasticsearch
    host localhost
    port 9200
    type_name raps
    logstash_format true
</match>

この設定を保存してfluentdを再起動するとfluentd→elasticsearchにデータが飛ぶようになりました。

ログは以下のように書くと飛ばせます。

echo '{"status":"OK"}' |/usr/local/bin/fluent-cat log.hoge

まとめ

今回はRaspberryPiにElasticsearch×kibana×Fluentdを入れてログの見える化をしました。
ただラズパイは安定稼働しないので限定的な用途に限られると思いますが、それでも簡単に自宅サーバが作れるのは便利です。

次回は
RaspberryPiのCPU温度、電圧、クロック数をElasticsearchに送る方法と
Supervisorを用いたデーモン化をやります。

参考

参考にさせていただきました。ありがとうございます。

http://johshisha.hatenablog.com/entry/2016/11/02/014132

http://kakakazuma.hatenablog.com/entry/2015/10/08/161906

http://qiita.com/jooex/items/21a26e70f995e91a4e36

http://qiita.com/zaburo/items/dbd943d370afe8e4a304