script day.log

大学生がなんとなく始めた、趣味やら生活のことを記録していく。

いつかは本当の恋愛がしたい

アニメを見ていた.ダーリン・イン・ザ・フランキス
その中でイチゴちゃんがヒロに告白するシーンがあった.
どんなアニメだって告白シーンはあるのに,
イチゴちゃんの告白には力があったように感じる.

私は誰かの恋愛を見るのが好きらしい.
それは2次元でも3次元でも構わない.
恋愛漫画やアニメを見たりするし,
街に出て,誰かがしている恋愛を見て妄想していたりもする.
さらに性別も問わない.
だから男性同士や女性同士でも構わない.

しかし私は自分の恋愛は経験がない.
21年間生きてきているけれども,1度も恋人ができたことがない.
告白をしたことが無いわけではない.
ただ,本当の恋愛というものが分からないのだ.

少し昔の話をしよう.
僕が中学生になった頃,まわりは思春期ということもあって,
付き合い始める人達が増えた.
中学生の頃の私は部活に入るわけでも無く,熱心に勉強するわけでもなく,
なんとなくアニメを見て,ゲームして,
インターネットの世界で暇を潰しているオタク中学生だった.
オタクにも思春期は平等にやってくるし,
アニメで見たような恋愛をしてみたいと思っていた.
確か涼宮ハルヒの憂鬱だった.

その中で私も恋人が欲しいと思ったことがあった.
’恋人が欲しい’というだけで,恋人としたいことが明確にあるわけでもなかった.
これは今でも続いている.
何のために恋人が欲しいのか,今でもわからない.
でも出来たら何かが分かるような気もしている.
きっとそう信じている.

恋人が欲しいと思った自分はメールで告白をした.
涼宮ハルヒを見ていたのに,メールで告白をしてしまったのだ.
恋人が欲しいという感情に任せて告白をしたが,
本当に相手を好きだったかどうかは怪しい.
おそらく価値観は違うだろうと容易に想像できる相手だったし,
相手が私に全く興味が無いこともわかっていた.
とりあえず恋人が欲しかったのだと思う.
これが中学1年の夏ぐらいの話.

2年生になると,ある程度のグループも形成され,
いつも決まったメンバーとしか話さないようになっていた.
オタクのネットワークはいつもインターネットに形成されていた.
ただ少ないオタク友達は非常に大事にした.
いつものグループには2~3人の女の子が居た.
私はその中の1人のことが好きになった.
気を使うこと無く,話すことが出来た.
インターネットで会話するように彼女とは話すことが出来た.
私にはとてもそれが幸せだった.
彼女のことが好きだった私は告白したいと思っていたが,
この関係性が崩れてしまうのでは無いかと思い,
卒業するまで告白することはなかった.

そして高校生になると,
進学校に進んだ私は中学生の頃の同級生とはほぼ別れた.
ただ方向が一緒の電車ではあったので,たまに会う瞬間が嬉しかった.
新たな出会いを期待した高校生だったが,クラスは3年間同じで,
ほぼ男子クラスのような状態だった.
オタクのコミュニケーション能力はほぼ0に等しく,
他のクラスにお邪魔するなんてことは不可能だった.
部活にも参加したが,気の合うような相手は居なかった.
クラスの中で唯一気軽に話せる女子が居たが,
相手には好印象は持たれて居なかっただろう.イキっていたからね.
結果,高校生は勉強して,部活して卒業しただけだった.

気がつくと大学生になっていた.
総合大学ということもあって,教養科目では沢山の女性が居た.
残念ながら学科は情報工学科だったので,期待はできなかった.
しかしアルバイト先で小学生の頃の同級生と再会するという機会もあった.
転校の多かった私からするとかなり珍しい.
20歳になった私はそろそろ恋人が居ないのは不味いと思い,
恋人を作ろうと思い始めた.
失敗から何も学ばない私は,1度ご飯に行っただけの相手にLINEで
告白をしたのである.
面と向かって言える機会は合ったのに,どうしてか画面越しに告白をした.
もちろん失敗するのは見えている.
そもそも1度ご飯に行っただけで,告白するのもどうかしていると
今になって思う.

そして冒頭に話は戻る.
ダーリン・イン・ザ・フランキスを見た私は自分の恋愛について考えた.
雨の降る夜の街を歩きながら,考えていた.

そして気づいたのだ.

いつも私は恋人が欲しいという感情に従い,告白してきた.
相手のことが好きだったかどうかも怪しい.
むしろ恋人になるかもしれない人だから,好きでないといけないと思い,
好きになろうとしていたようにも思う.
ただ中学2年生のときに好きになったあの子だけは本当に好きだったのだと思う.
だったというより今も好きであるのだが.
成人式で会えたのだが,その時は勇気がなくて告白することが出来なかった.

だから次に会えたときには面と向かって告白したいと思う.
失敗を怖いと思う告白は初めてだし,これが本当の恋愛なのかなとも思う.
とにかく,次に会えたら「君が好きだ」と伝えたい.

そしていつかは本当の恋愛がしたい.

人工知能プログラミングのための数学がわかる本を読みました。

最近実家に帰省してまして、出来る事が少ないので本を買いまして読んでいました。
買ったのは「人工知能プログラミングのための数学がわかる本」です。

人工知能プログラミングのための数学がわかる本

人工知能プログラミングのための数学がわかる本

大体の読んだ感じからすると、あくまで基本的な数学がわかる本であって、
人工知能プログラミングをする本では無いということですね。
これを前提として読むと、普通に面白い本でした。
大体7章あるので,1週間もあれば余裕で読了出来ると思います.
だいたい高校から大学レベルの数学で、
情報系の大学生だと授業で取り上げられているような内容ですね。
ところどころコラムに人工知能ではこう使われているといった内容が紹介されていて、
初めて人工知能に関する数学をする方には身近に感じるかもしれません。
また、普通に機械学習などをしている方からすると、復習的なものになると思います。
知っている事ばかりだと思いますが、誰かに説明するときに役に立つ?かもしれません。
本の帯には可愛い女の子のイラストがありまして、中身はカラフルに説明していて、
カラフルさに耐性がある人であれば、読みやすく分かりやすいものになっているのではないでしょうか。

ついでに「試して理解Linuxのしくみ」という本も買ったので、
大学の実験と比較しつつ読みたいと思います。

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

あと最近デスクに寂しさがあるので観葉植物を買いまして、
緑に癒される生活を始めました。

f:id:makose3p1229:20180302232825j:plain
ホンコンという観葉植物

都会を感じへ

突然ですが,都会を感じるために先月の下旬より
私は実家のある福岡県に帰省しているわけです.

さて,都会の定義とはなんでしょうか?
田んぼがないことや人口が多いことなど,人それぞれだと思います.
ここで,都会の定義をWikipediaで確認してみました.
以下のように定義されていました.

