次の方法で共有


Azure IoT Hub のエラーを理解して解決する

この記事では、IoT Hub の使用中に発生する可能性がある一般的なエラー コードの原因と解決策について説明します。

400027 新しい接続で強制的に接続を閉じる

.NET SDK と MQTT トランスポート種類の使用において、デバイスが切断された場合は 400027 ConnectionForcefullyClosedOnNewConnection エラーが表示され、また、ConnectionStatusChangeReason として Communication_Error が報告されることがあります。 または、デバイスからクラウドへのツイン操作 (読み取りまたはパッチの報告されたプロパティなど) またはダイレクト メソッドの呼び出しが失敗し、エラー コード が400027

このエラーは、別のクライアントが同じ ID を使用して IoT Hub への新しい接続を作成し、IoT Hub が前の接続を閉じるときに発生します。 IoT Hub では、同じ ID を使用して複数のクライアントが接続することを許可していません。

このエラーを解決するには、各クライアントが独自の ID を使用して IoT Hub に接続していることを確認します。

認証されていない IoT Hub 401003

ログでは、401003 IoTHubUnauthorizedでデバイスが切断された後、404104 DeviceConnectionClosedRemotelyが発生し、その直後に正常に接続されるパターンが表示されることがあります。

または、IoT Hub への要求は、次のいずれかのエラー メッセージで失敗します。

  • 承認ヘッダーがありません
  • IotHub '*' に指定されたデバイス '*' が含まれていません
  • 承認規則 '*' は '*' へのアクセスを許可しません
  • このデバイスの認証に失敗し、トークンまたは証明書を更新して再接続しました
  • 拇印が構成と一致しません: 拇印: SHA1Hash=*, SHA2Hash=*; 構成: PrimaryThumbprint=*, SecondaryThumbprint=*
  • 割り当てられたアクセス許可がないため、/exampleOperation でプリンシパル user@example.com が GET に対して承認されていません

このエラーが発生するのは、MQTT の場合、一部の SDK は IoT Hub に依存して SAS トークンの有効期限が切れたときに切断を発行し、更新するタイミングを把握しているためです。 そのため、次のようになります。

  1. SAS トークンの有効期限が切れる
  2. IoT Hub は有効期限を認識し、IoTHubUnauthorized 401003デバイスを切断します
  3. デバイスでは 404104 DeviceConnectionClosedRemotely で切断が完了します
  4. IoT SDK によって新しい SAS トークンが生成される
  5. デバイスが IoT Hub に正常に再接続する

または、IoT Hub で認証ヘッダー、ルール、またはキーを認証できませんでした。 この結果は、症状に記載されている理由のいずれかが原因である可能性があります。

このエラーを解決するには、デバイス接続文字列を使用した接続に IoT SDK を使用する場合は、アクションは必要ありません。 IoT SDK は、SAS トークンの有効期限時に再接続するために新しいトークンを再生成します。

既定のトークンの有効期間は、SDK 全体で 60 分です。ただし、一部の SDK では、トークンの有効期間とトークン更新のしきい値を構成できます。 さらに、トークンの更新時にデバイスが切断して再接続したときに生成されるエラーは、SDK ごとに異なります。 詳細と、デバイスがログで使用している SDK を特定する方法については、「Azure IoT Hub デバイス接続の監視、診断、トラブルシューティング」の「Azure IoT SDK を使用した MQTT デバイスの切断動作」セクションを参照してください。

デバイス開発者の場合、エラーの量が懸念される場合は、有効期限が切れる前に SAS トークンを更新する C SDK に切り替えます。 AMQP の場合、SAS トークンは切断なしで更新できます。

一般に、表示されるエラー メッセージでは、エラーを修正する方法を説明する必要があります。 何らかの理由でエラー メッセージの詳細にアクセスできない場合は、次のことを確認してください。

  • 使用する SAS またはその他のセキュリティ トークンの有効期限が切れていない。
  • X.509 証明書認証の場合、デバイス証明書またはデバイスに関連付けられている CA 証明書の有効期限が切れていません。 X.509 CA 証明書を IoT Hub に登録する方法については、「 チュートリアル: テスト用の証明書を作成してアップロードする」を参照してください。
  • X.509 証明書の拇印認証では、デバイス証明書の拇印が IoT Hub に登録されます。
  • 認証資格情報は、ご使用のプロトコルに対して正しい形式に整えられています。 詳細については、「 Microsoft Entra ID を使用して IoT Hub へのアクセスを制御する」を参照してください。
  • 使用される承認規則には、要求された操作のアクセス許可があります。
  • "principal..." で始まる最後のエラー メッセージについては、ユーザーに適切なレベルの Azure RBAC アクセス許可を割り当てることで、このエラーを解決できます。 たとえば、IoT Hub の所有者は、すべてのアクセス許可を付与する "IoT Hub データ所有者" ロールを割り当てることができます。 アクセス許可の不足の問題を解決するには、このロールを試してください。

一部のデバイスでは、デバイスの時刻が 5 分を超えるサーバー時刻と異なる場合に、時間ドリフトの問題が発生する可能性があります。 このエラーは、デバイスが何週間も何か月も問題なく IoT ハブに接続しているが、接続が継続的に拒否され始めた場合に発生する可能性があります。 このエラーは、IoT ハブに接続されているデバイスのサブセットに固有の場合もあります。これは、デバイスが最初に接続またはオンになるタイミングに応じて異なる速度で時間ドリフトが発生する可能性があるためです。

多くの場合、NTP を使用して時刻同期を実行するか、デバイスを再起動すると (ブート シーケンス中に時刻同期を自動的に実行できます)、問題が修正され、デバイスが再び接続できるようになります。 このエラーを回避するには、NTP を使用して定期的な時刻同期を実行するようにデバイスを構成します。 デバイスエクスペリエンスのドリフトの量に応じて、毎日、毎週、または毎月の同期をスケジュールできます。 デバイスで定期的な NTP 同期を構成できない場合は、定期的な再起動をスケジュールします。

403002: IoT Hub クォータを超えました。

IoTHubQuotaExceeded 403002エラーで IoT Hub への要求が失敗する場合があります。 また、Azure portal では、IoT Hub デバイスの一覧が読み込まれません。

このエラーは、通常、IoT ハブの 1 日あたりのメッセージ クォータを超えた場合に発生します。 このエラーを解決するには:

一括インポート ジョブは、IoT ハブに登録されているデバイスの数が IoT ハブのクォータ制限に近づいたり、クォータ制限を超えた場合にも、このエラーを返す可能性があります。 詳細については、「IoT Hub デバイス ID を一括でインポートおよびエクスポートする」の「インポート ジョブのトラブルシューティング」セクションを参照してください。

403004 デバイスの最大キューの深さを超えました

クラウドからデバイスへのメッセージを送信しようとすると、エラー 403004 または DeviceMaximumQueueDepthExceeded で要求が失敗する場合があります。

このエラーの根本的な原因は、デバイスに対してエンキューされたメッセージの数が キューの制限を超えているということです。

この制限に達している最も可能性の高い理由は、HTTPS を使用してメッセージを受信しているためです。これにより、 ReceiveAsyncを使用してポーリングが継続され、IoT Hub によって要求が調整されます。

HTTPS を使用したクラウドからデバイスへのメッセージでサポートされるパターンは、メッセージのチェック頻度が低い (25 分未満) デバイスが断続的に接続されています。 キューの制限に達する可能性を減らすには、クラウドからデバイスへのメッセージの AMQP または MQTT に切り替えます。

または、デバイス側のロジックを強化して、キューに入ったメッセージをすばやく完了、拒否、または破棄したり、有効期間を短縮したり、送信するメッセージの数を減らすことを検討します。 詳細については、「IoT ハブからのクラウドからデバイスへのメッセージングについて」の「メッセージの有効期限 (有効期限)」セクションを参照してください。

最後に、 キューの消去 API を使用して、制限に達する前に保留中のメッセージを定期的にクリーンアップすることを検討してください。

403006 デバイスのアクティブなファイルアップロードの上限を超えました

DeviceMaximumActiveFileUploadLimitExceeded 403006エラー コードと"アクティブなファイル アップロード要求の数が 10 を超えることはできません" というメッセージが表示され、ファイルのアップロード要求が失敗する場合があります。

このエラーは、各デバイス クライアントが ファイルの同時アップロードに制限されているために発生します。 ファイルのアップロードが完了したときにデバイスが IoT Hub に通知しない場合は、制限を簡単に超えることができます。 信頼性の低いデバイス側ネットワークは、一般的にこの問題を引き起こします。

このエラーを解決するには、デバイスが IoT Hub ファイルのアップロード完了をすぐに通知できることを確認します。 次に、 ファイル アップロード構成の SAS トークン TTL を減らしてみてください。

404001 デバイスが見つかりません

C2D メッセージ、ツインの更新、ダイレクト メソッドなどのクラウドからデバイスへの (C2D) 通信中に、 DeviceNotFound 404001エラーで操作が失敗する場合があります。

IoT Hub でデバイスが見つからないため、操作に失敗しました。 デバイスが登録されていないか、無効になっています。

このエラーを解決するには、使用したデバイス ID を登録してから、もう一度やり直してください。

404103 デバイスがオンラインでない

デバイスがオンラインの場合でも、 DeviceNotOnline 404103 エラーでデバイスへのダイレクト メソッドが失敗する場合があります。

