Azure の IoT系サービスを簡単に整理 IoT Hub, DPS, Sphere, RTOS, IoT Edge その他もろもろ

# はじめに
AzureでIoTを始めようという際、サービスが多くてそもそもドキュメント読む気も起きなくて、結局手作りして、あとから
「あ、こんなサービスあったなら教えておいてよ」
「スキルセット的にこっちじゃなかったな」
というようなことに陥る場面もあるのではないでしょうか。

こちらの記事では、AzureのIoT系サービスを俯瞰してみたいと思います。
細かい部分には触れませんが、全体的にどのようなサービスが存在していて、使うべきポイントがなんなのかをサラッと理解できるように書いてみます。
とはいえ、数が多いので記事が冗長です。ごめんなさい。
目次を見て、気になるところから確認いただけたらと思います。

# 個々のPaaSサービスとは別にSaaSやPaaSを組み合わせてくれるサービスが存在する
ある程度世の中に存在するシナリオについては、各種サービスを組み合わせてSaaSやPaaSに仕立てたサービスというものも提供されています。
まずはこちらに触れていきます。

## Azure IoT Central 
[Azure IoT Central](https://azure.microsoft.com/ja-jp/services/iot-central/) は、各シナリオに沿って使える完成品のSaaS製品です。例えば小売りを手掛けるお客様が必要そうなシナリオをベースにしたアプリケーションを簡単に構築することができるサービスです。
接続できるデバイスを準備すれば、クラウド内の作りこみを行わなくてもIoTのサービスを始めることが可能です。
IoT Centralを利用することで、クラウドがわかるIoT技術者がいなくても、安全でスケーラブルな環境を予測可能なコストで利用することができます。
また、準備されているインターフェースと各種Azureのサービスを使って、ご自身のサービスを拡張することもできます。

## Azure IoT Solution Accelerator
[Azure IoT Solution Accelerator](https://www.azureiotsolutions.com/Accelerators)は、[Azure IoTリファレンスアーキテクチャ](https://aka.ms/iotrefarchitecture) という"こうやって作ったらいいですよ"ドキュメントに沿って作られた半完成品のPaaSサービスです。
例えば、オフィスや工場をリモートで監視したいという場合に必要そうなサービスを仕立て、サンプルとなる画面も提供してくれます。
こちらは先述の通り半完成品ですので、すべてをご自身が必要な形に作り替えることが可能です。実際には、こちらは特別なサービスが存在しているわけではなく、各種サービスの組み合わせをボタン１発で仕立ててくれるというものになります。
あまりこういう言い方は良くないかもしれませんが、とりあえずPoCでデバイスをつないでみるには必要十分な機能を備えていると思います。
それ以上はコメントは差し控えたいと思いますが、勉強にはなります。

# IoT系のPaaSサービスは"デバイス"と"サービス"で区別して考える
IoTなので、"**デバイス**"が必要なのはわかると思います。デバイス以外の部分を"クラウド"ではなく"**サービス**"と考える癖をつけてください。
技術屋さん同士で会話する分には"クラウド"でも良いのですが、"クラウド"は実現手段・方法論のお話しです。お金儲けやユーザーの満足度を念頭に置いた場合、"デバイス"と対になるものは"サービス"となりますので頭の片隅に置いておいてください。
"デバイス"は情報を収集する起点であり、場合によっては何らかのフィードバックを行うサービスの最終消費地となります。
"サービス"は収集された情報に付加価値を生み出す場所であり、付加価値を生み出すために必要な基盤となります。
AzureのIoT系のサービス等は、大きくこの"**デバイス**"と"**サービス**"で別れます。

# デバイス関連
デバイスと一言で言っても様々なものが存在します。スーパーのPOSや工場のマシニングセンターのようなPCをベースとして動作する比較的スペックの高いデバイスも存在しますし、冷蔵庫や監視カメラのようないわゆる組み込みに近い長寿命だけどシビアなスペック限界を意識すべきデバイスも存在します。
やりたいこと、スペック、技術者のスキル範囲によって、Azureのサービスも利用するものが変わってきます。

## Azure IoT Edge
[Azure IoT Edge](https://azure.microsoft.com/ja-jp/services/iot-edge/)はその名の通り、Azure IoT系のサービスをEdgeサイド(要するに手元)に持ってくるサービスです。
IoTと言うとクラウドのような遠隔地にデータを飛ばしてフィードバックをもらうのが最初に出てくるシナリオになりますが、現実問題としてこれは多くの問題を起こすことがあります。

- 画像データをバンバン飛ばしてAIやったからコストすごいしレスポンス悪い
- 回線切れたら使えない
- 工場内の機器間の通信速度からすると恐ろしいレイテンシーで使えない

こんな時に使えるのがIoT Edgeです。IoT Edgeでは

- データを安全に収集する
- 収集データから洞察を得る(要するに付加価値を得る)
- 洞察を以ってアクションを起こす

というIoTで必要となる3つの動作をローカル環境で実現します。しかもオフライン状態になっても動作します。
各現場で手作りしても良いのですが、分散配置すると起こる以下のような問題にも対処できます。

- 動作状態をどうやって監視するのか(サービスの集中管理が可能)
- 内部動作のアップデートをどうやって実施するのか(OTA)
- AI的なこととかモデルの学習大変(クラウドで学習して、できたモデルをデバイスに配布)

技術的にはオープン系なんだけどローカルでいろいろ挙動させたいんだという時は、Azure IoT Edgeは選択肢だと思います。

## Azure Sphere
[Azure Sphere](https://azure.microsoft.com/ja-jp/services/azure-sphere/)は、安全なデバイスを提供するために開発された三位一体のソリューションです。

- チップメーカーとも協業して作り上げたセキュアなハードウェア
- リリース後10年アップデートを保証する Azure Sphere OS (Linux)
- セキュアなOSおよびアプリケーションのアップデートを実現するクラウド環境

この三位一体となったものがAzure Sphereです。
チップの中は外部との通信、内部での動作、内部での動作は、OS上で動作する部分とRTOSで動作する部分が明確に分離されています。
これらは、組み込み系のシステムをIoT化する際に最も気になるセキュリティの部分とOTAの部分を担当してくれます。

技術的には組み込み系なんだけどIoTサービスを展開したいんだという時は、Azure Sphereは選択肢だと思います。
チップの価格につきましては、正直チップ単体と考えるとなかなか良いお値段ですが、上記記載のような機能を委任できることを考えると魅力のあるソリューションです。

## Azure RTOS
[Azure RTOS](https://azure.microsoft.com/ja-jp/services/rtos/)は、組み込み系の方のために準備されたIoTソリューションです。
ベースは2019年にマイクロソフトが買収したExpress Logic社のThreadXです。
必要に応じて、

- FATと互換のあるFileX
- 画面構成するGUIXおよびGUIX Studio
- Windowsベースの分析ツールTraceX
- TCP/IPプロトコル標準(IPv4のみ)のNetXおよびNetX Duo
- USBデバイスとの通信を補助するUSBX

を組み合わせてご利用いただくことで、RTOSベースのIoTデバイスを製造いただくことができます。
こちらはハードウェアとのセットにはなっていません。
ライセンスにつきましては現在、以下のような形態になっています。

- 開発やテストについては無料
- 実運用については有料で、形態は2種類
- 事前ライセンス供与されたデバイスにデプロイする場合は無料(デバイスの費用に含まれている)(が、現在情報はありませんでした)
- 上記に該当しないデバイスについてはデバイス数によるので[AzureRTOSContact](https://azure-rtos.ms-iot-contact.com/)で問い合わせる

## デバイス関連その他
デバイス内の開発を容易にしてくれる"[Azure IoT Device SDK](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-devguide-sdks#azure-iot-hub-device-sdks)"
例えば工場内や配送センター内で大量のデータ、機械学習モデルの実行等を実施するためのハード"[Azure Stack Edge](https://azure.microsoft.com/ja-jp/products/azure-stack/edge/)"および"[Azure Stack Hub](https://docs.microsoft.com/ja-jp/azure-stack/operator/azure-stack-overview?view=azs-2002)"
IoTに特化したOS"[Windows for IoT](https://docs.microsoft.com/en-us/windows/iot-core/)"シリーズ
デバイスで動作するデータベースエンジン"[Azure SQL Edge](https://azure.microsoft.com/en-us/services/sql-edge/)"
などがあります。

# サービス関連
サービス提供を実施するためのPaaSサービスは多数存在し、また組み合わせ方も多種多様です。ここでは、表示画面的な部分やコンテナは省きます。(表示系は"きりがない&一般的なクラウドネイティブ構成の話題&PowerAppsでも良いかも"ですし、コンテナ使えば何でもできますので省略します。)

## IoT Hub
AzureでIoTといえばこれ。すべての起点となるサービス"[Azure IoT Hub](https://azure.microsoft.com/ja-jp/services/iot-hub/)"です。
デバイスとの通信をつかさどるカギとなるサービスです。デバイスの管理、メッセージの授受を担当します。

- 各デバイスに配布するためのIDや接続情報を生成・管理
- 各デバイスの状態監視
- 各デバイスへのJobのプッシュ
- テレメトリーデータの送受信

などを担当します。
収集したデータについても、プロパティ情報などをもとに"どこに配布するのかを定める"ことができますし、コンシューマーグループというものを使えば収集データをコピーして分配することも可能です。
IoT Hub自身がある程度の時間はメッセージを保持してくれますので、後続サービスが落ちた時もデータロストを抑えることができます。
デバイスがすでにファイルとしてログを書き出していて、それを時々収集したいだけでしたら、Azure Blob Storageにファイルアップロードすることも補助してくれますので、やはりIoT Hubはお勧めです。

## Event Hubs
[Event Hubs](https://azure.microsoft.com/ja-jp/services/event-hubs/)は、IoTに用途を限ったものではありません。大量のテレメトリーデータを受け取るためのサービスです。(とりあえずガッツリ受け取って腹に抱えてくれる子がいるとサービス全体が安定します)
IoT Hubはデバイスを管理できますが、Event Hubsは管理できません。IoT Hubへの接続情報はデバイス単位ですが、こちらは接続情報が全体で同じです。ですから、端的には"どこから飛んできたデータなのか"を管理できません(メッセージ内に書けば良いですが、それが本当にデバイスから来たか否かは不明瞭といえば不明瞭です)。またデバイスに向かってPush通信ができないということもあります。
しかし、大量のメッセージをIoT Hubより安価に受け取ってくれるのは確かですので、利用されているお客様もいらっしゃいます。
**IoTでの利用に際しては、IoT Hubとの併用をお勧めします。**
例：

- IoT Hubを使ってデバイスを管理する
- Event Hubsの接続情報は、IoT Hub経由でデバイスに提供する
- Event Hubsの利用を開始する際は、IoT Hubから提供された接続情報を使う

このような動作を実現することで、デバイスを管理しつつテレメトリーデータの課金を抑え、かつElasticな環境を手に入れることができます。
Event Hubs単体で完了させるより、セキュアな状態を保ったりHA/DRに備えるのが楽になります。

## Azure IoT Hub Device Provisioning Service
[Azure IoT Hub Device Provisioning Service](https://docs.microsoft.com/ja-jp/azure/iot-dps/about-iot-dps)は、デバイスをIoT Hubに接続するのを安全で楽な状態にしてくれるサービスです。端的にいうと、デバイスが**どのIoT Hubに接続したら良いか**を**接続情報と共に**伝えてくれます。
[IoT Hub Device Provisioning Service とは？超概要](https://qiita.com/mstakaha1113/items/231c859d7427b466d4ad)ということで記事も書きましたので、ご興味のある方はご確認いただけますと幸いです。

## Azure Stream Analytics
[Azure Stream Analytics](https://azure.microsoft.com/ja-jp/services/stream-analytics/)は、入手したデータをリアルタイムに分析するためのサービスです。
**ホットパス**で利用すると威力を発揮します。ホットパス・コールドパスにつきましては[AzureでIoT系のサービスをサラッと(?)使ってみよう](https://qiita.com/mstakaha1113/items/1c9b8f61452147a87640#%E3%83%9B%E3%83%83%E3%83%88%E3%83%91%E3%82%B9%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%89%E3%83%91%E3%82%B9)の記事にて軽く記載しましたので参照いただけますと幸いです。
![image.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F439826%2F7b553b59-3624-689c-47f3-78d44044fb90.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=c8e4ad25362643a4179adab7c2e8546a)
データに付加価値を与える方法は大きく2つに分かれます。

- 今飛んできたデータがどんな感じなのかを評価して結果を返す
- 過去のデータを全体的に見てみるとどんな感じなのかを評価して結果を返す

Stream Analyticsは前者を実施してくれます。入力と出力がどこなのかを設定し、クエリを書いて実行することで、過去5分の平均値とかを返してくれます。単純に過去5分と書きましたが、5分の取り方だけでもいろいろあります。正時から見て5分間隔も5分ですし、飛んできたデータの時刻から考えて過去5分も5分です。このような時系列を意識しながら動作できるのもStream Analyticsの特徴です。
時々、Stream Analyticsを通過させてからコールドパス用のデータを保持しようとされる方がいらっしゃいますが、コールドパスは素直にIoT Hubから直接出力することをお勧めします。
また、クエリのアップデートにはStream Analyticsの停止と起動が必要で、若干の時間がかかります。できるだけ停止時間の無い状態を作るためには若干の工夫が必要です。

## Azure Cosmos DB
[Azure Cosmos DB](https://azure.microsoft.com/ja-jp/services/cosmos-db/)は、高速でスケーラブルなNoSQL系データベースです。"Cosmos DB"という名前のデータベースがあるわけではなく、いかに記載する4種類のデータベースのどれかを選択して高速でスケーラブルなPaaS環境を手に入れられるのだとお考え下さい。

- キーバリュー(Azure Blob の Table Storage)
- 列ファミリー(Cassandra)
- ドキュメント(MongoDBや昔DocumentDBと呼ばれていたエンジンでCosmos DB内では"SQL"と記載されています)
- グラフ(Gremlin)

Azureのポータルにて、ボタン1つで世界中のリージョンにレプリカの生成が可能で、必要ならどこにでも書き込みもできます(デフォルトは書き込み後勝ち)。指定されたキーでデータを水平展開しますので、キーをうまく指定すればデータが大量になっても高速に動作します。データの整合性については5種類から選択することで高速性と堅牢制のバランスを調整できます。
ただし、キーをうまく使えないと低速になることもありますしコストに跳ね返ります。また使わないデータをため込むとコストに跳ね返りますので注意が必要です。
**必要なデータだけをCosmos DBにストアして、ため込みはSQLDatabaseやBlob Storageに任せるのがお勧めです。**

## Azure Time Series Insights
[Azure Time Series Insights](https://azure.microsoft.com/ja-jp/services/time-series-insights/)は、時系列データを視覚化するためのPaaSサービスです。IoTといえば時系列データのグラフによる視覚化ははずせない要件の1つではないでしょうか。でも、グラフを書くのって大変ですよね。データの取り込みとかデータ量によるスケーリングとか、3日後には違う視点で情報を見たい等々。そこらへんを良い感じに請け負ってくれるデータストアと視覚化のPaaSサービスとなっています。ご自身で作成したアプリケーションに組み込むことも可能です。
この[Azure Time Series Insightsサンプル](https://tsiclientsample.azurewebsites.net/)ページをご確認いただくと、どんな雰囲気のグラフが手に入るのかわかると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/3a9ed96f-38b5-0adb-ef3d-839de3e05f9e.png)

## Azure Digital Twins
[Azure Digital Twins](https://azure.microsoft.com/en-us/services/digital-twins/)は、IoTのデジタルワールドでリアルワールドを正確にトレースするためのソリューションです。現実空間の状態を仮想空間に再現することを目的としていて、それを"Twins"と表現しています。
IoT系サービスを構築する際、個々のセンサー情報が単体動作することで成立する場合もありますが、複数のセンサーが連携することで多くの付加価値を生み出すものもあります。
例えばビルの各フロア、各エリアに温度センサーや照度センサー、人感センサーを配置し、それらの位置情報や関連性を意識することで、快適でエネルギー効率の良いビルを構築できるかもしれません。そこにユーザーのスケジュールを組み合わせて会議室運営することも考えられます。
例えば工場の生産ラインの各機器、機器内のアーム付近、先端、人が載る場所にセンサーを配置し、それらの関連性を意識することで、高い生産性や従業員の安全性に寄与できるかもしれません。
このようなセンサー同士の関連性をグラフデータとして保持することでアプリケーションの生産性に寄与するのがAzure Degital Twinsの特徴となります。
2020年6月現在、v2のリリースが控えている状況ですので、私はしばらく様子見したいと思います。

## Azure Maps
[Azure Maps](https://azure.microsoft.com/ja-jp/services/azure-maps/)は、地理空間データを視覚化するためのPaaSサービスです。IoTといえば時系列データと共に地理空間データもはずせない要件の1つではないでしょうか。単純な地図へのプロットならまだしも、移動に関わるトラフィックやルーティング、半径なん百メートルみたいなジオフェンシング等を扱うとなると、それなりに大変ではないでしょうか。そこらへんを良い感じに請け負ってくれるPaaSサービスとなっています。
が、正直なところまだまだ日本では使えないと、個人的には思います。(日本の地図情報って本当にすごいなぁと心から思います。)

## Azure Monitor
[Azure Monitor](https://azure.microsoft.com/ja-jp/services/monitor/)は、Azure上のあらゆるサービスおよびエージェントを仕込んだ各種サーバーやデバイスのメトリック情報やログデータを収集し視覚化するPaaSサービスです。
例えばCPUやメモリの状態などのメトリック情報からスケールアウトを実施するためのトリガーを弾いたり、Application Insightsから収集したアプリケーションログデータからレイテンシーを確認して処理時間のかかっているクエリを特定したりできます。
各種Azure内のPaaSサービスはAzure Monitorと連携できますので、連携して監視を実施、そのうえでサービス全体がセルフヒーリングできる仕掛けを作っていくことができます。Security Centerと連携して、どれくらいセキュアな状態を保てているのかを確認することも大切になります。

## Security Center
[Security Center](https://azure.microsoft.com/ja-jp/services/security-center/)は、Azure Monitorや3rd party製品等と連携し、ご自身のAzureを始めとするサービス提供の環境がどれくらいセキュアな状態にあるかと第3者的に判断し、アドバイスをくれます。
このサービスの中には、Azure Security Center for IoTというものがあり、IoTに特化したセキュリティーソリューションを展開できます。

## Azure Security Center for IoT
[Azure Security Center for IoT](https://docs.microsoft.com/ja-jp/azure/asc-for-iot/overview)は、IoTで利用するデバイスがどれくらいセキュアな状態にあるかをチェックしてくれます。
IoT Hubのところ実施する"組み込みモード"と、デバイスにエージェントを仕込んで実装する"拡張モード"があります。もちろん、拡張モードの方が収集できる情報は多いですが、動作可否を精査したうえでの利用が必須となります。
アラートも生成されますし、生成するアラートもある程度カスタマイズできます。

# まとめ
いかがでしょうか。挙げ始めたらきりがないAzureのサービスなのですが、IoTと濃い関係がありそうだと独断と偏見で判断したサービスを取り上げてみました。
これらを中心にサービスを組み上げ、運用に関わる人件費等も含めて価格競争力を兼ね備えた継続可能なIoTサービスを構築いただけますと嬉しいかぎりです。