都市的地域(としてきちいき、英語:urban area)は、
その周辺に比して高い人口密度をもち、
多数の人工構築物などが特徴となっている地域

個人的には人口密度,人工構築物よりも,
ワークスタイルが発展している点を優先して,都会と呼びたいと思っています.
個人的な妄想なのですが,最近のIT企業(あまりこの表現は正しくない)は
ワーキングスタイルが多様だと聞きます.
1月,2月の大雪でリモート出社や早期退社などの対応の良さ,
シェアオフィスなどでお互いを刺激するなど,
向上を図ったワークスタイルがよく見受けられます.
これらを見ていると,ワークライフバランスよりも
ワークアズライフの方が向いている気もしますね.
ワークライフバランスとワークアズライフの関係には以下を参照してもらいたい.

超AI時代の生存戦略 ―― シンギュラリティ<2040年代>に備える34のリスト

超AI時代の生存戦略 ―― シンギュラリティ<2040年代>に備える34のリスト

ということで,私の地元福岡県は割りと有名IT企業のオフィスがあるので,
ワークスタイルは他の県に比べて多様になっているのではないでしょうか.
そう考え,私は福岡県へ帰省しました.

出発は愛媛県松山市です.
今回のルートは三津浜港より山口県柳井港に進み,
JRで下関へ進み,門司,小倉に進みました.

出発時間はAM3:00でした.
送ってくれた友人に感謝です.

f:id:makose3p1229:20180301235056j:plainf:id:makose3p1229:20180301235534j:plain
AM3:00の三津浜港

柳井港に着いたのはAM6:00ぐらいで,とても寒かった.
寒くて暖を求めて,彷徨っていると,港の隣にセブンイレブンがあり,
オアシスに見えた.そこでコーヒーと肉まんを買って,暖を得たが
下関行きがAM7:00ぐらい発だったので,かなり待った.結局冷えた.

f:id:makose3p1229:20180301235628j:plainf:id:makose3p1229:20180301235712j:plain
山口県のオアシス

私が乗り始めたJRの駅は柳井港駅だったのですが,
下関駅までの料金分の切符が券売機に存在せず,非常に困りました.
車内で足りない料金分を追加することで解決しましたが……
この辺りが山口県らしいですよね.

f:id:makose3p1229:20180301235727j:plainf:id:makose3p1229:20180301235738j:plain
かなり待った柳井港駅

柳井港から下関だとほぼ山口県を横断するわけで,
だいぶ長かったですね.
下関についた頃には8割死んでました.
下関から小倉に渡ると,もう帰ってきた感あります.

f:id:makose3p1229:20180301235749j:plainf:id:makose3p1229:20180301235758j:plain
下関,小倉間で見た電車

小倉駅に着くともう昼で,観光しようと思いましたが,
疲れてて諦めました.

f:id:makose3p1229:20180301235831j:plainf:id:makose3p1229:20180301235813j:plainf:id:makose3p1229:20180301235821j:plain
小倉駅にて

直方駅という筑豊地区の駅で下車したのですが,
駅には魁皇という力士の銅像があるのですが,
とても大きいです.とてもです.

f:id:makose3p1229:20180301235839j:plain
直方駅のシンボル

さて,別日に都会を感じに福岡市へ参ります.
まずは博多駅へ参りました.
博多駅だけで松山市駅と大街道,銀天街分ぐらい活気づいていました.
夜だとイルミネーションがあるみたいです.

f:id:makose3p1229:20180301235849j:plainf:id:makose3p1229:20180302000623j:plain
博多駅にて

都会を感じるために行ったので,とりあえず散歩します.
まずはヨドバシカメラへ行きます(オタク).
地下へ行き,PCパーツを眺めました.
相変わらず1080Tiを置いている店には出会わない.
そのあとMouseComputerのお店にも行きました.

そして観光へ.
キャナルシティ天神駅,パルコなどを通って,大濠公園の方まで歩きました.

キャナルシティの方へ行って,トイレ難民をして,
その後近くにPixivの福岡オフィスがあったので,眺めに行きました.
写真は無いです(撮ればよかったと思っている).

f:id:makose3p1229:20180301235859j:plain
ここはキャナルシティ

通った道で気になったところを適当に撮った.
f:id:makose3p1229:20180302000357j:plainf:id:makose3p1229:20180302000409j:plainf:id:makose3p1229:20180302000420j:plainf:id:makose3p1229:20180302000427j:plainf:id:makose3p1229:20180302000432j:plain

パルコでは今期のくそアニメのイベントをやってました.

f:id:makose3p1229:20180302000437j:plainf:id:makose3p1229:20180302000441j:plain
パルコにて

大濠公園の手前に舞鶴公園があって,どうして合併しないのかと思いました.
舞鶴公園大濠公園のプライドから怒られそうですね.

f:id:makose3p1229:20180302000500j:plain
舞鶴公園の入り口?

その後,大濠公園に着いて,1周したのですが約2kmあるそうで,とても疲れました.
まあ博多駅から大濠公園まで5km位あるので,1周後は7kmぐらいは歩いている.
この日はとても風が強く,池が波打ってました.
白鳥もランデブーしてました.

2018年3月1日の天気
tenki.jp

f:id:makose3p1229:20180302000503j:plainf:id:makose3p1229:20180302000507j:plainf:id:makose3p1229:20180302000511j:plainf:id:makose3p1229:20180302000515j:plainf:id:makose3p1229:20180302000533j:plainf:id:makose3p1229:20180302000534j:plainf:id:makose3p1229:20180302000539j:plainf:id:makose3p1229:20180302000555j:plainf:id:makose3p1229:20180302000600j:plainf:id:makose3p1229:20180302000608j:plainf:id:makose3p1229:20180302000613j:plain
大濠公園にて

