OpenSearchとOpenSearch Dashboardsによるダッシュボード作成(ローカルDocker)
本記事では、OpenSearchとOpenSearch Dashboardsを使用して、商品別の売上データを可視化する方法を紹介します。ダミーデータの作成から環境構築、データの登録、ダッシュボードの作成までの全体の流れを詳細に解説します。
目次
やりたいこと
こんなデータを商品別の売上として、ダッシュボードで可視化したい。横軸が日付で、縦軸が売上数で、商品別に出てくるイメージ。
Elastic SearchのApache 2.0ライセンス版であるOpenSearchにダッシュボード機能がついているので、それを活用してみる。
AWSでもマネージドのOpenSearchがあるが、コストがややかかるので一旦ローカルのDockerで動かしてみる。
全体の流れ
以下の流れで進める
- ダミーデータのJSONを作成
- Docker(docker compose)ベースで、OpenSearchのサーバーと、OpenSearch Dashboardsの起動
- ローカルからJSONデータをパースして、OpenSearchに登録
- OpenSearch Dashboardsでダッシュボードの作成
ダミーデータのJSONを作成
10個商品があり、日次にランダムの売上が発生する例を想定する。PythonでJSONを作成する。
冒頭に出現したようなデータが出てくる。サンプルデータ
OpenSearchのサーバーと、OpenSearch DashboardをDockerから起動
カレントディレクトリにdocker-compose.yaml
を作成する。OpenSearchのパスワードは結構面倒くさいので、今説明のためにyamlに初期パスワードを直書きしているが、本番用では環境変数を使うなど、もっとセキュアなやり方でやるように。
最新のOpenSearchのバージョンはDocker Hubから確認できる。これはOpenSearchのオフィシャルなリポジトリ。opensearchproject/opensearch:latest
が最新のバージョンのエイリアス。
バックグラウンドでコンテナを起動する。今回はWSL2で確認している。
後述の理由により、OpenSearchの起動に失敗していることがあるので、docker compose ps
で起動に成功しているか確認する。以下のように、OpenSearchとDashboardのコンテナの両方のStatusが「running」になっていればOK。起動に失敗した場合は、Dashboardだけがrunningになっている。
ハマりどころ1:初期パスワードは強固にしなければならない
OpenSearchの起動に失敗する原因に、初期パスワードのセキュリティがある。OpenSearchの初期設定はかなりセキュリティが厳しめになっているので、「ユーザー名admin、パスワードadmin」のような、ふざけたセキュリティ設定だと弾かれて、OpenSearchが終了してしまう。
強制終了の原因を特定したい場合は、docker compose logs opensearch
で可能。
強制終了されたときのログメッセージは、以下の通りであったため、大文字小文字を含み8文字以上で、特殊記号を含むパスワードでなければいけなかった。
Please re-try with a minimum 8 character password and must contain at least one uppercase letter, one lowercase letter, one digit, and one special character that is strong.
ハマりどころ2:localhostなのにHTTPSで通信しないといけない
OpenSearchのサーバーではデフォルトでSSLが有効化されていて、localhostでの通信であってもHTTPSで通信しないといけない。もちろんlocalhostだとSSLの自己署名のエラーが出てしまうのだが、それでもOKである。
影響があるのは、docker-compose.yaml
のopensearch-dashboards
の環境変数で、サーバーのURLをHTTPSで定義する。
難しいのは、サーバではSSLが有効化されているのに、Dashboards側ではSSLが有効化されていない点。Pythonからデータを送るときはHTTPSで送って、ブラウザからダッシュボードを見るときはHTTPという、なんとも不思議なことをする必要がある。
OpenSearchの起動確認(オプション)
ブラウザからOpenSearchが起動していることを確認してみる。https://127.0.0.1:9200/
にアクセスする。SEC_ERROR_UNKNOWN_ISSUER
のエラーが出るが、ローカルホストだと仕様なのでそのまま進める。
ログイン画面が出てくるので、ログイン。
以下のようなJSONが出てくれば起動確認は成功。
インデックスの登録
以下は、OpenSearchが正常に起動していることが前提とする。先ほど作成したダミーのJSONのファイル名をsample_data/sales_data_november_2024.json
として保存。その上で、インデックスの作成とデータの登録を以下のコードで行う。
ダッシュボードの起動とインデックスの確認
OpenSearch Dashboardにアクセスする。以下のURLで、HTTPで接続をする。
ログイン画面でログインを行う。その後、チュートリアルが出てくるがスキップする。「テナントどうしますか?」みたいな質問もとりあえずスキップ。ホーム画面が出てくる。
先ほど登録したデータが格納できているかどうか確認する。左上に「三」のトグルボタンを押す。「Management→Index Management」で「Indexes」を選択。先ほど登録した「sales-data」が入っている。
(思いっきり「Kibana」って名前のインデックスができてるから本当にKibanaのフォークなんですね。AWSの公式ページでも堂々とリネームしましたって書いてあるし)
Index Patternの作成
初回だけIndex Patternを作成する必要がある。ホーム画面から、「OpenSearch Dashboards」→「Dahsboards」(2回目以降は、「Management」→「Dashboards Management」)。「Index patterns」から「Create index pattern」。
「Define an index pattern」では「sales-data」を入力
Time fieldは「date」を選択。
以下のようにカラムが展開される。
ダッシュボードの作成
Visualizationの新規作成
ホーム画面に戻る。「OpenSearch Dashboards」から「Dashboards」。「Create new dashboard」。「Create new」を選択。
「Line」を選択。
「sales-data」をSourceとして選択。
X軸の作成
右下のBucketsを「Add」し、「X-axis」を選択
- Aggregation:
Date Histogram
- Field :
date
- Minimum interval:
Day
- Custom label:
日付
Y軸の作成
右上の「Metrics」から「Y-axis」を選択
- Aggregation:
Sum
- Field:
unitsSold
- Custom label:
売上合計
これだけだと直近15分でデータがおそらくないので、右上の時間軸を選択し、データのある期間(2024/11/1~2024/12/1)を選択。「Update」をクリック。
グラフが描画される。これは全アイテムの合計。
商品別の推移の表示
やりたいことは商品別の売上推移のプロットなので、「Split Series」を追加する。「Buckets」から。
- Subaggregation:
Terms
- Field:
productId
- Order by:
Metric 売上合計
売上ソートしなくても、商品のアルファベット順にすることも可能。Order byをAlphabetにし、OrderをAscendingにするとP001、P002…
といった並び順になる。
以下のようなグラフが出てくる。これが欲しかった結果。右上の「Save」をクリック。
Visualizationの保存
Visualizationに名前をつけて保存。名前はここでは「Product sales by items」とした。
作成したグラフが追加された。この後別のグラフを追加することもでき、これらを複数追加してダッシュボードを作っていく。
ダッシュボードの画面の「Save」で同様に保存し、「My First Dashboard」とした。右上の「Share」からダッシュボードのリンクを取得でき、ダッシュボードを保存した場合は、以下のようなURLになっている。
http://127.0.0.1:5601/app/dashboards?security_tenant=private#/view/c58c6e10-b731-11ef-ad36-8b5132491b03?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:’2024-10-31T15:00:00.000Z’,to:’2024-11-30T15:00:00.000Z’))&_a=(description:”,filters:!(),fullScreenMode:!f,options:(hidePanelTitles:!f,useMargins:!t),query:(language:kuery,query:”),timeRestore:!f,title:’My%20First%20Dashboard’,viewMode:view)
今回はローカルホストからなのでそこまで問題ないが、デプロイした場合はこれを通じて共有するのだろう。
まとめ
- この例を通じてOpenSearchとOpenSearch Dashboardをローカルから扱うことができた。
- OpenSearchのとっつきにくさは非常にあるが、動的なダッシュボードが実質無料でできるのは強い。AWSのマネージドのダッシュボード(QuickSightやGrafana)などどうしてもID単位の課金が発生してしまうので、これを無視できるのはなかなか強い。
- 閲覧のたびにログイン発生するのが少し面倒だけど、ダッシュボードをPublishできれば完璧
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー