GAになったGCPのCloud IoT Coreでデータの受信から可視化まで一通りの流れを作るぞ！

## 祝！Cloud IoT Core正式リリース！
先日、GCPの[Cloud IoT Core](https://cloud.google.com/iot-core/)が[正式リリースされました](https://cloud-ja.googleblog.com/2018/02/the-thing-is-Cloud-IoT-Core-is-now-generally-available.html)！

ポジションとしては、AWSの[AWS IoT Core](https://aws.amazon.com/jp/iot-core/)や、Azureの[IoT Hub](https://azure.microsoft.com/ja-jp/services/iot-hub/)と同じようなところです。これでようやくGCPもIoTに本格参戦ですね！

ということで、今回はCloud IoT Coreにデータを送って可視化するところまで試してみました！

## Cloud IoT Coreって何ができるの？
イメージとしては、デバイスとCloud Pub/Subの橋渡し役でしょうか。
デバイス側のインターフェースを用意しつつ、デバイスから受け取ったデータをCloud Pub/Subに受け流してくれます。

### デバイス管理
- 証明書を管理し、データ受信時に認証を行なう
- デバイスを無効化する（通信をブロック）
- デバイスにメッセージを通知する

### プロトコルブリッジ
- デバイスからIoT CoreにMQTT, HTTPでデータを送ると、Pub/Subに流してくれる

## Quickstart
[Quickstart](https://cloud.google.com/iot/docs/quickstart)では、[MQTTのサンプルスクリプト](https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/iot/mqtt_example/cloudiot_mqtt_example_nodejs.js)からIoT Coreにデータを送り、Pub/Subに入るところまで説明してくれています。簡単にできるのでここでは説明しません。

ただ、Quickstartの結果はなんだか味気ないので、IoTらしく可視化までやってみようと思います。
(この時点でIoT Core関係なくなってるってのは言いっこなし！)

## DataStudioを目指す
[Cloud IoT CoreのLP](https://cloud.google.com/iot-core/?hl=ja)に、構成図があります。IoT Coreを起点としたIoTの標準的な構成のようです。
DataStudioを目指せばそれらしいのができるのではないか、ということでやってみました。
![_スクリーンショット 2018-03-26 23.32.09.png](https://qiita-image-store.s3.amazonaws.com/0/39565/d2b292fb-fd5b-c866-823a-1c8872424367.png)
(Quickstartの通りに設定している前提で話を進めます。)

### BigQueryのテーブルを作成
BigQueryのテーブルを作ります。
送るデータは、温度計を想定して以下のデータを含んでいることにします。

|データ名|カラム名|型|モード|
|:--|:--|:--|:--|
|シリアル番号|serial_number|STRING|REQUIRED|
|温度|temperature|FLOAT|NULLABLE|
|時間|time|TIMESTAMP|REQUIRED|

![_スクリーンショット 2018-03-26 23.38.58.png](https://qiita-image-store.s3.amazonaws.com/0/39565/26cef267-8081-aedd-7550-fb6fdb3915f2.png)

### Cloud DataflowでCloud Pub/SubとBigQueryを繋ぐ
なんとPub/SubからBigQueryにデータを送るためのテンプレートが既に用意されています。
必須なのは以下の項目です。

|項目名|値|
|:--|:--|
|ジョブ名|(なんでもいい)|
|Cloud Dataflow リージョン エンドポイント|us-central1|
|Cloud Dataflow テンプレート|PubSub to BigQuery|
|Cloud Pub/Sub input topic|projects/**[projectID]**/topics/**[topic]**|
|BigQuery output table|**[project]**:**[dataset]**.**[table_name]**|
|一時的なロケーション|gs://**[bucket_name]**/tmp|

![_スクリーンショット 2018-03-26 23.45.59.png](https://qiita-image-store.s3.amazonaws.com/0/39565/388e016d-78f2-4d50-eb44-1c3e2d12ee4d.png)

ジョブを実行すれば、よしなにやってくれます。
![_スクリーンショット 2018-03-27 0.07.03.png](https://qiita-image-store.s3.amazonaws.com/0/39565/b348011e-471a-f478-f4ff-e6a5ba946240.png)

BigQueryでデータが入っているか確認しましょう。
![_スクリーンショット 2018-03-27 0.05.39.png](https://qiita-image-store.s3.amazonaws.com/0/39565/e3f31e46-a7b4-ad3f-5ef6-6b66ece4811e.png)

### DataStudioでグラフを作る
新しいレポートを作成します。
![_スクリーンショット 2018-03-26 23.59.19.png](https://qiita-image-store.s3.amazonaws.com/0/39565/e3e47bca-9512-3ed1-81a5-68ded8cba8ca.png)

データソースを作成します。
![_スクリーンショット 2018-03-27 0.00.47.png](https://qiita-image-store.s3.amazonaws.com/0/39565/69b24cd1-9989-d4e6-7c61-5301304b6d32.png)

![_スクリーンショット 2018-03-27 0.01.58.png](https://qiita-image-store.s3.amazonaws.com/0/39565/06cd84d5-6c2e-fec0-e5ef-0f4342f1e1eb.png)

そしてグラフを追加すればグラフがでてきます！
ものすごく簡単ですね！！
![_スクリーンショット 2018-03-27 0.03.34.png](https://qiita-image-store.s3.amazonaws.com/0/39565/a68a7f7d-1ac9-f1bf-d57d-7d348205de71.png)

### ところがどっこい
プロットが日単位になっているのです。。
![_スクリーンショット 2018-03-27 0.09.17.png](https://qiita-image-store.s3.amazonaws.com/0/39565/bdba5ccf-a468-63ac-3de1-9fe89686da93.png)

いろいろ探してみましたが、どうやら現状では時間単位までしかできないようです。
DataStudioはBIツールの位置付けらしいですが、IoTだとせめて分単位でみたいですよね。。
![_スクリーンショット 2018-03-27 0.11.30.png](https://qiita-image-store.s3.amazonaws.com/0/39565/28fe9333-a491-f43a-fcf1-7408fd287d69.png)

## Kibanaを目指す
かくなる上は、Kibanaを目指そう！ということで、調べてみたらいい感じに行けそうな感じでした。
Pub/Sub -> [Logstash](https://www.elastic.co/jp/products/logstash) -> [Elasticsearch](https://www.elastic.co/jp/products/elasticsearch) -> [Kibana](https://www.elastic.co/jp/products/kibana)という経路です。
LogstashにはCloud Pub/Subからデータを取得する[プラグイン](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-google_pubsub.html)もあるので、至れり尽くせりです。
![_スクリーンショット 2018-03-27 0.22.04.png](https://qiita-image-store.s3.amazonaws.com/0/39565/764437fd-112e-78ac-8bae-85987ccd097c.png)

### Cloud Launcherから仮想マシンをデプロイ
Logstash/Elasticsearch/Kibana全部入りのやつがありました！これをデプロイします。
![_スクリーンショット 2018-03-27 0.40.36.png](https://qiita-image-store.s3.amazonaws.com/0/39565/e8777006-6159-107b-e13b-f2dbf33abe4c.png)

パラメーターは、全部デフォルトでも大丈夫です。
余談ですが、ケチってMachine Typeをg1-smallにするとLogstashを再起動できませんでした。。

### Cloud API アクセス スコープ
立ち上がったインスタンスでCloud Pub/SubのAPIが使えるようにします。
停止しないと編集できないので、一旦停止させてから編集します。編集が完了したら起動させましょう。
![_スクリーンショット 2018-03-27 10.34.21.png](https://qiita-image-store.s3.amazonaws.com/0/39565/55e6032d-918a-82f5-3de7-b1b9ff1e24f7.png)

### SSHログインして各種設定
できたインスタンスにSSHログインして、各種設定を行います。

最初にbitnamiの設定を読み込みます。

```
$ sudo /opt/bitnami/use_elk 
```

次に、LogstashのCloud Pub/Subプラグインをインストールしましょう。

```
$ sudo /opt/bitnami/logstash/bin/logstash-plugin install logstash-input-google_pubsub
Validating logstash-input-google_pubsub
Installing logstash-input-google_pubsub
Installation successful
```

インストールが完了したら、Logstashの設定を編集します。
topic, subscriptionの名前はCloud IoT CoreのQuickstart通りに勧めていれば、`my-device-events`, `my-subscription`になります。`projects/[project ID]/topics/`や`projects/[project ID]/subscriptions`の部分は不要です。
また、デフォルトだと受け付けるデータ量がかなり絞られているので、ガンガン送りたい場合は`max_messages`を調整しましょう。

```/opt/bitnami/logstash/conf/logstash.conf
input
{
    google_pubsub {
        project_id => "[project ID]"
        topic => "[topic]"
        subscription => "[subscription]"
        codec => "json"
        # max_messages => 5
    }
}

filter {
  fingerprint {
    source => "message"
    target => "generated_id"
    method => "UUID"
  }
}

output
{

    elasticsearch
    {
        hosts => ["127.0.0.1:9200"]
        document_id => "%{generated_id}"
        index => "logstash-%{+YYYY.MM.dd}"
    }
}
```

最後にLogstashを再起動すれば完了です。

```
$ sudo /opt/bitnami/ctlscript.sh restart logstash
Unmonitored logstash
/opt/bitnami/logstash/scripts/ctl.sh : logstash stopped
/opt/bitnami/logstash/scripts/ctl.sh : logstash started
Monitored logstash
```

### Kibanaの設定
Kibanaへのログイン情報は、Deployment Managerで確認できます。
`Admin URL`にアクセスして、ユーザー名、パスワードを入力してログインしましょう。

ログイン後は、インデックスパターンを作成します。
インデックスパターンを選択して、時刻を表すフィールドを指定すればOKです。
![_スクリーンショット 2018-03-27 10.48.21.png](https://qiita-image-store.s3.amazonaws.com/0/39565/33d1367b-cf6a-2a1a-4eeb-f20ee35e5c26.png)

![_スクリーンショット 2018-03-27 10.49.22.png](https://qiita-image-store.s3.amazonaws.com/0/39565/52b382d2-d8ad-01c5-6f0d-f9cb8872014d.png)

あとは、Visualizeメニューから、折れ線グラフを選んで、X軸Y軸の設定をしてやれば、グラフがでてきます！
やったね！！
![_スクリーンショット 2018-03-27 10.46.05.png](https://qiita-image-store.s3.amazonaws.com/0/39565/eb32ddbf-f393-d98e-1152-451e1f97acc1.png)

## データの調達
今回、[mockmock](https://mock-mock.com/ja/)というサービスからデータを送信しました。
![_スクリーンショット 2018-03-27 9.25.02.png](https://qiita-image-store.s3.amazonaws.com/0/39565/265a68bd-16f3-c378-0538-a4ef478a1b11.png)

IoT系のシステムはちょっと試すだけでもデータが必要で、その調達がなかなか面倒です。デバイスを用意するのも別の知識がいるし時間もかかります。かといって、スクリプトを書くのも地味に大変。。そして開発中のデバッグ、テスト、負荷試験などになるとなおさらです。

そんなときに役に立つのがこのmockmock。IoTのテスト用に仮想デバイスを提供し、指定したエンドポイントに疑似データを送ります。デバイスなしで簡単にIoTシステムのテストが可能になります。

Cloud IoT Coreがβ版の頃からデータの送信先として対応しており、[正式リリースを伝える公式Blog](https://cloud-ja.googleblog.com/2018/02/the-thing-is-Cloud-IoT-Core-is-now-generally-available.html)でも紹介された、由緒正しきサービスです(๑•̀ㅂ•́)و　[ドキュメント](https://console.mock-mock.com/docs/guides/gcp_cloud_iot_core)もちゃんとあります！

## まとめ
Cloud IoT Coreによって、デバイスからのデータを簡単にBigQueryに流し込むことができるようになりました。
もともとデータ分析が得意なGCPがIoTに本格参戦することによって、これからのIoT業界がどうなっていくのか楽しみです。