博多駅までの帰路の途中にてオープンカーバス?を見かけました.
もしかしてここはロンドンかと思いました(すっとぼけ

f:id:makose3p1229:20180302000619j:plain
もしかしてロンドン???

博多駅について,ご飯を探す頃にはPM3:00でした.
とりあえずご飯と思い,OIOI(おいおい)に行きました.
10Fまで登って,和食を食べることに.

今回行ったお店
24-seasons.net

そして食べたのは親子丼です.
PM3:00ということもあり,お店は空いていて,
窓際を確保することができました.
10Fから見た博多駅は良い(高島屋から見る景色も好きだが).
お店のお姉さんがとても良くしてくれて,
普段女性と会話すらしないので,余計緊張していたのですが,
それでも優しく接してくれたので幸せでした.
さすが割烹って感じ.
ところで博多駅は亀梨くんを推しているのでしょうか?

f:id:makose3p1229:20180302000635j:plainf:id:makose3p1229:20180302000627j:plainf:id:makose3p1229:20180302000631j:plain
お昼ごはん♪

食後には勉強をしましょうということで,
博多バスターミナル内にある紀伊國屋書店へ行き,
専門書を眺め,帰路に着いたわけです.
眺めた本のうち気に入った本をAmazonで購入しました.
Amazonポイント付くので!

よく歩いたので,とても疲れまして,
電車内では座席をキープすることに専念しました.
3月1日ということで,卒業式と合同就職説明会があり,
学生が沢山いたように感じました.
まあ合同就職説明会には冷やかしに行ったのですが,
皆さん同じような格好をしていて,面白かったです.
私以外はほぼ皆様スーツでした(私服が数人?).
つまり何が言いたいというと,電車内で疲れた女子大学生が
こちらに寝かかって来たので,セクハラにならないかとヒヤヒヤしました.
無事に帰り着いて良かったです.

近いうちにもう1回行こうかと思います.
住むには悪くないと思いました.

Zabbix3.0 + netdataでのリソース監視

前回の記事でログ監視を行ったので,
続いてリソース監視を行いました. 今回はリアルタイム監視と過去リソース監視の2つを導入しました. リアルタイム監視はnetdata,過去リソース監視はzabbixで行いました.

makose3p1229.hatenablog.com

1.Zabbix3.0

Since zabbix 3.0 is LTS, I selected it.

1.1 Zabbix(Server) install(Amazon Linux に Zabbix Server 3.0 をインストールする - らくがきちょう)

zabbix needs apache + php + MySQL

Step1: Apache2.4, PHP7.1 MySQL install

$ sudo yum check-update
$ sudo yum -y install mysql-server httpd24 php71 php71-gd php71-mbstring php71-mysqlnd php71-bcmath

Step2: Zabbix Server install

$ sudo rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm
$ sudo yum check-update
$ sudo yum -y install zabbix-get zabbix-server-mysql zabbix-web-japanese zabbix-web-mysql
Create DB on MySQL
$ sudo service mysqld start
$ sudo chkconfig mysqld on
$ mysql -u root
> CREATE USER zabbix;
> CREATE DATABASE zabbix;
> GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost IDENTIFIED BY '<DB_PASSWORD>';
> FLUSH PRIVILEGES;
> quit;
Setting apache, php , etc...
$ cd /usr/share/doc/zabbix-server-mysql-3.0.5/
$ zcat create.sql.gz | mysql -u root zabbix
$ sudo cp /usr/share/doc/zabbix-web-3.0.5/httpd24-example.conf /etc/httpd/conf.d/zabbix.conf
$ sudo sed -i -e "s/;date.timezone =/date.timezone = Asia\/Tokyo/g" /etc/php.ini
$ sudo sed -i -e "s/;always_populate_raw_post_data/always_populate_raw_post_data/g" /etc/php.ini
$ sudo sed -i -e "s/post_max_size = 8M/post_max_size = 16M/g" /etc/php.ini
$ sudo sed -i -e "s/max_execution_time = 30/max_execution_time = 300/g" /etc/php.ini
$ sudo sed -i -e "s/max_input_time = 60/max_input_time = 300/g" /etc/php.ini

Step3: Launch Zabbix Server

setting DBpassword at /etc/zabbix/zabbix_server.conf

DBPassword=<DB_PASSWORD>

setup finished! launch zabbix server.

$ sudo service zabbix-server start
$ sudo service httpd start
$ sudo chkconfig zabbix-server on
$ sudo chkconfig httpd on

Step4: Access Zabbix Server

access to http://(server_ip)/zabix/
Follow the installation guide. Install everything missing every time.

Step5: Login

default ID and Password

UserName: Admin
Password: zabbix

1.2 Zabbix(Client) install(Amazon Linux に Zabbix エージェントをインストールする - らくがきちょう)

Step1: Zabbix Agent install
$ sudo rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm
$ sudo yum -y install zabbix-agent
Step2: conf setting

Change /etc/zabbix/zabbix_agentd.conf.

item description
Server Specify the host name of the Zabbix server
ServerActive Specify the host name of the Zabbix server
Hostname Specify the host name of the Zabbix agent
Server=server.example.local
ServerActive=server.example.local
Hostname=agent.example.local
Step3: start Zabbix Agent, Auto start setting
service zabbix-agent start
chkconfig zabbix-agent on

1.3 alert setting(Zabbixのアラートをチャットワークで通知する - Qiita)

Script default location is /usr/lib/zabbix/alertscripts

  • /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts

Create a script 'chatwork' to notify chatwork * chatowork

#!/bin/sh

TOKEN="CHATWORK_TOKEN"
ENDPOINT="https://api.chatwork.com/v2/rooms/${1}/messages"
SUBJECT=${2}
MESSAGE=${3}

/usr/bin/curl -X POST -H "X-ChatWorkToken: ${TOKEN}" -d "body=[info][title]${SUBJECT}[/title]${MESSAGE}[/info]" ${ENDPOINT}

Add execution authority

$ chmod +x /usr/lib/zabbix/alertscripts/chatwork

Select "Manage" -> "Media type" of Zabbix and create from media type creation.Set [Type] and [Script Parameters] as shown below.

media_type

Add media settings to any administrator user. Select any administrator from "Administration" -> "Users". Select the "Media" tab and click "Add" to open the setting screen. For types and destinations, set according to the situation.

Type (created media type name)
Destination Room ID of chatwork you want to use for notification

user

"Event Source: Trigger" is displayed in "Settings" -> "Action". I think that 'Report problems to Zabbix administrators' are set by default, so select it. Notifications will be sent with the subject and message you set here. Recovery message is a message when recovering from failure.

action

2.netdata(Home · firehol/netdata Wiki · GitHub)

2.1 netdata install

this commands exec

$ yum install zlib-devel libuuid-devel libmnl-devel gcc make git autoconf autogen automake pkgconfig
$ git clone https://github.com/firehol/netdata.git --depth=1
$ cd netdata
$ ./netdata-installer.sh
$ cd /etc/init.d/
$ cp -p ~/netdata/system/netdata-init-d ./netdata
$ chmod 755 netdata
$ chkconfig --add netdata
$ chkconfig netdata on

2.2 launch netata & access netdata

this commands exec

$ service netdata start

access http://(server_ip):19999

Update for elasticsearch&kibana

makose3p1229.hatenablog.com

これの環境を構築している間に一度updataがあったわけですが,
手順を残しておこうと思います.
今回の前提として,X-packをインストールしているものとします.

まあ,言ってしまえば早いのですが,とりあえずX-packを除去してから,
アップデートしろって話です.

#elasticsearch
$ sudo service elasticsearch stop
$ cd /usr/share/elasticsearch
$ sudo bin/elasticsearch-plugin remove x-pack
$ sudo yum update elasticsearch
$ sudo bin/elasticsearch-plugin install x-pack
$ sudo service elasticsearch start

#kibana
$ sudo service kibana stop
$ cd /usr/share/kibana
$ sudo bin/kibana-plugin remove x-pack
$ sudo yum update kibana
$ sudo bin/kibana-plugin install x-pack
$ sudo service kibana start

Official Docs

www.elastic.co

fluentd + elasticsearch + kibanaによるログ監視環境構築

少し前よりログ監視はしなければならず,
新規に環境を構築した際にインストールメモを作成したのですが,
折角なのでこちらにも記載しようと思います.

ちなみに先日参加した卒論聴講会ではトラフィックの可視化?というテーマがあったのですが,
どういった環境の可視化を行ったのか,非常に気になるところです.

それでは本編です.

how to install

1.Server: fluentd + elasticsearch + kibana

1.1 fluentd setup (Quickstart Guide | Fluentd)

Step1: install
# Amazon Linux 1
$ curl -L https://toolbelt.treasuredata.com/sh/install-amazon1-td-agent3.sh | sh
# Amazon Linux 2
$ curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh
Step2: Launch Daemon
  • systemed
$ sudo systemctl start td-agent.service
$ sudo systemctl status td-agent.service
  • init.d
$ /etc/init.d/td-agent start 
$ /etc/init.d/td-agent status

1.2 elasticsearch setup (Install Elasticsearch with RPM | Elasticsearch Reference [6.2] | Elastic)

Step1: Java8 install

elasticsearch need java8

$ sudo yum install java-1.8.0-openjdk-devel
$ sudo alternatives --config java //java-1.8.0 select
$ java --version
Step2: elasticsearch install

Download and install the public signing key

$ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
$ sudo yum install elasticsearch
Step3: Launch Daemon
  • systemed
$ sudo systemctl daemon-reload

$ sudo systemctl start elasticsearch.service
$ sudo systemctl enable elasticsearch.service
$ sudo systemctl status elasticsearch.service
  • init.d
$ /etc/init.d/elasticsearch start 
$ /etc/init.d/elasticsearch status
or
$ sudo -i service elasticsearch start
$ sudo -i service elasticsearch status

$ sudo chkconfig --add elasticsearch
Step 4: X-Pack install (Installing X-Pack in Elasticsearch | Elasticsearch Reference [6.2] | Elastic)
$ cd /usr/share/elasticsearch
$ sudo bin/elasticsearch-plugin install x-pack
Step 5: Password Setup for X-Pack (Getting Started with Security | X-Pack for the Elastic Stack [6.2] | Elastic)
$ cd /usr/share/elasticsearch
$ bin/x-pack/setup-passwords auto
Directory layout of RPM
type Description Default Location Setting
home elasticsearch home directory or $ES_HOME /usr/share/elasticsearch
bin Binary scripts including elasticsearch to start a node and elasticsearch-plugin to install plugins /usr/share/elasticsearch/bin
conf Configuration files including elasticsearch.yml /etc/elasticsearch ES_PATH_CONF
conf CEnvironment variables including heap size, file descriptors. /etc/sysconfig/elasticsearch
data The location of the data files of each index / shard allocated on the node. Can hold multiple locations. /var/lib/elasticsearch path.data
logs Log files location. /var/log/elasticsearch path.logs
plugins Plugin files location. Each plugin will be contained in a subdirectory. /usr/share/elasticsearch/plugins
repo Shared file system repository locations. Can hold multiple locations. A file system repository can be placed in to any subdirectory of any directory specified here. Not configured path.repo

1.3 kibana setup (Install Kibana with RPM | Kibana User Guide [6.2] | Elastic)

Step1: kibana install

Download and install the public signing key

$ sudo yum install kibana
Step2: Launch Daemon

systemed ? init.d ? use this command

$ ps -p 1
  • systemed
$ sudo systemctl daemon-reload

$ sudo systemctl start kibana.service
$ sudo systemctl enable kibana.service
$ sudo systemctl status kibana.service
  • init.d
$ /etc/init.d/kibana start 
$ /etc/init.d/kibana status
or
$ sudo -i service kibana start
$ sudo -i service kibana status

$ sudo chkconfig --add kibana
Step 3: X-Pack install (Installing X-Pack in Kibana | Kibana User Guide [6.2] | Elastic)
$ cd /usr/share/kibana
$ sudo bin/kibana-plugin install x-pack
Step 4: kibana.yml edit
elasticsearch.username: "kibana"
elasticsearch.password: "<kibanapassword">
Directory layout of RPM
type Description Default Location Setting
home Kibana home directory or $KIBANA_HOME /usr/share/kibana
bin Binary scripts including kibana to start the Kibana server and kibana-plugin to install plugins /usr/share/kibana/bin
config Configuration files including kibana.yml /etc/kibana
data The location of the data files written to disk by Kibana and its plugins /var/lib/kibana path.data
optimize Transpiled source code. Certain administrative actions (e.g. plugin install) result in the source code being retranspiled on the fly. /usr/share/kibana/optimize
plugins Plugin files location. Each plugin will be contained in a subdirectory. /usr/share/kibana/plugins

2.elasticsearch settings

make template for elasticsearch

$ vi es_rtx1200_template.json
$ curl -u elastic:<elasticpassword> -H "Content-Type: application/json" -XPUT 127.0.0.1:9200/rtx1200/ -d "`cat es_rtx1200_template.json`"
$ vi es_apache_template.json
$ curl -u elastic:<elasticpassword> -H "Content-Type: application/json" -XPUT 127.0.0.1:9200/apache/ -d "`cat es_apache_template.json`"
$ vi es_nas_template.json
$ curl -u elastic:<elasticpassword> -H "Content-Type: application/json" -XPUT 127.0.0.1:9200/nas/ -d "`cat es_nas_template.json`"
  • es_rtx1200_template.json
elasticsearch_rtx_template.json
{
    "templete": "rtx1200-*",
    "mappings": {
        "_default_": {
            "dynamic_templates": [
                {
                    "string_template" : {
                        "match" : "*",
                        "mapping": {
                            "type": "string",
                            "fields": {
                                "full": {
                                    "type": "string",
                                    "index": "false"
                                }
                            }
                        },
                        "match_mapping_type": "string"
                    }
                }
            ],
            "properties": {
                "@timestamp": { "type": "date", "index": "false" },
                "geo_location": {"type" : "geo_point" }
            }
        }
    }
}
elasticsearch_apache_template.json
{
    "templete": "*.apache-*”,
    "mappings": {
        "_default_": {
            "dynamic_templates": [
                {
                    "string_template" : {
                        "match" : "*",
                        "mapping": {
                            "type": "string",
                            "fields": {
                                "full": {
                                    "type": "string",
                                    "index": "false"
                                }
                            }
                        },
                        "match_mapping_type": "string"
                    }
                }
            ],
            "properties": {
                "@timestamp": { "type": "date", "index": "false" }
            }
        }
    }
}
 
{
    "templete": "myhome-nas-*",
    "mappings": {
        "_default_": {
            "dynamic_templates": [
                {
                    "string_template" : {
                        "match" : "*",
                        "mapping": {
                            "type": "string",
                            "fields": {
                                "full": {
                                    "type": "string",
                                    "index": "false"
                                }
                            }
                        },
                        "match_mapping_type": "string"
                    }
                }
            ],
            "properties": {
                "@timestamp": { "type": "date", "index": "false" }
            }
        }
    }
}

3.fluentd settings

3.fluentd settings

3.1 fluentd-plugin install

$ td-agent-gem install fluent-plugin-rewrite-tag-filter
$ td-agent-gem install fluent-plugin-elasticsearch

$ yum install geoip-devel
$ td-agent-gem install fluent-plugin-geoip -v 0.8.0

$ td-agent-gem install fluent-plugin-multi-format-parser
$ td-agent-gem install fluent-plugin-parser
$ td-agent-gem install fluent-plugin-with-extra-fields-parser

3.2 edit td-agent.conf

td-agent.conf location /etc/td-agent/td-agent.conf

  • index filter
1.rtx1200
# dynamic filter ==> rtx-1200-inspect
# filter reject ==> rtx1200-reject
# console log in/out ==> rtx1200-console
# VPN access on/off ==> rtx1200-tunnel
# others ==> rtx1200-other
2.nas
# all ==> myhome-nas
3.apache
# access_log ==> <prefix>.apache-access
# error_log ==> <prefix>.apache-error
  • td-agent.conf
####
## Source descriptions:
##

## syslog
<source>
  @type tail
  tag raw.rtx1200
  format none
  path /var/log/syslog
  pos_file /var/log/td-agent/syslog.pos
</source>

<source>
  @type forward
  port 24224
  bind 0.0.0.0
  tag log.apache.242
</source>

<source>
  @type forward
  port 24225
  bind 0.0.0.0
  tag log.apache.app
</source>

<source>
  @type forward
  port 24226
  bind 0.0.0.0
  tag log.apache.s
</source>

<source>
  @type forward
  port 24227
  bind 0.0.0.0
  tag log.apache.piro
</source>

####
## Output descriptions:
##
<match raw.rtx1200.**>
  type parser
  format multi_format
  key_name message
  remove_prefix raw
  add_prefix parsed
  <pattern>
      format with_extra_fields
      base_format /\[INSPECT\]\s+(?<target>.+)\[(?<direction>.+)\]\[(?<filter_num>\d+)\]\s+(?<proto>.+)\s+(?<src_ip>.+):(?<src_port>.+)\s+>\s+(?<dest_ip>.+):(?<dest_port>.+)\s+\((?<time>.+)\)$/
      time_format '%Y/%m/%d %H:%M:%S'
      extra_fields { "log_type": "inspect" }
  </pattern>
  <pattern>
      format with_extra_fields
      base_format /(?<target>.+)\s+Rejected\s+at\s+(?<direction>.+)\s+filter:\s+(?<proto>.+)\s+(?<src_ip>.+):(?<src_port>.+)\s+>\s+(?<dest_ip>.+):(?<dest_port>.+)$/
      extra_fields { "log_type": "reject" }
  </pattern>
  <pattern>
      format with_extra_fields
      base_format /Logout\s+from\s+(?<proto>.+):\s+(?<ip>.+)$/
      extra_fields { "log_type": "console_logout" }
  </pattern>
  <pattern>
      format with_extra_fields
      base_format /Login\s+succeeded\s+for\s+(?<proto>.+):\s+(?<ip>.+)$/
      extra_fields { "log_type": "console_login" }
  </pattern>
  <pattern>
      format with_extra_fields
      base_format /\[(?<proto>.+)\]\s+(?<tunnel>.+)\s+connected\s+from\s+(?<src_ip>.+)$/
      extra_fields { "log_type": "tunnel_connect" }
  </pattern>
  <pattern>
      format with_extra_fields
      base_format /\[(?<proto>.+)\]\s+(?<tunnel>.+)\s+disconnect\s+tunnel\s+\d+\s+complete$/
      extra_fields { "log_type": "tunnel_disconnect" }
  </pattern>
   <pattern>
      format with_extra_fields
      base_format /PP\[.*\]\s+Call\s+detected\s+from\s+user\s+\W(?<user>.+)\W$/
      extra_fields { "log_type": "vpnuser" }
  </pattern>
  <pattern>
     format with_extra_fields
     base_format /(?<date>.+)\s(?<machine>eymovic-NAS)\sqlogd\[\d+\]:\s(?<log>.+):\sUsers:\s(?<Users>.+),\sSource\sIP:\s(?<src_ip>.+),\sComputer\sname:\s(?<computer_name>.+),\sConnection\stype:\s(?<connection_type>.+),\sAccessed\sresources:\s(?<accessed_resources>.+),\sAction:\s(?<action>.+)$/
     extra_fields { "log_type": "NAS" }
  </pattern>
  <pattern>
      format with_extra_fields
      base_format /(?<msg>.+)$/
      extra_fields { "log_type": "other" }
  </pattern>

</match>

<match parsed.rtx1200.**>
  type rewrite_tag_filter
  <rule>
  key     log_type
  pattern ^inspect$
  tag     rtx1200.inspect
  </rule>
  <rule>
  key     log_type
  pattern ^reject$
  tag     temp.rtx1200.reject
  </rule>
  <rule>
  key     log_type
  pattern ^console_(.+)$
  tag     rtx1200.console.$1
  </rule>
  <rule>
  key     log_type
  pattern ^tunnel_(.+)$
  tag     temp.rtx1200.tunnel.$1
  </rule>
  <rule>
  key     log_type
  pattern ^vpnuser$
  tag     rtx1200.vpnuser
  </rule>
  <rule>
  key     log_type
  pattern ^NAS$
  tag     myhome.nas
  </rule>
  <rule>
  key     log_type
  pattern ^other$
  tag     rtx1200.other
  </rule>
</match>

<match rtx1200.inspect.**>
  type elasticsearch
  logstash_format true
  logstash_prefix rtx1200-inspect
  include_tag_key true
  tag_key @log_name
  hosts localhost:9200
  buffer_type memory
  num_threads 1
  flush_interval 60
  retry_wait 1.0
  retry_limit 17
  user elastic
  password <elasticsearch password>
</match>

<match temp.rtx1200.reject.**>
  type  geoip
  geoip_lookup_key src_ip
  <record>
    geo_location  '{ "lat" : ${latitude["src_ip"]}, "lon" : ${longitude["src_ip"]} }'
    country_code  ${country_code["src_ip"]}
  </record>
  remove_tag_prefix temp.
  skip_adding_null_record  true
  flush_interval 1s
</match>
<match rtx1200.reject.**>
  type elasticsearch
  logstash_format true
  logstash_prefix rtx1200-reject
  include_tag_key true
  tag_key @log_name
  hosts localhost:9200
  buffer_type memory
  num_threads 1
  flush_interval 60
  retry_wait 1.0
  retry_limit 17
  user elastic
  password <elasticsearch password>
</match>

<match rtx1200.console.**>
  type elasticsearch
  logstash_format true
  logstash_prefix rtx1200-console
  include_tag_key true
  tag_key @log_name
  hosts localhost:9200
  buffer_type memory
  num_threads 1
  flush_interval 60
  retry_wait 1.0
  retry_limit 17
  user elastic
  password <elasticsearch password>
</match>

<match temp.rtx1200.tunnel.**>
  type  geoip
  geoip_lookup_key src_ip
  <record>
    geo_location  '{ "lat" : ${latitude["src_ip"]}, "lon" : ${longitude["src_ip"]} }'
    country_code  ${country_code["src_ip"]}
  </record>
  remove_tag_prefix temp.
  skip_adding_null_record  true
  flush_interval 1s
</match>
<match rtx1200.tunnel.**>
  type elasticsearch
  logstash_format true
  logstash_prefix rtx1200-tunnel
  include_tag_key true
  tag_key @log_name
  hosts localhost:9200
  buffer_type memory
  num_threads 1
  flush_interval 60
  retry_wait 1.0
  retry_limit 17
  user elastic
  password <elasticsearch password>
</match>

<match rtx1200.vpnuser.**>
  type elasticsearch
  logstash_format true
  logstash_prefix rtx1200-vpnuser
  include_tag_key true
  tag_key @log_name
  hosts localhost:9200
  buffer_type memory
  num_threads 1
  flush_interval 60
  retry_wait 1.0
  retry_limit 17
  user elastic
  password <elasticsearch password>
</match>

<match rtx1200.other.**>
  type elasticsearch
  logstash_format true
  logstash_prefix rtx1200-other
  include_tag_key true
  tag_key @log_name
  hosts localhost:9200
  buffer_type memory
  num_threads 1
  flush_interval 60
  retry_wait 1.0
  retry_limit 17
  user elastic
  password <elasticsearch password>
</match>

<match myhome.nas.**>
  type elasticsearch
  logstash_format true
  logstash_prefix myhome-nas
  include_tag_key true
  tag_key @log_name
  hosts localhost:9200
  buffer_type memory
  num_threads 1
  flush_interval 60
  retry_wait 1.0
  retry_limit 17
  user elastic
  password <elasticsearch password>
</match>

<match log.apache.242.**>
  type parser
  format multi_format
  key_name message
  remove_prefix log
  add_prefix parsed
  <pattern>
      # format with_extra_fields
      # base_format /(?<src_ip>.+)\s-\s-\s\[(?<date>.+)\]\s\"(?<method>.+)\".*\"(?<dest_url>.+)\"\s\"(?<browser>.+)\"/
      # time_format '%Y/%m/%d %H:%M:%S'
      format with_extra_fields
      base_format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
      time_format %d/%b/%Y:%H:%M:%S %z
      extra_fields { "log_type": "access" }
  </pattern>
  <pattern>
      # format with_extra_fields
      # base_format /\[(?<date>.+)\]\s\[(?<event>.+)\]\s\[.+\]\s(?<message>.+)/
      # time_format '%Y/%m/%d %H:%M:%S'
      format with_extra_fields
      base_format /^\[[^ ]* (?<time>[^\]]*)\] \[(?<level>[^\]]*)\](?: \[pid (?<pid>[^\]]*)\])? \[client (?<client>[^\]]*)\] (?<message>.*)$/
      time_format %d/%b/%Y:%H:%M:%S %z
      extra_fields { "log_type": "error" }
  </pattern>
