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 で DeviceConnectedDeviceDisconnected イベントをサブスクライブして、アラートをトリガーし、デバイスの接続状態を監視することをお勧めします。 Event Grid では、Azure Monitor よりもイベント待機時間が短くなり、デバイスごとの監視が可能です。 これらの要因により、Event Grid は重要なデバイスとインフラストラクチャを監視するための推奨される方法となっています。

Event Grid を使用してデバイス切断の監視またはアラートのトリガーを行う場合、Azure IoT SDK を使用するデバイス上での SAS トークンの更新による定期的な切断をフィルター除外する方法が組み込まれていることを確認してください。 詳細については、「Azure IoT SDK での MQTT デバイスの切断動作」を参照してください。

Event Grid を使用したデバイス接続イベントの監視の詳細については、次の記事を参照してください。

Azure Monitor:接続イベントをログにルーティングする

IoT ハブは、複数のカテゴリの操作について、リソース ログを継続的に出力します。 しかし、このログ データを収集するには、それを分析またはアーカイブ可能な宛先にルーティングするための診断設定を作成する必要があります。 このような宛先の 1 つが、Log Analytics ワークスペースを経由した Azure Monitor ログです (価格を参照)。ここで、Kusto クエリを使用してデータを分析することができます。

IoT Hub のリソース ログ接続カテゴリでは、デバイス接続に関する操作とエラーが出力されます。 次のスクリーンショットは、これらのログを Log Analytics ワークスペースにルーティングするための診断設定を示しています。

Recommended setting to send connectivity logs to Log Analytics workspace.

IoT ハブを作成した後は、できるだけ早く診断設定を作成することをお勧めします。IoT Hub は常にリソース ログを出力しますが、それは宛先にルーティングされるまで Azure Monitor によって収集されないためです。

宛先へのログのルーティングの詳細については、「収集とルーティング」を参照してください。 診断設定を作成する詳細な手順については、メトリックとログの使用に関するチュートリアルを参照してください。

Azure Monitor: デバイスの切断のメトリック アラートを設定する

IoT Hub によって出力されたプラットフォーム メトリックに基づいてアラートを設定できます。 メトリック アラートを使用すると、関心のある状態が発生したことをユーザーに通知したり、その状態に自動的に対応できるアクションをトリガーしたりすることができます。

"接続されているデバイス (プレビュー)" メトリックは、IoT Hub に接続されているデバイスの数を示します。 このメトリックがしきい値を下回った場合にトリガーされるアラートを作成できます。

Alert logic settings for connected devices metric.

メトリック アラート ルールを使用して、デバイスの切断時の異常を大規模に監視できます。 つまり、多数のデバイスが予期せず切断した場合の判断にアラートを使用できます。 これが検出された場合は、ログを確認して問題のトラブルシューティングに役立てることができます。 ただし、デバイスごとの切断および重要なデバイスの切断を準リアル タイムで監視するには、Event Grid を使用する必要があります。

IoT Hub でのアラートの詳細については、IoT Hub の監視でのアラートに関するページを参照してください。 IoT Hub でのアラート作成のチュートリアルについては、メトリックとログの使用に関するチュートリアルを参照してください。 アラートの詳細な概要については、Azure Monitor のドキュメントの「Microsoft Azure のアラートの概要」を参照してください。

Azure Monitor:ログを使用して接続に関するエラーを解決する

Azure Monitor のメトリック アラートまたは Event Grid でデバイスの切断が検出された場合、ログを使用してその理由のトラブルシューティングを行うことができます。 このセクションでは、Azure Monitor ログで一般的な問題を探す方法について説明します。 下の手順では、IoT Hub 接続ログを Log Analytics ワークスペースに送信するように、診断設定が既に作成されていることを前提としています。

Azure Monitor ログに IoT Hub リソース ログをルーティングする診断設定を作成したら、これらの手順に従って Azure portal でログを表示します。

  1. Azure portal で、お使いの IoT ハブに移動します。

  2. お使いの IoT ハブの左ペインの [監視] で、 [ログ] を選択します。

  3. IoT Hub の接続エラー ログを分離するために、クエリ エディターで次のクエリを入力してから [実行] を選択します。

    AzureDiagnostics
    | where ( ResourceType == "IOTHUBS" and Category == "Connections" and Level == "Error")
    
  4. 結果がある場合は、OperationNameResultType (エラー コード)、および ResultDescription (エラー メッセージ) を探して詳細を確認します。

    Example of error log

最も一般的なエラーを解決するには、次の問題解決ガイドを使用します。

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 イベントを示しています。

Screenshot of deviceConnect event in logs.

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 分ごとに行われます。

    Error behavior for token renewal over MQTT in Azure Monitor Logs with .NET SDK.

  • トークンの有効期間が 300 秒 (5 分) で、既定で有効期間の 85% で更新が発生するように設定されている Java SDK。 切断は 15 分ごとに行われます。

    Error behavior for token renewal over MQTT in Azure Monitor Logs with Java SDK.

  • トークンの有効期間が 300 秒 (5 分) で、トークンの更新が 3 分で発生するように設定されている Node SDK。 トークンの更新時に切断が発生します。 また、エラーは発生せず、接続または切断の情報イベントのみが出力されます。

    Error behavior for token renewal over MQTT in Azure Monitor Logs with 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 ログに記録されます。

手順を実行しましたが、うまくいきませんでした

前述の手順が役に立たなかった場合は、以下を試してください。

次のステップ

  • 一時的な問題の解決に関する詳細については、「一時的な障害の処理」を参照してください。

  • Azure IoT device SDK と再試行の管理の詳細については、「再試行パターン」を参照してください。