Top View


Author Choi Jiho

スピーディーにIoTの見える化します!

2023/06/26

Table of Contents

きっかけ

IoTチームのjihoです。IoTチームの技術時間で「Grafanaを利用した可視化」について取り組みました。過去の打ち合わせを振り返ると「統計表は数字だから、お客様が読んで理解していただく時間が必要か...グラフがあったらもっと伝わるな...」と感じたことがあります。そこで早く見える化できる方法としてGrafanaに注目し「仮想の提案」を作り記事を書くことになりました。

提案

  • Amazon Lightsailの中にDocker Composeを用いてGrafana、InfluxDB、PostgreSQLを立ち上げる戦略です。

    • 使うものはAmazon Lightsail、Grafana、InfluxDB、PostgreSQL、Docker、Docker Composeです。
  • 「仮想のシナリオ」で「IoTの見える化」を説明したいと思います

仮想のシナリオ

  • Fusicが仮想の港湾運営会社さんに新システム提案する状況だと仮定します。

  • https://www.e-stat.go.jp/dbview?sid=0003130682 のCSVをダウンロードしてデータ分析と前処理を行います。

  • 「500総トン以上の大きな船」と「5総トン以上の小さい船」の年間の通った隻数をInfluxDBに保存し、Grafanaでグラフにします。また、PostgreSQLの方も「年間の博多港の貿易取引金額」を食品や工業製品などジャンルごとに保存し、Grafanaでグラフに出します

  • その上で「大きい船が増えてるね/減ってるね」「小さい船が最近増えてるのに取引金額は増えてるね」といった情報が見えてきます。それを港湾運営会社さんとの打ち合わせで見せながら説明することで、現状の課題の改善や、新たに改善したいものなどが見えたらいいと思います。

    • 文字ベースの資料よりは分かり安くて打ち合わせがスムーズになると思います

メリット

  • Grafanaは数字をグラフにしてくれます。当然文字より分かりやすくなります。
  • InfluxDBはCSVをアップロードしてwriteすることも可能ですし、APIでwriteすることも可能です。
  • 構築が簡単です。Amazon LightsailはAWSコンソール上で数回のポチポチで構築できますし、Docker Composeも一枚のymlだけあればdocker compose upで起動完了できるからです。

デメリット

  • Amazon Lightsail、Grafana、InfluxDB、PostgreSQL、Docker、Docker Composeの学習が必要です
  • Grafanaでどんなグラフが分かりやすいか悩む必要があります
  • InfluxDB、PostgreSQLにwriteできるようにデータ前処理が必要な場合があります
  • 今回調べてわかったのがInfluxDBのバージョンの違いです。v1->v2は用語やコマンドがドラスティックに変わっています。違うことを知った上で調べないと情報がごちゃ混ぜになりました。
  • InfluxDBのクエリ発行は、データの見せ方に合わせた取得方法に学習が必要です。SQLのようで違う構文なので今回は簡単なクエリのみ使用しました。

構築手順

Amazon Lightsail作る

ポチポチ簡単に作れます!

  • AWS consoleにログイン

  • Lightsailを検索してクリック

  • create instanceクリックする

    • Select a platform : Linux/Unix
    • Select a blueprint : OS Only, amazon linux2
    • Choose your instance plan : 3.5$を選ぶ

  • createした後はNetworkを設定

    • IPv4 Firewallを : ip制限かけます。指定したIPだけinfluxdbとgrafanaのUIにアクセスさせるためです。

dockerとdocker composeを用意

docker-compose.yml
version: '3.5'