デバイスがオンラインであるとわかっていて、それでもエラーが発生する場合は、エラーはダイレクトメソッドコールバックがデバイスに登録されていないために発生した可能性があります。

ダイレクト メソッド コールバック用にデバイスを適切に構成する方法の詳細については、「デバイスで ダイレクト メソッドを処理する」の「デバイスでのダイレクトメソッドの処理」セクションを参照してください。

404104 デバイス接続をリモートで閉じる

デバイスが一定の間隔 (65 分ごとなど) で切断され、IoT Hub リソース ログに DeviceConnectionClosedRemotely 404104 表示されることがあります。 IoTHubUnauthorized 401003と、成功したデバイス接続イベントが 1 分も経たないうちに表示されることがあります。

または、デバイスがランダムに切断され、IoT Hub リソース ログ に DeviceConnectionClosedRemotely 404104表示されます。

多くのデバイスが一度に切断されるか、接続済みデバイス(connectedDeviceCount)メトリックが低下し、Azure Monitor ログには通常よりも404104 DeviceConnectionClosedRemotely500xxx 内部エラーが増加していることが確認できます。

このエラーは、 IoT Hub への接続に使用される SAS トークン の有効期限が切れたために発生する可能性があります。これにより、IoT Hub がデバイスを切断します。 デバイスがトークンを更新すると、接続が再確立されます。 たとえば、 SAS トークンは C SDK の既定で 1 時間ごとに期限切れになり、通常の切断につながる可能性があります。 詳細については、 IoTHubUnauthorized 401003を参照してください。

その他の可能性は次のとおりです。

  • デバイスが MQTT キープアライブよりも長く基になるネットワーク接続を失ったため、リモートアイドルタイムアウトが発生します。MQTT キープアライブ設定は、デバイスごとに異なる場合があります。
  • デバイスは TCP/IP レベルのリセットを送信しましたが、アプリケーション レベルの MQTT DISCONNECTを送信しませんでした。 基本的に、デバイスは基になるソケット接続を突然閉じました。 古いバージョンの Azure IoT SDK のバグによって、この問題が発生することがあります。
  • デバイス側のアプリケーションがクラッシュしました。

または、IoT Hub で一時的な問題が発生している可能性があります。 詳細については、 500xxx 内部エラーを参照してください。

このエラーを解決するには:

  • IoTHubUnauthorized 401003エラーのガイダンスを参照してください。
  • 接続をテストして、デバイスが IoT Hub に適切に 接続されていることを確認します。 ネットワークが信頼性が低い場合や断続的な場合は、キープアライブ値を増やすことはお勧めしません。これは、検出 (Azure Monitor アラートなど) の時間がかかる可能性があるためです。
  • 最新バージョンの Azure IoT Hub SDK を使用します
  • 500xxx 内部エラーのガイダンスを参照してください。

Azure IoT device SDK を使用して接続を確実に管理することをお勧めします。 詳細については、「デバイスの再接続を管理して回復性の高いアプリケーションを作成する」を参照してください。

409001 デバイスは既に存在します

IoT Hub にデバイスを登録しようとすると、 DeviceAlreadyExists 409001エラーで要求が失敗する場合があります。

このエラーは、IoT ハブに同じデバイス ID を持つデバイスが既に存在するため発生します。

このエラーを解決するには、別のデバイス ID を使用してやり直してください。

LinkCreationConflict 409002エラーが、デバイスの切断または cloud-to-device メッセージエラーと共にログに表示されることがあります。

通常、このエラーは、IoT Hub がクライアントに複数の接続があることを検出した場合に発生します。 実際、既存の接続を持つデバイスに対して新しい接続要求が到着すると、IoT Hub はこのエラーで既存の接続を閉じます。

最も一般的なケースでは、別の問題 ( 404104 DeviceConnectionClosedRemotely など) によってデバイスが切断されます。 デバイスはすぐに接続の再確立を試みますが、IoT Hub では引き続きデバイスが接続済みと見なされます。 IoT Hub は以前の接続を閉じ、このエラーをログに記録します。

または、デバイス側のロジックに障害が発生すると、既に接続が開いているときにデバイスが接続を確立します。

このエラーを解決するには、通常、このエラーが別の一時的な問題の副作用として表示されるため、トラブルシューティングできる他のエラーをログで探します。 それ以外の場合は、接続が切断された場合にのみ、新しい接続要求を発行してください。

412002 デバイス メッセージ ロックが失われました

クラウドからデバイスへのメッセージを送信しようとすると、 DeviceMessageLockLost 412002エラーで要求が失敗する場合があります。

このエラーは、デバイスがキューからクラウドからデバイスへのメッセージを受信すると (たとえば、 ReceiveAsync()を使用して)、IoT Hub が 1 分間のロック タイムアウト期間にメッセージをロックするためです。 ロックタイムアウトが切れた後にデバイスがメッセージを完了しようとした場合、IoT Hubがこの例外を発生させます。

