Azure IoT Hubで収集したIoTデータを Azure Event Hubs に連携させる

## はじめに
Azure IoT Hub で収集したデバイスのデータは、たとえば別のアプリケーションでストリーミング処理したい・分析基盤に流したい、などの目的で他サービスに連携されることが多いかと思います。その際の選択肢として、[公式のドキュメント](https://learn.microsoft.com/ja-jp/azure/iot-hub/iot-hub-devguide-messages-d2c#routing-endpoints)では以下が列挙されています。
- Event Hubs互換の組み込みエンドポイント
- Storage containers
- Service Bus キュー
- Service Bus トピック
- Event Hubs
- Cosmos DB (プレビュー)

本記事では、これらの中から最も需要があると思われる**Azure Event Hubs**でデータを集約してデータを別のアプリに送信する方法を解説します。


## Azure IoT Hub とは
https://docs.microsoft.com/ja-jp/azure/iot-hub/
Azure IoT Hub は、デバイスとクラウド間の双方向通信を提供するマネージドサービスです。IoT Hub の主要な機能には、デバイス登録・認証や、データ送受信があります。IoT Hub は、大量のデバイスからリアルタイムでデータを収集する際に優れたパフォーマンスを発揮します。

## Azure Event Hubs とは
https://docs.microsoft.com/ja-jp/azure/event-hubs/
Azure Event Hubs は、リアルタイムのデータストリームを処理するためのフルマネージドサービスです。大量のイベントデータを高速で収集し、ストリーミング分析やストレージに送信することができます。Event Hubs は、Apache Kafka プロトコルをサポートしており、Kafka を用いたデータ送信が可能です。

## IoT Hub でデバイスからデータを収集する手順
まず、IoT Hub を作成し、 デバイスを登録し、適切な認証情報を設定します。デバイスからのデータ送信には、MQTT や AMQP、HTTP などのプロトコルが利用できます。IoT Hub のデバイスエンドポイントを設定し、データを受信できるようにします。
1. Azure IoT Hubを作成する
    - Azure ポータル（https://portal.azure.com/） にサインインします。
    - 左側のメニューで、"リソースの作成 "をクリックします。
    - "IoT Hub"を検索し、その結果をクリックします。
    - 「作成」をクリックし、必須項目を入力します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/0d839fe3-0ec8-fbd7-8322-5b79b75d80d5.png)

    - 設定を確認し、「作成」をクリックして新しいIoT Hubをデプロイします。

1. デバイスを登録する
    - IoT デバイスの登録: 上記で作成したIoT Hub のメニューで、「IoT デバイス」をクリックします。次に、「+ 新規」ボタンをクリックして新しい IoT デバイスを登録します。

    - デバイスの詳細を入力: 新しいデバイス登録画面で、以下の情報を入力します。

        - デバイスID: デバイスに一意な識別子を入力します。これは後でデバイスが IoT Hub に接続する際に使用されます。
        - 認証タイプ: デバイス認証に使用する方式を選択します。一般的には「対称キー」または「X.509 証明書」が選択されます。対称キーはより簡単な設定ですが、X.509 証明書はより高いセキュリティが求められる場合に適しています。今回は「対称キー」で作成します。
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/0b4a74e5-68b6-de76-5411-37b704aefb4b.png)

    - デバイス登録の完了: 入力内容を確認し、「保存」ボタンをクリックします。デバイスが IoT Hub に登録されます。

1. デバイスからIoT Hub にメッセージ送信する
    - 今回はIoTデバイスの実機を用意できないため、Visual Studio Code の拡張機能 [「Azure IoT Tools」](https://learn.microsoft.com/ja-jp/azure/iot-hub/iot-hub-device-management-iot-toolkit)を使用してIoT Hubにメッセージを送信します。Azure IoT ToolsでIoT Hubにメッセージを送信する方法については、公式ドキュメントや他のQiita記事に詳しいので以下を参照してください。
        - https://learn.microsoft.com/ja-jp/azure/iot-hub/iot-hub-vscode-iot-toolkit-cloud-device-messaging
        - https://qiita.com/RyogaTakao/items/5115c8d414c111f0753a
        
        Azure IoT Tools からIoT Hubにメッセージを送信すると、IoT Hubのコンソールからメッセージが受信されていることが確認できます。
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/b57b5c30-814f-c44d-e8db-e8a96465d362.png)


## IoT Hub と Event Hubs の統合
次に、IoT Hub から Event Hubs へデータをルーティングする設定を行います。これにより、IoT Hub で収集したデータが Event Hubs に自動的に送られます。データ変換が必要な場合は、Azure Stream Analytics などのサービスを使用してデータを加工できます。
-  Event Hubs インスタンスの作成: Azure ポータルで新しい Event Hubs 名前空間と Event Hub を作成します。この Event Hub は、IoT Hub からデータを受信するためのエンドポイントとして機能します。
    - Event Hubs 名前空間の作成： 必須項目を入力します。プロトコルとしてKafkaを使用するため、価格レベルは **Standard** 以上を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/3efed15c-dcd9-8918-a48f-2bbe918921f6.png)

    -  Event Hubs インスタンスの作成: 作成したEvent Hubs 名前空間の左メニューより、「エンティティ -> Event Hubs」 を選択し、「+ Event Hub」 ボタンをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/5ed7282f-37d0-3333-c2cd-df9a439c26b0.png)

   - 必須項目を入力し、作成します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/9f1793fc-360d-0b37-f8a1-5ea44c47ff89.png)



  

- IoT Hub でルーティング設定: IoT Hub の「メッセージルーティング」メニューから、カスタムエンドポイントとルートを作成します。
    - IoT Hubの左メニューから、「ハブ設定 -> メッセージルーティング」 を選択します。
    - 「カスタムエンドポイント」 タブを開き、「追加」ボタンをクリックし、イベントハブを選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/037487bd-1b31-d6b5-c55d-32e516fd0097.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/c593dbe6-8d5c-af43-b75a-c062d1aac27d.png)

    - エンドポイント名を入力し、作成した Event Hubs 名前空間・インスタンスを指定します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/d87ee1a5-8b0a-913a-b3a3-636236bf7d19.png)

    - カスタムエンドポイントを作成したら、「ルート」タブを開き、「追加」ボタンをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/c016516a-4a23-b55d-b776-ffe4d99b2b7e.png)

    - 名前の入力、先程作成したエンドポイントを指定してルートを作成します。必要に応じてルーティングクエリを設定できますが今回はデフォルトのままとしておきます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/d3f6ab28-1bd6-2ce1-9dd3-e156c5de2403.png)


これで、IoT Hub と Event Hubs が統合され、IoT Hub から受信したデータが自動的に Event Hubs に送信されます。


## 動作確認
ルートの設定が完了したら、実際にIoT Hubにデータを送信し、Event Hubsで受信できているか確認してみます。
先程と同様にVS Code から送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/9402abe7-8d25-40d9-0042-602fa048f044.png)
1秒間隔で100メッセージほど送ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/aeda02d1-0ee7-05b8-8e83-0b58e556f3a5.png)
IoT Hubでデバイスからメッセージが送られていることが確認できます。

Event Hubsはどうでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24487/6e1659d3-429a-e68f-d964-4c5a9f46c2bf.png)
こちらもメッセージが送られてきていることが確認できました。


## 参考文献
Azure IoT Hub 公式ドキュメント: https://docs.microsoft.com/ja-jp/azure/iot-hub/
Azure Event Hubs 公式ドキュメント: https://docs.microsoft.com/ja-jp/azure/event-hubs/
Kafka プロトコルに関するリソース: https://kafka.apache.org/documentation/