Azure IoT Hub のデバイス接続の監視、診断、およびトラブルシューティング
IoT デバイスの接続の問題は、考えられる障害点が多数あるため、トラブルシューティングが難しい場合があります。 アプリケーション ロジック、物理ネットワーク、プロトコル、ハードウェア、IoT Hub、およびその他のクラウド サービスのすべてが、問題の原因となる可能性があります。 問題の原因を検出して特定する能力は非常に重要です。 ただし、大規模な IoT ソリューションには数千のデバイスが含まれる可能性があるため、個々のデバイスを手動でチェックするのは現実的ではありません。 IoT Hub は、ユーザーを支援する 2 つの Azure サービスと統合されています。
Azure Monitor Azure Monitor では、IoT Hub からの利用統計情報を収集、分析、処理することができます。 これらの問題を大規模に検出、診断、およびトラブルシューティングするために、IoT Hub によって Azure Monitor を通して提供される監視機能を使用します。 このアプローチには、切断が発生したときに通知とアクションをトリガーするアラートの設定と、切断の原因となった状態を検出するために使用できるログの構成が含まれます。
Azure Event Grid: 重要なインフラストラクチャとデバイスごとの切断については、Azure Event Grid を使用して、IoT Hub によって生成されるデバイスの接続および切断イベントをサブスクライブします。 Azure Event Grid では、次のいずれかのイベント ハンドラーを使用できます。
- Azure Functions
- Logic Apps
- Azure Automation
- Webhook
- Queue Storage
- ハイブリッド接続
- Event Hubs
Event Grid と Azure Monitor
Event Grid は、重要なデバイスとインフラストラクチャのデバイス接続を追跡するために使用できる、低遅延かつデバイスごとの監視ソリューションを提供します。 Azure Monitor には、"接続されているデバイス" というメトリックが用意されています。これを使用して、IoT Hub に接続されているデバイスの数を監視し、その数が静的なしきい値を下回るとアラートをトリガーできます。
特定のシナリオで Event Grid または Azure Monitor のどちらを使うか決めるときは、次の問題を考慮してください。
アラートの待機時間:Event Grid によって、IoT Hub 接続イベントがより迅速に配信されます。 このため、すばやい通知が望ましいシナリオには、Event Grid が適しています。
デバイスごとの通知: Event Grid には、個々のデバイスの接続と切断を追跡する機能が用意されています。 このため、重要なデバイスの接続を監視する必要があるシナリオには、Event Grid が適しています。
簡易設定: Azure Monitor メトリック アラートは、電子メール、SMS、音声、およびその他の通知を通じて通知を配信するために他のサービスと統合する必要がない、簡易セットアップ エクスペリエンスを提供します。 Event Grid では、通知を配信するために他の Azure サービスと統合する必要があります。 どちらのサービスも他のサービスと統合して、より複雑なアクションをトリガーできます。
Event Grid: イベントの接続および切断イベントを監視する
実稼働のデバイスの接続と切断のイベントを監視するには、Event Grid で DeviceConnected と DeviceDisconnected イベントをサブスクライブして、アラートをトリガーし、デバイスの接続状態を監視することをお勧めします。 Event Grid では、Azure Monitor よりもイベント待機時間が短くなり、デバイスごとの監視が可能です。 これらの要因により、Event Grid は重要なデバイスとインフラストラクチャを監視するための推奨される方法となっています。
Event Grid を使用してデバイス切断の監視またはアラートのトリガーを行う場合、Azure IoT SDK を使用するデバイス上での SAS トークンの更新による定期的な切断をフィルター除外する方法が組み込まれていることを確認してください。 詳細については、「Azure IoT SDK での MQTT デバイスの切断動作」を参照してください。
Event Grid を使用したデバイス接続イベントの監視の詳細については、次の記事を参照してください。
IoT Hub での Event Grid の使用の概要については、Event Grid を使用した IoT Hub のイベントへの対応に関する記事を参照してください。 「デバイス接続状態イベントの制限事項」セクションに特にご注意ください。
デバイス接続イベントの順序付けに関するチュートリアルについては、「Azure IoT Hub から Azure Cosmos DB を使用してデバイス接続イベントを順序付ける」を参照してください。
電子メール通知の送信に関するチュートリアルについては、Event Grid のドキュメントの「Event Grid および Logic Apps を使用して Azure IoT Hub イベントに関する電子メール通知を送信する」を参照してください。
Azure Monitor:ログを使用して接続に関するエラーを解決する
Azure Monitor のメトリック アラートまたは Event Grid でデバイスの切断が検出された場合、ログを使用してその理由のトラブルシューティングを行うことができます。 このセクションでは、Azure Monitor ログで一般的な問題を探す方法について説明します。 以下の手順では、IoT Hub の接続ログを Log Analytics ワークスペースに送信するための診断設定を既に作成してあるものとします。
IoT Hub のリソース ログを Azure Monitor ログにルーティングする診断設定を作成した後、これらの手順に従って Azure portal でログを表示します。
Azure portal で、お使いの IoT ハブに移動します。
お使いの IoT ハブの左ペインの [監視] で、 [ログ] を選択します。
IoT Hub の接続エラー ログを分離するために、クエリ エディターで次のクエリを入力してから [実行] を選択します。
AzureDiagnostics | where ( ResourceType == "IOTHUBS" and Category == "Connections" and Level == "Error")
結果がある場合は、
OperationName
、ResultType
(エラー コード)、およびResultDescription
(エラー メッセージ) を探して詳細を確認します。
最も一般的なエラーを解決するには、次の問題解決ガイドを使用します。
Azure Monitor: 特定のデバイスの接続を監視するためにログを使用する
特定のデバイスの接続エラーと情報を確認するために、Azure Monitor の使用が必要になる場合があります。 デバイスの接続イベントを分離するには、前のセクションと同じ手順に従いつつ、次のクエリを入力します。 test-device をデバイスの名前に置き換えます。
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| extend DeviceId = tostring(parse_json(properties_s).deviceId)
| where DeviceId == "test-device"
クエリは、ターゲット デバイスのエラー イベントと情報イベントの両方を返します。 次の出力例は、情報 deviceConnect イベントを示しています。
Azure IoT SDK での MQTT デバイスの切断動作
Azure IoT デバイス SDK は、MQTT (および MQTT over WebSocket) プロトコルを介して SAS トークンを更新する際に、IoT Hub から切断して再接続します。 ログでは、これはデバイスの切断と接続の情報イベントとして表示され、時としてエラー イベントを伴うことがあります。
既定では、トークンの有効期間はすべての SDK で 60 分です。ただし、開発者は一部の SDK でそれを変更できます。 次の表は、各 SDK のトークンの有効期間、トークンの更新、トークンの更新の動作をまとめたものです。
SDK | トークンの有効期間 | トークンの更新 | 更新の動作 |
---|---|---|---|
.NET | 60 分、構成可能 | 有効期間の 85 %、構成可能 | SDK により、トークンの有効期間に 10 分の猶予期間を加算した期間で切断と再接続が行われます。 情報イベントとエラーがログに生成されます。 |
Java | 60 分、構成可能 | 有効期間の 85%、構成不可 | SDK により、トークンの有効期間に 10 分の猶予期間を加算した期間で切断と再接続が行われます。 情報イベントとエラーがログに生成されます。 |
Node.js | 60 分、構成可能 | 構成可能 | SDK により、トークンの更新時に切断され再接続されます。 情報イベントのみがログに生成されます。 |
Python | 60 分、構成可能 | 有効期限切れの 120 秒前 | SDK により、トークンの有効期間に切断され再接続されます。 |
次のスクリーンショットは、さまざまな SDK についての Azure Monitor ログにおけるトークンの更新動作を示しています。 トークンの有効期間と更新のしきい値は、注記のとおり既定値から変更されています。
トークンの有効期間が 1200 秒 (20 分) で、有効期間の 90% になったら更新が行われるように設定されている .NET デバイス SDK。 切断は 30 分ごとに行われます。
トークンの有効期間が 300 秒 (5 分) で、既定で有効期間の 85% で更新が発生するように設定されている Java SDK。 切断は 15 分ごとに行われます。
トークンの有効期間が 300 秒 (5 分) で、トークンの更新が 3 分で発生するように設定されている Node SDK。 トークンの更新時に切断が発生します。 また、エラーはありません。 接続と切断の情報イベントのみが出力されます。
次のクエリは、結果を収集するために使用されました。 このクエリは、プロパティ バッグから SDK 名とバージョンを抽出します。 詳細については、IoT Hub ログの SDK バージョンに関するページを参照してください。
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| extend parsed_json = parse_json(properties_s)
| extend SDKVersion = tostring(parsed_json.sdkVersion) , DeviceId = tostring(parsed_json.deviceId) , Protocol = tostring(parsed_json.protocol)
| distinct TimeGenerated, OperationName, Level, ResultType, ResultDescription, DeviceId, Protocol, SDKVersion
IoT ソリューションの開発者またはオペレーターは、ログの接続または切断イベントおよび関連するエラーを解釈するためには、この動作に注意する必要があります。 デバイスのトークンの有効期間または更新の動作を変更する場合は、デバイスで、デバイス ツインの設定、またはこの変更を可能にするデバイス メソッドが実装されているかどうかを確認してください。
デバイスの接続を Event Hubs を使用して監視している場合、SAS トークンの更新による一時的な切断を除外する方法を構築してください。 たとえば、特定の期間内に切断イベントの後に接続イベントがある場合は、切断に基づくアクションがトリガーされないようにします。
Note
IoT Hub は、デバイスごとにアクティブな MQTT 接続を 1 つだけサポートします。 同じデバイス ID で新しい MQTT 接続が行われると、IoT Hub は既存の接続を破棄します。
400027 ConnectionForcefullyClosedOnNewConnection が IoT Hub ログに記録されます。
手順を実行しましたが、うまくいきませんでした
前述の手順が役に立たなかった場合は、以下を試してください。
問題のあるデバイスに物理的にまたは (SSH などを使用して) リモートからアクセスできる場合は、デバイス側のトラブルシューティング ガイドの記事に従ってトラブルシューティングを続けます。
Azure portal の IoT ハブで IoT デバイスを選択し、デバイスが [有効] であることを確認します。
デバイスで MQTT プロトコルを使用している場合は、ポート 8883 が開いていることを確認します。 詳細については、「IoT Hub への接続 (MQTT)」を参照してください。
Azure IoT Hub に関する Microsoft Q&A 質問ページ、Stack Overflow、または Azure サポートから支援を受けてください。