konchangakita

KPS IoT(旧Xi IoT)を一番楽しんでるブログ 会社の看板を背負いません 転載はご自由にどうぞ

【Nutanix UUIDエクスプローラーを作ってみよう】REST API 結果を Elasticsearch へ

<【Nutanix Advent Calendar 2021】 6日目の記事です!>
Nutanix Advent Calendar 2021 - Adventar


【UUIDエクスプローラーを作ってみよう】シリーズ
REST APIしてみる

今回は

REST API → Elasticsearch でなんとなくインテリジェントな検索GUIを体験することが目的

f:id:konchangakita:20211204125255p:plain


なんで、Elasticsearch?

特に深い理由はなく、過去にさわったことあるのでDB感覚で使って、Kibanaで検索をGUIで体験していきます


Elasticsearch コンテナの準備

REST API で Nutanixクラスタから VMリストを取得できたので、Elasticsearch に必要な情報だけを色々と検索して取り出しやすくしてみたいと思います


まずは、Elasticsearch と Kibana を Dockerコンテナで準備
Elasticsearch の Dockerhub を眺めてみて、新しそうな、7.14.2 を使用してみます

python環境分も含めて「docker-compose」してみます

まずは、Python環境用のDockerコンテナを再作成
Elasticsearchモジュールを追加します
dockerfile

FROM python:3.9.9-slim

RUN apt update -y
RUN apt install -y curl
RUN pip install -U pip
RUN pip install jupyterlab
RUN pip install elasticsearch

#RUN apt install -y netcat
WORKDIR /home

# execute jpyterlab
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root", "--LabApp.token=''"]

それから、Elasticsearch と Kibana も含めて
docker-compose

version: '3.7'
services:
  es01:
    image: elasticsearch:7.14.2
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
    ports:
      - 9200:9200
      - 9300:9300
    volumes:
    - ./elastic/es-data:/usr/share/elasticsearch/data:z
    networks:
      - elastic

  kibana:
    image: kibana:7.14.2
    container_name: kibana
    ports:
      - 5601:5601
    networks:
      - elastic

  python:
    build:
      context: ./python
      dockerfile: Dockerfile
    container_name: python
    ports:
      - 1234:8888
      - 5678:5000
    volumes:
    - ./python/app:/home/app:z
    networks:
      - elastic

networks:
  elastic:
    driver: bridge

Elasticsearchのデータをローカルに貯める用のマウントをつくっておく
→ elasic/es-data

現在のディレクトリ構造

.
├── docker-compose.yml
├── elastic
│       └── es-data
└── python
        ├── app
        │       ├── api-elastic.ipynb
        └── dockerfile


からの、コンテナ起動
ここまでで Elasticsearch / Kibana の下準備完了


Python から Elasticsearch へ

ここから Pythonコンテナ環境から で Elasticsearch へデータ転送部分を作成

Elasticsearchへの接続テスト

コンテナ環境なので、Elasticsearch へのホスト指定は「elasticsearch:9200」でOK
Elasticsearch内のインデックス情報が取得できます

from elasticsearch import Elasticsearch

es = Elasticsearch('elasticsearch:9200')

indices = es.cat.indices(index='*', h='index').splitlines()

# index一覧を表示
indices

f:id:konchangakita:20211202230019p:plain

インデックスの作成
# 現状の index確認にして、存在してなければ作成
index_name = 'vm_list'
if index_name not in indices:
    es.indices.create(index=index_name)


VMリストを投入

前回の記事で取得できていた REST APIの結果を格納した変数「response」を
VMごと(Entity)にとりだして、Elasticsearch の 1ドキュメントとして投入します
VMが10個なら10レコードできるイメージ)

from elasticsearch import helpers
from datetime import datetime
import json

# REST API結果を分解
res_vm = response.json()

# クラスタ名取得
cluster_name = res_vms['entities'][0]['spec']['cluster_reference']['name']

# 時間も一緒に投入
timestamp = datetime.utcnow()

# REST API取得結果から entitiesだけを抜き出して、配列で格納
# VMごとの _docになり検索しやすい
actions = []
for entity in res_vms['entities']:
    entity['timestamp'] = timestamp
    entity['cluster_name'] = cluster_name
    actions.append({'_index':index_name, '_source':entity}) 

# Elastcisearchへ投入 ※Waringは無視してOK
reaction = helpers.bulk(es, actions)

ここまでエラーなく進めば、うまいこといってるはずです
Elasticsearch から返り値と、投入したVM数を表示して確認

# 投入したVM数を表示
reaction, len(actions)

f:id:konchangakita:20211203000235p:plain


Kibana で可視化

ここからは Kibana を使って、可視化してみます

localhost:5601」へブラウザでアクセス
f:id:konchangakita:20211203000332p:plain

Python で作成したインデックスを確認
vm_list」のインデックスが作られてたら開始します
f:id:konchangakita:20211203000501p:plain

Index Patternsをとにかく作成
f:id:konchangakita:20211203000630p:plain
f:id:konchangakita:20211203000732p:plain:w200f:id:konchangakita:20211203000746p:plain:w200


≡メニューから Discover を確認して、なんらかデータはいってれば、Kibana の準備は完了です 
f:id:konchangakita:20211203000856p:plain


「spec.name」と「metadata.uuid」を Add field as column してやることで、表示 VM名と uuid のシンプルな表示にしてやることができます
f:id:konchangakita:20211203001450p:plain

これで、Kibana上で VM名 と uuid だけが表示されるので
f:id:konchangakita:20211203001657p:plain


VM名 とかで検索したらサクッと uuid が判明します
f:id:konchangakita:20211204131403p:plain


と、まぁこれだけだとたんなる Elasticsearch 講座に進んでしまいそうなので、ElasticsearchをDBのように使いつつ、ここからオリジナルGUIを自作していきたいと思います
次回は、Flask編につづく!