</match>

<match parsed.apache.242.**>
  type rewrite_tag_filter
  <rule>
  key     log_type
  pattern ^access$
  tag     242.apache.access
  </rule>
  <rule>
  key     log_type
  pattern ^error$
  tag     242.apache.error
  </rule>
</match>

<match 242.apache.access>
    type elasticsearch
    logstash_format true
    logstash_prefix 242.apache-access
    include_tag_key true
    tag_key @log_name
    hosts localhost:9200
    buffer_type memory
    num_threads 1
    flush_interval 60
    retry_wait 1.0
    retry_limit 17
    user elastic
    password <elasticsearch password>
</match>

<match 242.apache.error>
    type elasticsearch
    logstash_format true
    logstash_prefix 242.apache-error
    include_tag_key true
    tag_key @log_name
    hosts localhost:9200
    buffer_type memory
    num_threads 1
    flush_interval 60
    retry_wait 1.0
    retry_limit 17
    user elastic
    password <elasticsearch password>
</match>

<match log.apache.app.**>
  type parser
  format multi_format
  key_name message
  remove_prefix log
  add_prefix parsed
  <pattern>
      # format with_extra_fields
      # base_format /(?<src_ip>.+)\s-\s-\s\[(?<date>.+)\]\s\"(?<method>.+)\".*\"(?<dest_url>.+)\"\s\"(?<browser>.+)\"/
      # time_format '%Y/%m/%d %H:%M:%S'
      format with_extra_fields
      base_format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
      time_format %d/%b/%Y:%H:%M:%S %z
      extra_fields { "log_type": "access" }
  </pattern>
  <pattern>
      # format with_extra_fields
      # base_format /\[(?<date>.+)\]\s\[(?<event>.+)\]\s\[.+\]\s(?<message>.+)/
      # time_format '%Y/%m/%d %H:%M:%S'
      format with_extra_fields
      base_format /^\[[^ ]* (?<time>[^\]]*)\] \[(?<level>[^\]]*)\](?: \[pid (?<pid>[^\]]*)\])? \[client (?<client>[^\]]*)\] (?<message>.*)$/
      time_format %d/%b/%Y:%H:%M:%S %z
      extra_fields { "log_type": "error" }
  </pattern>
