AWS・GCP・AzureのIoTプラットフォームを調べている

# IoT プラットフォーム？

各社のIoTソリューションはどこも基本的にこんな感じ

- 大量センサからデータをクラウドへ集約
- 集めたデータをデータベース化しリアルタイム（ストリーム技術）に可視化
- Machine LearningやAI技術を使ってデータを分析（エッジでもML）
- イベントベースでのアクション・制御（Lamdaなど）

これにより、センサからのデータ集約→可視化・分析→センサへの制御（フィードバック）つまりセンサ運用の完全自動化を狙うことができそうな感じです。クラウドにはそもそもここに書いたストリームやイベント制御やMLなどのサービスがそろってるのでそのツールチェーンをそのまま使えばいいという発想

# アーキテクチャ
当然ながら、コア（クラウド内）とエッジ（オンサイト）が分かれており、コア側は既存のクラウドのサービスを活用する形。

## AWS
![AWS](https://d2908q01vomqb2.cloudfront.net/b6692ea5df920cad691c20319a6fffd7a4a766b8/2017/05/16/IoTDashboard_1.gif)

その他、2016年のものだが、これがいいかも - [AWS IoTアーキテクチャパターン
](https://www.slideshare.net/AmazonWebServicesJapan/aws-iot-59515325)

## GCP
![GCP](https://kstatic.googleusercontent.com/files/bf65e1333709e19a7e2b4a0f910a77ddaf4050aa0f11fa82858aa0ba658952d2a4d974558ec22859a0f4dcd74cad789a80a1894492913b862026125228d6c8b7)

## Azure

![Azure](https://docs.microsoft.com/ja-jp/azure/architecture/reference-architectures/iot/_images/iot.png)

# スペックをまとめてみる

| プレイヤ             | AWS                                          | Azure                                                        | GCP                           |
| :------------------- | -------------------------------------------- | ------------------------------------------------------------ | ----------------------------- |
| コンポーネント       | AWS IoT Core                                 | IoT Hub                                                      | Cloud IoT Core                |
| エッジコンポーネント | AWS IoT Greengrass[^1]                       | IoT Edge                                                     | Cloud IoT Edge                |
| プロトコル           | MQTT<br>HTTP1.1<br>Websockets                | HTTPS<br>AMQP<br>AMQP over WebSocket<Br>MQTT<br>WebSocket 経由の MQTT | MQTT<br>HTTP                  |
| セキュリティ         | TSL1.2<br>x.509<br>SigV4<br>カスタムトークン | x.509<br>セキュリティトークン                                | 公開鍵認証<br>RSAES256<br>JWT |
| ハードウェア         | パートナーデバイス + FreeRTOS[^3]            | パートナーデバイス[^4]                                       | Android Things[^2]            |
| その他               | デバイスシャドウ                             | ?                                                            | Edge TPU                      |



プロトコルはMQTTかHTTP、各社デバイスパートナを持っており、そのデバイス上で使えるSDKを提供している感じ。エッジでは機械学習

# 各サービスの資料

軽くググったら出てきた資料たち

- [AWS が提供する IoT ソリューションと ITS における活用](https://www.slideshare.net/AmazonWebServicesJapan/aws-iot-its)
- [「AWS IoTのベストプラクティス」それホント！？](https://jawsdays2019.jaws-ug.jp/session/1595/)
- [オートモーティブIoT](https://www.slideshare.net/AmazonWebServicesJapan/20200130-iotloftautomotiveiot)
- [GCP](https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-gcp-iot-20181122)
- [Azure](https://www.slideshare.net/MicrosoftAzure_Japan/azure-iotai)


# SORACOM

SORACOMはこの分野でかなり頑張ってる感じ。GAFAのIoTプラットフォームの劣化版を作らず、彼らに乗っかって早くPoCを回してやりたいことをやってしまおうというアイデア。以下の資料は、技術だけじゃなくて、IoTプロジェクトの進め方、ベストプラクティスに言及していて面白い。GCP, Azure, AWSともにアーキテクチャの図が横通しで見られる。

- [「作りこまない IoT 」を実現するためのクラウドネイティブな IoT システム構築](https://www.slideshare.net/SORACOM/iot-iot-cloud-native-days-tokyo-2018-openstack-days-tokyo-2018
)
- [IoTで生き残れ！成功なんて結果論、こうすれば失敗します。プロ達が語る『IoT失敗あるある談』！！！ | IoT ありがちな失敗パターンと 回避する方法](https://www.slideshare.net/SORACOM/iotiot-iot
)
- [IoT向けプラットフォーム「SORACOM」とは？ 他２本](https://www.slideshare.net/SORACOM/iotsoracom-181832844?qid=0c9e5003-4944-4148-9ee1-2b8df660163a&v=&b=&from_search=9)

# 知っ得ハンズオン はじめてのIoT AWS IoT Core

そろそろ触ってみるために、[知っ得ハンズオン はじめてのIoT AWS IoT Core](https://iotawsiotcore.splashthat.com/) にいってみた。目黒。軽いプレゼンの後にハンズオン。テキストみて各自が勝手に読んで進めるスタイル（後ろにサポートの人が数名）[^5]。内容全部書いてもいいが、ここは控えめにポイントだけ。

- AWSではデータ収集して分析だけじゃなくて、デバイスからデータをうけとって、その値の書き換えに基づいてデバイスを制御する「リモート制御」も可能。Lamdaかな？
- IoT Core は Kinesis より10倍くらいお高い値段設定。Kinesis に比べて認証とか管理とかいろいろまとまってるので。
- 単にセンサからデータをぶん投げて、信頼性も気にしないなら Kinesis でいい
- 公式WebのAWS IoT Coreチュートリアルは、Raspberry Pi 持ってる前提で進めてくるから、RPの代わりにLinuxつかった抜け道教えてやるぜ。デバイスを擬似したPythonのコードがMQTTでデータを送ってくる。Cloud9[^6]使えば全部AWSワールドで完結[^5]。
- MQTTのQOSは0, 1, 2のうち、0: at most once. 1: at least onceをサポート。2は費用対効果悪し
- デバイスシャドウ[^7]でデバイスを抽象化
- ルールエンジンでデバイスからのデータを処理。今回はデバイスから上がってくるパケットのペイロードをSQLでひっかける。`{'name': 'x'}` というJSONなペイロードを `select x where name = 'x'`な感じでひっかけて、S3へ保存するなど[^8]
- 実際触ってみると、デバイスへ証明書を送り込むのがめんどくさい。今回のセミーナーではデバイス一台だけなので手でコピー。これは、デバイスの数が多いと死ぬな...[^9]
- あ、あとこのセミナーでアンケート答えたら$25のAWSクーポンくれたし、Macの電源ケーブル忘れたら、持ってきてくれたし、AWSの人みんないい人たちでした。

# MQTT

MQTT（Message Queue Telemetry Transport）はAGM各社ともに採用しているプロトコルであり、理解しておくほうがよい

[MQTT公式](http://mqtt.org/)
[MQTTの基本知識](https://www.ibm.com/developerworks/jp/iot/library/iot-mqtt-why-good-for-iot/index.html)
[Mosquitto MQTT broker](https://mosquitto.org/)

[^1]: AWS IoT Greengrassはエッジ側でAWS Lamdaを使えるような感じの物っぽい。コア側と連携して動く。
[^2]: [Android Things](https://developers-jp.googleblog.com/2018/07/android-things-client-library-for.html)
[^3]: [パートナデバイス](https://devices.amazonaws.com/search?page=1&sv=freertos) + [FreeRTOS](https://aws.amazon.com/jp/freertos/)
[^4]: [パートナーデバイス](https://catalog.azureiotsolutions.com/alldevices)
[^5]: 最近のハンスオンセミナーはこういうスタイルなのか。まあ、自分のペースで進められて自由に質問もできるのでよき。
[^6]: Cloud9って昔お世話になったが、Amazonに買われた？元々Amazonのだったっけ？
[^7]: クラウド向いにデバイスを擬似するもの。JSONで振る舞いを定義する
[^8]: ルールをうまく書くと、クラウドのサービスがフル活用できてほとんどありものでやりたいことができてしまうのではないか
[^9]: なんかうまい仕組みがあるんだろうが、私は知らない。