皆さん!明日はクリスマスですね!
僕は漢友達と風呂入って酒飲んでます(#^ω^)
ハンズラボAdvent Calendarも23日目。残す所2日となりました。
エンジニアの@Yuki_BB3です。
ラボに入社してはもう2年も経ってしまいました。最近は代謝が落ちたせいか体重が気になってきています。
歳かな。
ラボでは東急ハンズのポイントシステムに関わる仕事をしています。nodejsを使ってAPI作ったり、データベースおじさんしていたりします。
主にデータベースおじさんしています。
もうお兄さんじゃなくておじさんになってしまいました。 つらい
今日の記事、何を書こうか直前まで迷っていたのですが、最近自分の中でアツい ElasticSearch
と Kibana
について書きたいと思います。
ElasticSearch
現在、ポイントシステムでも ElasticSearchは使用しているのですが、可視化や分析のためではなく、DynamoDBと連携してあいまい検索が出来るようにすると言った用途がメインです。
ElasticSearchの用途をぐぐるとKibanaと組み合わせてログの可視化なんかがよく出来てきますね。
「Kibanaちょっと使ってみたいなー、でもログ解析しても別に楽しくはないしな−」
と思っていました。
思っていて、閃いた。
「・・・購買履歴って要はログじゃね?」
運用上、あると便利なので作ってみることにしました。
その上で躓いたことをつらつらと書いていきます。
連携データ
連携データの元はDynamoDBに保存されています。
こんな感じに、全てのデータは最終的にDynamoDBにホストされます。
DynamoDBに挿入されたデータは DynamoDB Streams
をを用いて各種AWS Lambdaが起動し、各々次の処理へデータが渡されます。
そこで、Streamに新しい処理を追加してデータを投入することで特に何も弄ること無く、データを可視化する環境を構築します。
ところで、可視化とかなんとか言われると地図上にデータをプロットしてドヤ顔したくなりませんか?
個人的には可視化って言うとそんなイメージしか無いんです
ElasticSearch -Mapping-
ElasticSearchは各項目がどういったものなのか(文字列なのか、数値なのか、日付なのかなど)を規定するMappingといったものを定義します。
地図上にプロットしたかったので、経度・緯度を使用したいのですが、流れてくるデータにはそんなものはついていません。
そこで、Lambdaで処理をする際に場所に応じて位置情報を付与して投入することにしました。
(今回はお店の位置なので腹持ちでJSONを用意し変換しています)
{
"mappings": {
"type01": {
"properties": {
"id": {
"type": "keyword"
},
"date": {
"type": "date",
"format": "yyyy-MM-dd'T'HH:mm:ss"
},
"location": {
"type": "geo_point"
}
}
}
}
}
一部のみ抜き出したサンプルですが、このような感じです。
- 日付は、
20171223T10:00:00
という形で入力されれば日付として認識するという設定 - 地図データはgeo_pointとして指定します。入力時は
[139.709, 35.697]
経度,緯度
の順番で入力することで座標として利用することが出来ます。
注意としては、緯度と経度を逆に送ってしまうと何も表示されなかったりエラー吐くので気をつけて下さい。
成功するとこんなかんじでデータが投入されているのを確認できます。
目標だった地図上へのプロットが出来ました!
地図へのプロットは正直どうでもよくて、リアルタイムにどんなデータが来ているのかを確認することができれば、DynamoDBのキャパシティをより良い値で設定出来ると思い作成したツールでした。
このくらいの事なら一人でちょこちょこやってれば作れてしまうのでいい時代になったんだなぁと感じる年の瀬です。
明日は、@yuka_jyotei さんの担当日。
そしてクリスマス・イブ