IoT Hub は、1 分間のロック タイムアウト期間内に通知を受け取らない場合、メッセージを エンキュー状態 に戻します。 デバイスはメッセージの受信を再試行できます。 今後エラーが発生しないようにするには、メッセージを受信してから 1 分以内にメッセージを完了するデバイス側ロジックを実装します。 この 1 分間のタイムアウトは変更できません。

429xxx スロットリング例外

IoT Hub への要求が、 次のような 429 で始まるエラーで失敗する場合があります。

  • 429000 - 要求過多(GenericTooManyRequests)
  • 429001 – ThrottlingException: 要求された操作の 調整制限 を超えています。
  • 429002 - ThrottleBacklogLimitExceeded: スロットルによるバックログ内の要求の数がバックログの制限を超えています。
  • 429003 - ThrottlingBacklogTimeout: 調整のためにバックログされた要求が、バックログ キューで待機中にタイムアウトしました。
  • 429004 - ThrottlingMaxActiveJobCountExceeded
  • 429005 – デバイススロットリングリミット超過

429001は、Azure Monitor の [調整エラーの数] メトリックでのみ監視できます。 現時点では、他の調整エラーにはメトリックは関連付けされていませんが、ログにキャプチャされます。

これらのエラーを解決するには、テレメトリ メッセージ送信試行 メトリックを、以前に指定された制限と比較し、スロットリング制限に達しているかどうかを確認してください。 スロットリングエラーの数メトリックを確認することもできます。 これらのメトリックの詳細については、「 デバイス テレメトリ メトリック」を参照してください。 メトリックを使用して IoT ハブを監視する方法については、「 Azure IoT Hub の監視」を参照してください。

IoT Hub は 429001を返します。ThrottlingException は、制限に違反した後で長時間続けた場合にのみ発生します。 この遅延は、IoT ハブがバースト トラフィックを受け取った場合にメッセージが破棄されないように行われます。 一方、IoT Hub では操作スロットル レートでメッセージが処理されるため、バックログで大量のトラフィックがあると、速度が低下する可能性があります。 詳細については、「IoT Hub のクォータと調整」の「トラフィックの整形」セクションを参照してください。

クォータまたは調整の制限に達している場合は、IoT ハブのスケールアップを検討してください。

500xxx 内部エラー

IoT Hub への要求が、500 で始まるエラーまたは何らかの "サーバー エラー" で失敗する場合があります。次のような可能性があります。

  • 500001 ServerError: IoT Hub でサーバー側の問題が発生しました。

  • 500008 GenericTimeout: IoT Hub がタイムアウトする前に接続要求を完了できませんでした。

  • ServiceUnavailable (エラー コードなし):IoT Hub で内部エラーが発生しました。

  • InternalServerError (エラー コードなし):IoT Hub で内部エラーが発生しました。

500xxx エラー応答には多くの原因が考えられます。 いずれの場合も、問題は一時的である可能性が最も高いです。 IoT Hub チームは SLA の維持に努めますが、IoT Hub ノードの小さなサブセットで一時的な障害が発生することがあります。 問題が発生しているノードにデバイスが接続しようとすると、このエラーが表示されます。

500xxx エラーを軽減するには、デバイスから再試行を発行します。 再試行を自動的に管理するには、最新バージョンの Azure IoT Hub SDK を使用してください。 一時的な障害処理と再試行のベスト プラクティスの詳細については、「 一時的な障害処理」を参照してください。

問題が解決しない場合は、 Resource HealthAzure の状態 を確認して、IoT Hub に既知の問題があるかどうかを確認します。 手動フェールオーバー機能を使用することもできます。

既知の問題がなく、問題が解決しない場合は、 サポートに問い合わせて 詳細な調査を行います。

503003 パーティションが見つかりません

IoT Hub への要求が PartitionNotFound 503003エラーで失敗する場合があります。

このエラーは IoT Hub の内部であり、一時的な可能性があります。 詳細については、 500xxx 内部エラーを参照してください。

このエラーを解決するには、 500xxx 内部エラーを参照してください。

504101 ゲートウェイのタイムアウト

IoT Hub からデバイスにダイレクト メソッドを呼び出そうとすると、 GatewayTimeout 504101エラーで要求が失敗する場合があります。

このエラーは、IoT Hub でエラーが発生し、ダイレクト メソッドがタイムアウトする前に完了したかどうかを確認できなかったために発生します。または、以前のバージョンの Azure IoT C# SDK (<1.19.0) を使用している場合、バグが原因で、デバイスと IoT Hub の間の AMQP リンクをサイレント で削除できます。

このエラーを解決するには、再試行を発行するか、最新バージョンの Azure IOT C# SDK にアップグレードします。