</match>

<match parsed.apache.app.**>
  type rewrite_tag_filter
  <rule>
  key     log_type
  pattern ^access$
  tag     app.apache.access
  </rule>
  <rule>
  key     log_type
  pattern ^error$
  tag     app.apache.error
  </rule>
</match>

<match app.apache.access>
    type elasticsearch
    logstash_format true
    logstash_prefix app.apache-access
    include_tag_key true
    tag_key @log_name
    hosts localhost:9200
    buffer_type memory
    num_threads 1
    flush_interval 60
    retry_wait 1.0
    retry_limit 17
    user elastic
    password <elasticsearch password>
</match>

<match app.apache.error>
    type elasticsearch
    logstash_format true
    logstash_prefix app.apache-error
    include_tag_key true
    tag_key @log_name
    hosts localhost:9200
    buffer_type memory
    num_threads 1
    flush_interval 60
    retry_wait 1.0
    retry_limit 17
    user elastic
    password <elasticsearch password>
</match>

<match log.apache.s.**>
  type parser
  format multi_format
  key_name message
  remove_prefix log
  add_prefix parsed
  <pattern>
      # format with_extra_fields
      # base_format /(?<src_ip>.+)\s-\s-\s\[(?<date>.+)\]\s\"(?<method>.+)\".*\"(?<dest_url>.+)\"\s\"(?<browser>.+)\"/
      # time_format '%Y/%m/%d %H:%M:%S'
      format with_extra_fields
      base_format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
      time_format %d/%b/%Y:%H:%M:%S %z
      extra_fields { "log_type": "access" }
  </pattern>
  <pattern>
      # format with_extra_fields
      # base_format /\[(?<date>.+)\]\s\[(?<event>.+)\]\s\[.+\]\s(?<message>.+)/
      # time_format '%Y/%m/%d %H:%M:%S'
      format with_extra_fields
      base_format /^\[[^ ]* (?<time>[^\]]*)\] \[(?<level>[^\]]*)\](?: \[pid (?<pid>[^\]]*)\])? \[client (?<client>[^\]]*)\] (?<message>.*)$/
      time_format %d/%b/%Y:%H:%M:%S %z
      extra_fields { "log_type": "error" }
  </pattern>
