netatomのstationデータをAWS Elasticsearch Serverへ流し、そのデータ描画をする

## この記事は何？

前の記事の続きとなります。
netatmoのデータ取得ができたので、このデータを使ってAWS Elasticsearch Serverでデータ取得から描画まで行います。

https://qiita.com/hiroyuki_kawahara/items/abb25e90f024cbece732

## AWS Elasticsearch Serviceとは？

概要だけつまむと、データレイクのElasticsearchと可視化BIツールのkibanaが合体したサービス。各サービスの結合と必要な設定を担当してくれます。

https://aws.amazon.com/jp/elasticsearch-service/


## AWS Elasticsearch Serviceの環境構築

AWS Elasticsearch Serviceの新規環境構築していきます。
![スクリーンショット 2021-08-16 14.01.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/214b3fec-7939-8fef-fd0c-e954b77bdf02.png)
AWSコンソールを開きElasticsearch Serviceから新しいドメイン作成から環境構築します。
![スクリーンショット 2021-08-16 18.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/b0b5671f-dc11-087b-ec1c-5b10dbf76c82.png)

途中の設定のうち今回は動くことを目標とするため、デフォルトから２つ設定を変更します。
１つがネットワーク構築です。これをパブリックアクセスとすることでどこからでもアクセスが可能と変更します。
このままだとどこからでもアクセスし放題のため、次でアクセス制限をかけます。
![スクリーンショット 2021-08-16 18.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/1173d845-13c2-a39f-d08e-a6d46f612253.png)
２つ目のアクセス制限です。アクセスポリシーからCIDR表記でアクセス制限をかけます。
![スクリーンショット 2021-08-16 18.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/85be2475-bb80-9554-f139-660f7cd6e7c0.png)

これから最後まで設定して、最終的に新しくドメインを取得することができ、elasticsearchとkibanaの環境が得られました。

![スクリーンショット 2021-08-16 18.36.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/a2740635-d016-8a8a-a58c-9556a21ec93c.png)

## Elasticsearchにデータを挿入する

前章で取得したnetatmoのアクセストークンを使ってデータをkibanaに流し込みます。
この時ポイントは２つあり、netatmoのデータを加工しElasticsearchが時系列として扱えるよう日付データを追加し、kibanaのエンドポイントを都度変更しデータの上書きをしないようにしています。

時系列データを扱うため、このプログラムをlambdaで定期実行にしたり、cronで定期実行にしたりして時系列として扱えるようにします。

```python
import datetime
import json
import requests
from requests.auth import HTTPBasicAuth


def get_date_suffix():
    now = datetime.datetime.now()
    return now.strftime('%Y%m%d%H%M%S')


def get_station_data():
    netatmo_headers = {'Content-Type': 'application/x-www-form-urlencoded', 'charset': 'UTF-8'}
    netatmo_url = 'https://api.netatmo.com/api/getstationsdata'
    netatmo_data = {
        'access_token': 'アクセストークン'
    }

    resp = requests.post(url=netatmo_url, headers=netatmo_headers, data=netatmo_data)
    json_data = json.loads(resp.text)

    # netatmoのデータがタイムスタンプ形式から、Elasticsearchで扱える形である「yyyy/mm/dd hh:mm:ss」へと変換し、カラムを追加する。
    unix_time = datetime.datetime.fromtimestamp(json_data['body']['devices'][0]['dashboard_data']['time_utc'])
    json_data['body']['devices'][0]['dashboard_data']['@timestamp'] = unix_time.strftime("%Y/%m/%d %H:%M:%S")

    resp_data = json.dumps(json_data)
    return resp_data

# エンドポイントを上書きしないように、リクエストのたびにURIの末尾を変更している
url = 'AWS Elasticsearch Service記載のエンドポイント' + '/trg/_doc/trg-kawahara' + get_date_suffix()
headers = {
    'Content-Type': 'application/json'
}
data = get_station_data()
auth = HTTPBasicAuth('kibanaのユーザーID', 'kibanaのパスワード')

basic_auth_req = requests.post(url=url, headers=headers, data=data, auth=auth)
print(basic_auth_req.text)
```

レスポンスは下のようにsuccessfulが帰ってきます。

```json
{
  "_index": "trg",
  "_type": "_doc",
  "_id": "trg-kawahara20210816192617",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}
```

## kibanaでのデータ操作：データにindexをはる

kibanaの画面からはStack Managementでデータ操作をします。

![スクリーンショット 2021-08-16 18.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/b612721b-f93c-5dca-f44d-8d882c65d576.png)

Stack ManagmentからCreateincex patternから投入データのindexを貼り、このindexを貼ったデータを使ってplotしてくことになります。
そのためまずindexを作ります。

![スクリーンショット 2021-08-16 18.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/ee2d2a28-077a-fe34-640d-05b65b04d2f0.png)

注目点はConfigure settingsで先ほどpythonで書いた日付データが時系列データとして出てくることです。

![スクリーンショット 2021-08-16 19.35.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/0c58a4bc-8dde-9aac-90bc-adac78073829.png)

これでデータにindexがはれたので、次は描画する部分を作ります。

## kibanaでのデータ操作：描画する

データの準備ができたため、あとはデータから描画するところを作ります。
kibanaでは描画する機能をDashboardといい、Dashboardを操作して描画するものを作ります。

![スクリーンショット 2021-08-17 9.22.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/07ca7a08-ec1b-476d-fb47-1b53bc5fc43b.png)

Create newから新しい図を作成します。

![スクリーンショット 2021-08-17 9.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/dbf4434f-107a-42c0-2e55-c89ab174de31.png)

今回は折れ線グラフを描画したいため、Lineを選択します。

![スクリーンショット 2021-08-17 9.46.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/d37aecf6-bd1b-0b5e-18da-fa245e1f2104.png)

選択するデータのメトリクスは下図のように、Y軸にCO2濃度を、X軸に時系列をとります。
設定するだけでは何も出ないため、設定を反映します。
図の設定が終わったら、Updateをクリックして設定を反映することで、描画することができます。

![スクリーンショット 2021-08-17 9.43.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/7e7e0318-bead-1ed9-c055-3c94298f93d2.png)

あとは保存をすることで、Dashboardに描画する図が完成します。

![スクリーンショット 2021-08-17 9.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/4c874cbc-6b08-3bc8-8435-041fdd413c0c.png)

これでデータ挿入からデータ操作、描画まで一連の動作が完了です。
あとはこれを自分の欲しい図に沿って設定値を変更していくことが必要になっていきます。