0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

簡単なパスワード保護付き検索サービスを5分で立ち上げる

Last updated at Posted at 2020-09-28

TL;DR (経験者向けまとめ)

下記のコンテナをまとめたdocker-compose.yml を作りました:

  • Elasticsearch: 検索エンジン
  • Kibana: 簡単な検索画面
  • nginx: リバースプロキシ(ID/PWによる軽いユーザー認証)
  • Python3: データを加工したりインデックスしたりする作業用

背景

みなさんのご家庭にあるテキストデータをちょっと検索してみたくなることってありますよね?

検索の機能自体はElasticsearchで提供できるのですが

  • Non programmerでも使えるように、簡単な検索画面が欲しい(Kibana)
  • 秘密のデータなのでパスワード認証かけたい(nginxによるベーシック認証)
  • 手軽にデータを追加できるようにしたい

・・・といった要求も一緒に上がってくることが多いです。

以上の要求をかなえるための環境を作りました。1

作ったもの

このリポジトリに全部載せてあります: https://github.com/chopstickexe/es-kibana-nginx-python

主な内容は下記の通りです:

  • docker-compose.yml: Elasticsearch, Kibana, nginx, Python3の4つのコンテナをまとめて立ち上げて連携させるための設定ファイル
  • index.py: Python3コンテナの中でElasticsearchへのデータの登録(インデキシング)を行うためのサンプルコード
  • data/sample.csv: index.pyで登録しているサンプルデータ(ご覧の通り、ノーラン監督作品の個人的な感想文4件です)

Docker Compose概要

このdocker-composeを使うと、下記のような環境が立ち上がります:
IMG_0028.jpg

  • Elasticsearch, Kibana, nginx, Pythonの4つのコンテナが立ち上がるが、ホストにポートがマップされている(ホスト外からHTTPアクセス可能な)コンテナはnginxだけ。そのため、ElasticsearchやKibanaにはnginxで設定したID/PWを知ってる人しかアクセスできない
  • Elasticsearchのインデックスデータはホストのどこかのディレクトリに保存される(local volume)。そのため、コンテナを終了・再起動しても、また同じインデックスにアクセスできる。
  • http://ホストアドレス のような簡単なアドレスでKibanaにアクセス可能。
  • Pythonコンテナにソースコードやデータをマウントしているため、docker exec でこのコンテナに入って、データの加工やインデキシングを行うPythonコードを実行することが可能。2

動かし方

以下、Ubuntu18.04を前提として説明しますが、docker-composeやApache HTTPサーバー(より具体的にはhtpasswdコマンド)が動く環境であれば、CentOSやMac, Windowsでも動くと思います。

事前準備1. docker-composeのインストール

まず、docker-composeがインストールされた環境を用意します。参考

事前準備2. Apache HTTPサーバーのインストール

まず、apache2-utils(HTTPサーバーが入っているパッケージ)をインストールします。

$ sudo apt -y install apache2-utils

CentOSの場合は httpd-tools をインストールすれば、後述する htpasswd コマンドは利用できます。

1. Gitリポジトリのclone

上記リポジトリchopstickexe/es-kibana-nginx-pythonをcloneします。

2. ログインID・パスワードの準備

そして、この後立ち上げるKibana(検索画面)にログインするためのIDとパスワードを何か考えます。
(以下の例ではID=adminでログインします)

htpasswdコマンドを以下のように実行し、パスワードを設定したファイル (cloneしたディレクトリ)/htpasswd/localhostを作成してください。

$ cd /path/to/repo
$ mkdir htpasswd && cd htpasswd
$ htpasswd -c localhost admin 
# ここにパスワードを入力

※ このファイル名(localhost)はdocker-compose.ymlのKibanaコンテナに設定した環境変数VIRTUAL_HOSTと同じ文字列にする必要があります。詳しくはjwilder/nginx-proxyのREADMEを見てください。

3. (オプショナル) docker-compose.ymlの編集

Kibanaにホスト以外のマシンからWebブラウザ経由でアクセスしたい場合

cloneしてきたディレクトリのdocker-compose.ymlを開き、KibanaコンテナのVIRTUAL_HOSTの設定値localhostからホストのIPアドレスか、またはfoo.bar.comのようなFQDNに変更してください。

すでにホストの80番ポートで別のサービスが立ち上がっている場合

nginxコンテナのポートマッピング80:80 から ホストの空いているポート:80 に変更してください。

4. Dockerコンテナの起動

下記のdocker-composeコマンドでコンテナを起動します。

$ cd /path/to/this/directory
$ docker-compose up

5. WebブラウザからKibanaにアクセスできることを確認

docker-compose.ymlを変更していない場合はホストのブラウザからhttp://localhost
変更した場合はお手元の環境のブラウザからhttp://ホストアドレスを開き、設定したIDとパスワードでログインして、Kibanaの画面が見えることを確認してください。

6. Elasticsearchにサンプルデータ登録

ホストマシンのターミナルに戻り、下記のコマンドでPythonコンテナに入ってください:

$ docker exec -it python bash

Pythonコンテナに入ったあとは、下記のコマンドで仮想環境(venv)を作り、そこに必要パッケージをpip installします:

# python -m venv .venv
# source .venv/bin/activate
(.venv) # pip install -r requirements.txt

パッケージのインストールが終わったら、下記のコマンドでサンプルデータをElasticsearchのnolanインデックスに登録してください:

(.venv) # python index.py
Finished indexing

ここで実行しているPythonスクリプトindex.pyはこちらです。
下記でRELEASE_DATEという列のデータ型をdate(日付型)、フォーマットをyyyyMMddに設定しています。


    es.indices.create(
        index,
        body={
            "mappings": {
                "properties": {"RELEASE_DATE": {"type": "date", "format": "yyyyMMdd"}}
            }
        },
    )

7. Kibana上で検索できることを確認

Webブラウザから再びKibanaにアクセスし、下記を設定する:

Index Patternを作成

画面左側のメニュー(表示されていない場合は左上の三をクリック)
から Kibana > Index Patterns を選択し、index pattern nameに nolan を入力する。上記のPythonコードが問題なく実行できていれば Your index pattern matches 1 source というメッセージが出るのでNext stepをクリック:

Screenshot from 2020-09-28 09-20-29.png

Time fieldにRELEASE_DATE列を設定し、Create index patternをクリックする。

Screenshot from 2020-09-28 09-20-45.png

Discover画面上でTime rangeを~11 years ago -> nowに設定

画面左側のメニューからDiscoverを選択し、画面中程のカレンダーアイコンをクリックして、Time rangeをRelative > 11 years agoに設定する。
(結構古いRELEASE_DATEのレビューが入っているので、このようにしないと検索にヒットしません)

正しく設定できると、以下のように4件のレビューが表示されます:

Screenshot from 2020-09-28 09-18-20.png

このDiscover画面上から「トム・ハーディ」を含むレビューを検索することも可能です:

Screenshot from 2020-09-28 09-18-48.png

参考資料

kibanaの使い方はこちらも参考にしてください: https://qiita.com/namutaka/items/b67290e75cbd74cd9a2f

  1. ベーシック認証はもしかしたらElasticsearch Securityを使うと、もう少し気の利いたものができるのかもしれません。また、本記事で紹介する方法はhttp接続を利用していて、セキュリティ的にはガバガバなのでこちらの記事を参考にhttps化することもご検討ください: https://qiita.com/hsano/items/3b4fb372c4dec0cabc08

  2. また、例えばVSCodeのRemote Containers extensionを利用してコンテナに接続し、コードを編集・実行することも可能。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?