</match>

<match parsed.apache.s.**>
  type rewrite_tag_filter
  <rule>
  key     log_type
  pattern ^access$
  tag     s.apache.access
  </rule>
  <rule>
  key     log_type
  pattern ^error$
  tag     s.apache.error
  </rule>
</match>

<match s.apache.access>
    type elasticsearch
    logstash_format true
    logstash_prefix s.apache-access
    include_tag_key true
    tag_key @log_name
    hosts localhost:9200
    buffer_type memory
    num_threads 1
    flush_interval 60
    retry_wait 1.0
    retry_limit 17
    user elastic
    password <elasticsearch password>
</match>

<match s.apache.error>
    type elasticsearch
    logstash_format true
    logstash_prefix s.apache-error
    include_tag_key true
    tag_key @log_name
    hosts localhost:9200
    buffer_type memory
    num_threads 1
    flush_interval 60
    retry_wait 1.0
    retry_limit 17
    user elastic
    password <elasticsearch password>
</match>

<match log.apache.piro.**>
  type parser
  format multi_format
  key_name message
  remove_prefix log
  add_prefix parsed
  <pattern>
      # format with_extra_fields
      # base_format /(?<src_ip>.+)\s-\s-\s\[(?<date>.+)\]\s\"(?<method>.+)\".*\"(?<dest_url>.+)\"\s\"(?<browser>.+)\"/
      # time_format '%Y/%m/%d %H:%M:%S'
      format with_extra_fields
      base_format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
      time_format %d/%b/%Y:%H:%M:%S %z
      extra_fields { "log_type": "access" }
  </pattern>
  <pattern>
      # format with_extra_fields
      # base_format /\[(?<date>.+)\]\s\[(?<event>.+)\]\s\[.+\]\s(?<message>.+)/
      # time_format '%Y/%m/%d %H:%M:%S'
      format with_extra_fields
      base_format /^\[[^ ]* (?<time>[^\]]*)\] \[(?<level>[^\]]*)\](?: \[pid (?<pid>[^\]]*)\])? \[client (?<client>[^\]]*)\] (?<message>.*)$/
      time_format %d/%b/%Y:%H:%M:%S %z
      extra_fields { "log_type": "error" }
  </pattern>