# docker-compose up --build
services:
  influxdb:
    image: influxdb:2.6.1
    container_name: 'iot_influxdb'
    platform: linux/x86_64
    environment:
      INFLUXDB_HTTP_AUTH_ENABLED: "true"
    ports:
      - 8086:8086
    volumes:
      - influxdb_data:/var/lib/influxdb

  grafana:
    image: grafana/grafana:9.3.6
    container_name: 'iot_grafana'
    platform: linux/x86_64
    environment:
      GF_SERVER_HTTP_PORT: 3002
    ports:
      - 3002:3002
    depends_on:
      - influxdb
    volumes:
      - grafana_data:/var/lib/grafana

  postgres:
    image: postgres:14-alpine
    container_name: "iot_postgres"
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      TZ: Asia/Tokyo
    volumes:
      - postgres_data:/var/lib/postgres

volumes:
  influxdb_data:
  grafana_data:
  postgres_data:
dockerとdocker composeをインストール

Lightsailの/home/ec2-userで実行しました

$ sudo amazon-linux-extras install -y docker
$ sudo usermod -aG docker $(whoami)
$ newgrp docker
$ sudo systemctl enable docker.service
$ sudo systemctl start docker.service
$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
$ mkdir .docker
$ cd .docker/
$ mkdir cli-plugins
$ curl -SL "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o $DOCKER_CONFIG/cli-plugins/docker-compose
$ sudo chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
docker composeファイル配置
  • Lightsailの/home/ec2-userで実行しました
  • workspaceディレクトリを作りました
$ mkdir workspace
  • 手元で用意したdocker-compose.ymlをアップロードします

    • scp -i ssh鍵が/あるディレクトリ/鍵名.pem docker-compose.ymlがあるディレクトリ/docker-compose.yml ec2-user@192.192.192.192:/home/ec2-user/workspace

docker compose up!

Lightsailの/home/ec2-user/workspaceで実行しました

$ docker compose up

InfluxDBにCSVをアップロードする

初期設定

  • GET STARTEDをクリック

  • 情報入力します。OrganizationとBucket Nameをメモします。Grafanaで必要です。

  • CONFIGURE LATERをクリック

  • API Tokensをクリック

  • 歯車をクリックし、Cloneをクリックします。 安全なところにメモapi tokenをメモします Grafanaで必要です。

CSVアップロード

  • LOAD YOUR DATAをクリック

  • Flux Annotated CSVをクリック

  • CSVをアップロードします。

  • 使用したCSVの中身です。
#group,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE
#datatype,string,long,dateTime:RFC3339,double,string,string
#default,,,,,,
,result,table,_time,_value,_field,_measurement
,_result,0,2012-01-01T00:00:00Z,6424,5総トン以上,sum2
,_result,0,2013-01-01T00:00:00Z,6085,5総トン以上,sum2
,_result,0,2014-01-01T00:00:00Z,5840,5総トン以上,sum2
,_result,0,2015-01-01T00:00:00Z,4158,5総トン以上,sum2
,_result,0,2016-01-01T00:00:00Z,4589,5総トン以上,sum2
,_result,0,2017-01-01T00:00:00Z,4707,5総トン以上,sum2
  • 成功するとData Written Successfullyが見えます

GrafanaをInfluxDBとつなげる

  • PostgreSQLはInfluxDB他にも連携できることをお見せするための追加的なものですので、Grafanaと繋げる部分の詳細説明はしていません。
  • Data Sourcesをクリック

  • Add data sourceをクリック

  • InfluxDBをクリック

  • 赤枠通り入力します

    • URLは iot_influxdb:8086 でお願いします

  • 成功するとDatasource updatedが表示されます

Grafana でダッシュボードを作成する

  • New dashboard をクリック

  • Add a new panel をクリック、一つのパネルに一つのグラフを配置する

  • 表示したいデータソースを選択し、グラフを作成する

    • クエリが成功するとグラフが自動で表示されるので、見た目の調整を右側のパネルで行います
    • グラフの種類や、表示期間なども調整可能です
  from(bucket:"my_database")
  |> range(start:2012-01-01T00:00:00Z)
  |> filter(fn: (r) => r._measurement == "sum2")

  • 色々なグラフを組み合わせた結果

Choi Jiho

Choi Jiho

Company : Fusic CO., LTD Program Language : PHP, Go, Ruby