どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

ElasticSearchとFlaskを連結させる

結構前にElasticSearchをちょっとだけ勉強していました。

nogawanogawa.hatenablog.com

とりあえず動けばよかったんですが、今回はもうちょっと勉強してみます。

今回つくるもののイメージ

f:id:nogawanogawa:20190430152750j:plain:w500

ただのイメージです。

環境準備

毎度のことながらDockerで環境を用意します。 ElasticSearchとKibanaはほとんどセットみたいなもんなんで、一緒に作ってみます。

まずディレクトリはこんな感じですかね。

.
├── data
├── docker-compose.yml
├── env
│   └── elasticsearch
│       └── Dockerfile
└── microservice
    ├── Dockerfile
    ├── instance
    ├── microservice
    │   ├── __init__.py
    │   └── myapp.py
    ├── setup.py
    └── test
        ├── conftest.py
        └── test_factory.py

DockerfileはElasticSearchとFlaskでこんな感じにしました。

ElasticSearch

Flask

docker-compose.yml

ここまでは前回とほとんどいっしょですね。

ドキュメントストアに関するマイクロサービス

Pythonからつなぐ

今回はPythonで文書を成形して登録していきます。

まずは、ElasticSearchへの登録を考えます。

この前やってた感じでは、こんな感じでElasticSearchに登録できるようです。

f:id:nogawanogawa:20190430150919p:plain

ちゃんと登録されてますね。

Flaskを使ったエンドポイント接続

Flaskを使ってエンドポイントを定義してリクエストを受け付けるようにします。 今回はお上品な方のFlaskの書き方でやってみます。

まず、ファクトリ関数を作ります。

ここでエンドポイントはこんな感じにしています。

  • /myapp/search
  • /myapp/register

まずはこれだけこれだけ動かしてみます。

microservice $flask run
 * Serving Flask app "microservice" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 273-900-170

この状態でエンドポイントにアクセスしてみます。

~ $curl localhost:5000/myapp/register/
register
~ $curl localhost:5000/myapp/search/
search

まずは期待通りの応答が返ってきています。

次に、ElasticSearchにアクセスするように書き換えます。 先ほどのファクトリ関数をいじります。

これで連携できました。 また動かしてみます。

flask run

試しに検索してみます。

$curl localhost:5000/myapp/search/
{"_shards":{"failed":0,"skipped":0,"successful":5,"total":5},"hits":{"hits":[{"_id":"qmPYbGoBESqVGIVWwFuJ","_index":"sample","_score":1.0,"_source":{"contents":"contents","title":"title"},"_type":"sample"},{"_id":"q2PZbGoBESqVGIVWDFuo","_index":"sample","_score":1.0,"_source":{"contents":"contents","title":"title"},"_type":"sample"}],"max_score":1.0,"total":2},"timed_out":false,"took":8}

ちゃんとFlask側から中身を取得できました。

テストも書いてみる

せっかくテスト駆動開発の勉強をしたことですし、練習でテストもちゃんと書いてみます。 本来なら先にテストを書くのが普通ですが、そのへんはご愛嬌ということで。。。

テスト観点としては、

  • search
    • 検索が成功すること
    • 検索結果がjsonで取得できること
  • register
    • POSTメソッドによってインデックスできること
    • POSTメソッドのパラメータがインデックスされること

テストコードとしてはとりあえずこんな感じでしょうか。

できたもの

今回作ったものはこちらに置いておきます。

github.com

感想

そもそも論で、今回やったことはElasticSearch自体がREST APIで接続できるので、あまり意味はありません。笑

単純にマイクロサービスの勉強として、それを適当につないでみました。 あとは、DBの共有はやめろとマイクロサービスアーキテクチャの本に書いてあったので、こういうのが必要になってくるでしょうね。

nogawanogawa.hatenablog.com

ElasticSearchに接続するマイクロサービスを使って、ElasticSearchに関して復習してみました。 次は、Logstashの勉強してみます。