</match>

<match parsed.apache.piro.**>
  type rewrite_tag_filter
  <rule>
  key     log_type
  pattern ^access$
  tag     piro.apache.access
  </rule>
  <rule>
  key     log_type
  pattern ^error$
  tag     piro.apache.error
  </rule>
</match>

<match piro.apache.access>
    type elasticsearch
    logstash_format true
    logstash_prefix piro.apache-access
    include_tag_key true
    tag_key @log_name
    hosts localhost:9200
    buffer_type memory
    num_threads 1
    flush_interval 60
    retry_wait 1.0
    retry_limit 17
    user elastic
    password <elasticsearch password>
</match>

<match piro.apache.error>
    type elasticsearch
    logstash_format true
    logstash_prefix piro.apache-error
    include_tag_key true
    tag_key @log_name
    hosts localhost:9200
    buffer_type memory
    num_threads 1
    flush_interval 60
    retry_wait 1.0
    retry_limit 17
    user elastic
    password <elasticsearch password>
</match>

4.send log to fluentd server

4.1 RTX1200 & NAS

Set from the browser

4.2 apache

Install fluentd(td-agent) to send apache logs

Installation refers to 1.1

edit td-agent.conf * td-agent.conf

td-agent.conf (send server)
## Input
<source>
  @type tail
  path /var/log/httpd/access_log 
  format apache
    tag apache.access
</source>
<source>
  @type tail
  path /var/log/httpd/error_log 
  format apache
    tag apache.error
</source>
<source>
  @type tail
  path /var/log/httpd/ssl_access_log 
  format apache
    tag apache.access
</source>
<source>
  @type tail
  path /var/log/httpd/ssl_error_log 
  format apache
    tag apache.error
</source>

## Output
<match apache.access>
   @type forward
  send_timeout 60s
  <server>
    host <server ip>
    port <port>
  </server>
</match>
<match apache.error>
   @type forward
  send_timeout 60s
  <server>
    host <server ip>
    port <port>
  </server>
</match>

5.kibana access from the browser

browser access this ip

http://<server ip>:5601

basic auth

plesse input this

ID:elastic
Password:<elastic password>

create index patttern

please create index patterns from the browser
examples:rtx1200-*

confirm discovery

please confirm discovery from the browser

Watcher setting(Alerting on Cluster and Index Events | X-Pack for the Elastic Stack [5.4] | Elastic)

Watcher is one of the functions of x-pack and provides alert function.

seeting from kibana on the browser.

example setting(send to Chatwork)

{
  "trigger": {
    "schedule": {
      "interval": "1m"
    }
  },
  "input": {
    "search": {
      "request": {
        "search_type": "query_then_fetch",
        "indices": [
          "rtx1200-tunnel-*"
        ],
        "types": [],
        "body": {
          "query": {
            "range": {
              "@timestamp": {
                "gte": "now-3m"
              }
            }
          }
        }
      }
    }
  },
  "condition": {
    "compare": {
      "ctx.payload.hits.total": {
        "gte": 3
      }
    }
  },
  "actions": {
    "send_chat": {
      "webhook": {
        "scheme": "https",
        "host": "api.chatwork.com",
        "port": 443,
        "method": "post",
        "path": "/v2/rooms/<room id>/messages",
        "params": {
          "body": "[info][title]VPN Log[/title]type:{{ctx.payload.hits.hits.2._source.log_type}},src-ip:{{ctx.payload.hits.hits.2._source.src_ip}}:{{ctx.payload.hits.hits.2._source.@timestamp}}\ntype:{{ctx.payload.hits.hits.1._source.log_type}},src-ip:{{ctx.payload.hits.hits.1._source.src_ip}}:{{ctx.payload.hits.hits.1._source.@timestamp}}\ntype:{{ctx.payload.hits.hits.0._source.log_type}},src-ip:{{ctx.payload.hits.hits.0._source.src_ip}}:{{ctx.payload.hits.hits.0._source.@timestamp}}[/info]"
        },
        "headers": {
          "X-ChatWorkToken": "<ChatWorkToken>"
        }
      }
    }
  }
}

6.Management Tools

cerebro(GitHub - lmenezes/cerebro)

cerebro can work with easticsearch and manipulate the created index with the GUI.

$ wget https://github.com/lmenezes/cerebro/releases/download/v0.7.2/cerebro-0.7.2.zip
$ unzip cerebro-*.zip
$ cd cerebro-*
$ bin/cerebro

please your browser access localhost:9000

curator(Curator Reference [5.4] | Elastic)

curator can work with elasticsearch to close and delete index existing in elasticsearch.

Step 1 install

  • pip
$ pip install elasticsearch-curator
$ rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
$ yum install elasticsearch-curator
$ rpm -ivh https://packages.elastic.co/curator/5/centos/7/Packages/elasticsearch-curator-5.4.1-1.x86_64.rpm

Step 2 create curator.yml and action_file

create curator.yml in ~/.curator

  • curator.yml
client:
  hosts:
    - localhost
  port: 9200
  url_prefix:
  use_ssl: False
  certificate:
  client_cert:
  client_key:
  ssl_no_validate: False
  http_auth: elastic:<elasticsearch password>
# if x-pack is installed, set "http_auth: elastic:changeme"
  timeout: 30
  master_only: False

logging:
  loglevel: INFO
  logfile:
  logformat: default
  blacklist: ['elasticsearch', 'urllib3']

create action_file named delete_indices

  • delete_indices
actions:
  1:
    action: delete_indices
    description: >-
      (custommessage)Delete indices older than 5 days (based on index name), for .monitoring-es-
      prefixed indices. Ignore the error if the filter does not result in an
      actionable list of indices (ignore_empty_list) and exit cleanly.(custom message)
    options:
      ignore_empty_list: True
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: rtx1200-
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 5
      exclude:
  2:
    action: close
    description: >-
      (custom message)Close indices older than 4 days (based on index name), for .monitoring-es-
      prefixed indices.(custom message)
    options:
      ignore_empty_list: True
      delete_aliases: False
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: rtx1200-
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 4
      exclude:
  3:
    action: delete_indices
    description: >-
      (custommessage)Delete indices older than 5 days (based on index name), for .monitoring-es-
      prefixed indices. Ignore the error if the filter does not result in an
      actionable list of indices (ignore_empty_list) and exit cleanly.(custom message)
    options:
      ignore_empty_list: True
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: apache
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 5
      exclude:
  4:
    action: close
    description: >-
      (custom message)Close indices older than 4 days (based on index name), for .monitoring-es-
      prefixed indices.(custom message)
    options:
      ignore_empty_list: True
      delete_aliases: False
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: apache
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 4
      exclude:

  5:
    action: delete_indices
    description: >-
      (custommessage)Delete indices older than 5 days (based on index name), for .monitoring-es-
      prefixed indices. Ignore the error if the filter does not result in an
      actionable list of indices (ignore_empty_list) and exit cleanly.(custom message)
    options:
      ignore_empty_list: True
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: .
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 5
      exclude:
  6:
    action: close
    description: >-
      (custom message)Close indices older than 4 days (based on index name), for .monitoring-es-
      prefixed indices.(custom message)
    options:
      ignore_empty_list: True
      delete_aliases: False
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: .
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 4
      exclude:
7:
    action: delete_indices
    description: >-
      (custommessage)Delete indices older than 5 days (based on index name), for .monitoring-es-
      prefixed indices. Ignore the error if the filter does not result in an
      actionable list of indices (ignore_empty_list) and exit cleanly.(custom message)
    options:
      ignore_empty_list: True
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: myhome-nas
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 5
      exclude:
  8:
    action: close
    description: >-
      (custom message)Close indices older than 4 days (based on index name), for .monitoring-es-
      prefixed indices.(custom message)
    options:
      ignore_empty_list: True
      delete_aliases: False
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: myhome-nas
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 4
      exclude:

Step3 Run curator

run once

$ curator ~/.curator/delete_indices

run regularly

$ crontab -e

example cron

00 02 * * * curator ~/.curator/delete_indices

HSTSに時間を溶かしたお話

先日開発をしていて,http/httpsが混ざった状態で開発を行っていると,
強制的にhttpsにリダイレクトされる現象に遭遇し.
かなりの時間を消費してしまった.

まず,頭の中に浮かんだのはApacheの設定でリダイレクトしてる可能性.
しかし,htaccessを見てもそのような記述は無いし,
confでリダイレクトしてそうな雰囲気もない.
/var/logを見たところ,それらしい記述があるわけでもないため
サーバーサイドでは無いだろうという結論に至りました.

そして次に考えられたのが,クライアント側の問題だということでした.
クライアント側という点は正解だったのですが,検証方法がまずかったので,
上手く検証することができず,時間を浪費しました.

私が行った検証方法としては,ブラウザを変えるということでした.
私のメインブラウザはFirefoxなので,Chromeに変えることで解決するだろうと思いました.
しかし,Chromeに変えても同じ現象が起きてしまったので,混乱を招きました.
やはりサーバーサイドの問題なのかもしれないと思い,
更に深く調査して(何も問題はない),時間を費やしました.
なぜ私がブラウザとしてFirefoxChromeしか考えられなかったかというと,
普段Debianを使っていて,FirefoxChromeしか入っていないからでした.
その時使っていたのはMacだったのでSafariもあり,Safariで検証すると,
原因を突き止める事ができました.プライバシーモードも有効な手段です.
原因はHSTS(HTTP Strict Transport Security)だったわけですね.
解決するのも大変でして,有効期限を0にして,アクセスし直し,
httpでアクセスできる事を確認してから,https化しなければなりませんでした.
問題としてはどこでこの地雷を踏んでしまったのかがわからないということでした.
私の場合は開発中だったということもあり,ある程度察しがついていたので,
地雷元の探索は少し楽でした.
httpアクセスするためにキャッシュを削除したり,サイトデータを削除したり,
履歴を削除したり,Cookieを削除したり,
削除できるものは削除しようって対策が最も楽な?手段ですね.

対策方法は次を参考にしました.
qiita.com

まあ,私自身の検証力の低さにより苦労したわけですが,
Web系開発の難しさを感じました.

HSTSについて悪いように書いてあるように感じるかもしれませんが,
httpsの方が基本的に安全なこともあり,常時httpsがベーシックになるべきだと思いますが,
開発に対して,こういった影響を与えてしまうので少し困りものです.
開発環境も常にSSL通信するように構築すれば,
こういった問題を回避できるのかもしれませんが…
もちろん私の自宅サーバーは常時SSL通信をリクエストするようにしてありますので,
立場的にはHSTS完全否定派ではないです.

この問題には非常に精神を疲弊させられました.