Azure IoT Hub エラーを理解して解決する
この記事では、IoT Hub の使用中に発生する可能性がある一般的なエラー コードの原因と解決策について説明します。
400027 新しい接続で強制的に閉じる接続
.NET SDK と MQTT トランスポート種類の使用により、デバイスが切断され、ConnectionStatusChangeReason として Communication_Error が報告された場合、400027 ConnectionForcefullyClosedOnNewConnection エラーが表示されることがあります。 または、デバイスからクラウドへのツイン操作 (報告されたプロパティの読み取りやパッチなど) あるいはメソッドの直接呼び出しがエラー コード 400027 で失敗します。
このエラーは、別のクライアントで同じ ID を使用して IoT Hub への新しい接続が作成されたため、IoT Hub によって前の接続が閉じられたときに発生します。 IoT Hub では、同じ ID を使用して複数のクライアントが接続することを許可していません。
このエラーを解決するには、各クライアントが独自の ID を使用して IoT Hub に接続されていることを確かめます。
401003 承認されていない IoT Hub
ログを見ると、401003 IoTHubUnauthorized で切断されたデバイスがあり、それに 404104 DeviceConnectionClosedRemotely が続き、そのすぐ後に接続が成功するパターンがある場合があります。
または、IoT Hub への要求が、次のいずれかのエラー メッセージで失敗します。
- Authorization header missing (Authorization ヘッダーがありません)
- IotHub '*' does not contain the specified device '*' (IotHub '*' に指定したデバイス '*' が含まれていません)
- Authorization rule '*' does not allow access for '*' (承認規則 '*' では '*' へのアクセスが許可されていません)
- Authentication failed for this device, renew token or certificate and reconnect (このデバイスの認証に失敗しました。トークンまたは証明書を更新して再接続してください)
- Thumbprint does not match configuration: Thumbprint: SHA1Hash=*, SHA2Hash=*; Configuration: PrimaryThumbprint=*, SecondaryThumbprint=* (拇印が構成と一致しません: 拇印: SHA1Hash=*、SHA2Hash=*、構成: PrimaryThumbprint=*、SecondaryThumbprint=*)
- アクセス許可が割り当てられていないため、プリンシパル user@example.com は /exampleOperation での GET を承認されていません
MQTT の場合、一部の SDK では、SAS トークンが期限切れになったときに切断を発行するために IoT Hub を利用し、更新するタイミングを把握するため、このエラーが発生します。 そのため、
- SAS トークンが期限切れになります
- IoT Hub によって有効期限が通知され、401003 IoTHubUnauthorized でデバイスが切断されます
- デバイスでは 404104 DeviceConnectionClosedRemotely で切断が完了します
- IoT SDK により、新しい SAS トークンが生成されます
- デバイスが IoT Hub に正常に再接続されます
または、IoT Hub で、認証ヘッダー、規則、キーを認証できませんでした。 これには、現象に示されたいずれかの理由が考えられます。
デバイス接続文字列を使用する接続に IoT SDK を使う場合、このエラーを解決するための操作は不要です。 SAS トークンの有効期限が切れると、IoT SDK によって新しいトークンが再生成され、再接続されます。
既定のトークンの有効期間は、どの SDK でも 60 分です。ただし、一部の SDK では、トークンの有効期間とトークンの更新のしきい値を構成できます。 さらに、デバイスが切断され、トークンが更新されて再接続したときに生成されるエラーは、各 SDK によって異なります。 詳細、およびデバイスのログで使用されている SDK を判別する方法については、「Azure IoT SDK での MQTT デバイスの切断動作」を参照してください。
デバイス開発者の場合、エラーの量が問題になるときは、C SDK に切り替えて、有効期限が切れる前に SAS トークンを更新します。 AMQP の場合は、切断せずに SAS トークンを更新できます。
一般に、エラーを修正する方法を説明するエラー メッセージが表示されます。 何らかの理由でエラー メッセージの詳細にアクセスできない場合は、次のことを確認してください。
- 使用する SAS またはその他のセキュリティ トークンの有効期限が切れていないこと。
- X.509 証明書認証の場合、デバイス証明書またはデバイスに関連付けられている CA 証明書の有効期限が切れていません。 X.509 CA 証明書を IoT Hub に登録する方法については、「チュートリアル: テスト用の証明書を作成してアップロードする」を参照してください。
- X.509 証明書の拇印認証の場合、デバイス証明書の拇印は IoT Hub に登録されます。
- 承認の資格情報が使用するプロトコルに適した形式であること。 詳細については、「IoT Hub へのアクセスの制御」を参照してください。
- 使用される承認規則に、要求された操作に対するアクセス許可があること。
- "principal..." で始まるエラー メッセージが最後に返された場合、このエラーを解決するには、ユーザーに正しいレベルの Azure RBAC アクセス許可を割り当てます。 たとえば、IoT Hub 上の所有者は、すべてのアクセス許可を付与する "IoT Hub データ所有者" ロールを割り当てることができます。 アクセス許可の不足の問題を解決するには、このロールを試してください。
注意
一部のデバイスでは、デバイスとサーバーの時刻との差が 5 分を超えると、時間のずれの問題が発生する可能性があります。 このエラーは、デバイスが数週間または数か月間問題なく IoT ハブに接続していたのに、その後接続が拒否され続けるときに発生する可能性があります。 また、このエラーは、IoT ハブに接続されているデバイスのサブセットに固有の場合もあります。これは、デバイスが最初に接続された、またはオンになったタイミングに応じて、時間のずれが異なる速度で発生する可能性があるためです。
多くの場合、NTP を使用して時刻同期を実行するか、デバイスを再起動すると (ブート シーケンス中に時刻同期を自動的に実行できます)、問題が修正され、デバイスが再び接続できるようになります。 このエラーを回避するには、NTP を使用して定期的な時刻同期を実行するようにデバイスを構成します。 デバイスで発生するずれの量に応じて、毎日、毎週、または毎月の同期をスケジュールできます。 デバイスで定期的な NTP 同期を構成できない場合は、定期的な再起動をスケジュールします。
403002 IoT Hub クォータを超えました
IoT Hub に対する要求がエラー 403002 IoTHubQuotaExceeded で失敗している場合があります。 また、Azure portal に IoT ハブ デバイスの一覧が読み込まれていません。
このエラーは、一般には IoT ハブの 1 日あたりのメッセージ クォータを超えたときに発生します。 このエラーを解決するには、次の方法があります。
- IoT ハブ上のユニット数をアップグレードするか増やします。または、1 日あたりのクォータが更新される翌日 (UTC) まで待ちます。
- ツイン クエリやダイレクト メソッドなど、クォータに対する操作のカウント方法については、IoT Hub の価格に関するページを参照してください。
- 1 日のクォータ使用量の監視を設定するには、メトリック "Total number of messages used" (使用されているメッセージの合計数) を使用してアラートを設定します。 詳細な手順については、IoT Hub を使用したメトリックとアラートの設定に関するページを参照してください。
このエラーは、IoT ハブに登録されているデバイスの数が IoT ハブのクォータ制限に近づいたり超えたりしたときに、一括インポート ジョブによって返されることもあります。 詳しくは、「インポート ジョブのトラブルシューティング」を参照してください。
403004 デバイスのキューの深さの最大を超えました
cloud-to-device メッセージを送信しようとすると、要求がエラー 403004 または DeviceMaximumQueueDepthExceeded で失敗する場合があります。
このエラーの根本的な原因は、デバイスにエンキューされたメッセージの数がキュー制限を超えていることです。
この制限に達している最も可能性の高い理由は、HTTPS を使用してメッセージを受信しているためです。これにより、ReceiveAsync
を使用した継続的なポーリングが行われ、結果として IoT Hub で要求が調整されます。
HTTPS を使用するクラウドからデバイスへのメッセージに関してサポートされているパターンは、メッセージを低頻度 (25 分未満の間隔) でチェックするデバイスに断続的に接続されます。 キューの上限に達する可能性を低くするには、cloud-to-device メッセージに対して AMQP または MQTT に切り替えます。
または、デバイス側のロジックを強化して、キューに格納されたメッセージの完了、拒否、または破棄を迅速に行うこと、有効期限を短縮すること、または送信するメッセージ数を減らすことを検討します。 C2D メッセージの有効期限に関するセクションを参照してください。
最後に、Purge Queue API を使用して、上限に達する前に保留中のメッセージを定期的にクリーンアップすることを検討してください。
403006 デバイスのアクティブなファイルのアップロードの上限を超えました
ファイルのアップロード要求が、エラー コード 403006 DeviceMaximumActiveFileUploadLimitExceeded および "アクティブなファイルのアップロード要求数は 10 個を超えることはできません" というメッセージで失敗する場合があります。
このエラーは、各デバイス クライアントが同時ファイル アップロードに制限されているために発生します。 ファイル アップロードの完了時にデバイスから IoT Hub に通知しないと、この制限をたやすく超える可能性があります。 この問題は、通常、信頼性の低いデバイス側ネットワークが原因で発生します。
このエラーを解決するには、デバイスからすぐに IoT Hub ファイルのアップロードの完了を通知できることを確かめます。 次に、ファイル アップロードの構成に関する SAS トークンの TTL を減らすようにします。
404001 デバイスが見つかりません
C2D (cloud-to-device) メッセージ、ツイン更新、ダイレクト メソッドなどの C2D 通信中に、操作がエラー 404001 DeviceNotFound で失敗する場合があります。
IoT Hub がデバイスを見つけることができないため、操作に失敗しました。 デバイスが登録されていないか、無効になっています。
このエラーを解決するには、使用したデバイス ID を登録してから、もう一度試します。
404103 デバイスがオンラインではありません
デバイスがオンラインの場合でも、デバイスに対するダイレクト メソッドがエラー 404103 DeviceNotOnline で失敗することがあります。
デバイスがオンラインであることがわかっていてもエラーが発生する場合、ダイレクト メソッド コールバックがデバイスに登録されていないことが原因でエラーが発生した可能性があります。
ダイレクト メソッド コールバック用にデバイスを適切に構成する方法については、「デバイスでダイレクト メソッドを処理する」を参照してください。
404104 デバイス接続がリモートで閉じられました
定期的な間隔で (たとえば、65 分ごとに) デバイスが切断され、IoT Hub リソース ログに 404104 DeviceConnectionClosedRemotely が示される場合があります。 場合によっては、401003 IoTHubUnauthorized が発生し、1 分経たないうちにデバイス接続イベントが成功することもあります。
または、デバイスがランダムに切断され、IoT Hub リソース ログに 404104 DeviceConnectionClosedRemotely が示されます。
または、一度に多くのデバイスが切断され、[接続されているデバイス] (connectedDeviceCount) メトリックが低下し、Azure Monitor ログに通常よりも多くの 404104 DeviceConnectionClosedRemotely と 500xxx 内部エラーが示されます。
このエラーは、IoT Hub に接続するために使用される SAS トークンが期限切れになり、IoT Hub によってデバイスが切断されると発生する場合があります。 デバイスによってトークンが更新されると、接続は再確立されます。 たとえば、C SDK の場合、SAS トークンは既定で 1 時間ごとに期限切れになります。その結果、定期的に切断される可能性があります。 詳細については、401003 IoTHubUnauthorized に関するページを参照してください。
他にもいくつかの可能性があります。
- デバイスが基となるネットワーク接続を MQTT キープアライブよりも長く切断したため、リモート アイドル タイムアウトになりました。 MQTT キープ アライブの設定は、デバイスごとに異なる場合があります。
- デバイスからは TCP/IP レベルのリセットが送信されましたが、アプリケーションレベルの
MQTT DISCONNECT
は送信されませんでした。 つまり、デバイスによって基となるソケット接続が突然閉じられました。 この問題は、以前のバージョンの Azure IoT SDK のバグが原因で発生する場合があります。 - デバイス側のアプリケーションがクラッシュしました。
または、IoT Hub で一時的な問題が発生している可能性があります。 IoT Hub 内部サーバー エラーに関するページを参照してください。
このエラーを解決するには、次の方法があります。
- エラー 401003 IoTHubUnauthorized のガイダンスを参照してください。
- 接続をテストして、デバイスが IoT Hub に正常に接続できることを確認します。 ネットワークが信頼できない場合や断続的である場合、キープアライブ値を増やすことはお勧めしません。これは、(たとえば Azure Monitor アラートなどで) 検出に時間がかかる可能性があるためです。
- IoT SDK の最新バージョンを使用します。
- IoT Hub 内部サーバー エラーのガイダンスを参照してください。
Azure IoT device SDK を使用して接続を確実に管理することをお勧めします。 詳細については、「Azure IoT Hub device SDK を使用して、接続と信頼できるメッセージングを管理する方法」を参照してください。
409001 デバイスは既に存在します
IoT Hub にデバイスを登録しようとすると、要求がエラー 409001 DeviceAlreadyExists で失敗する場合があります。
このエラーは、同じデバイス ID を持つデバイスが IoT ハブに既に存在するために発生します。
このエラーを解決するには、別のデバイス ID を使用してやり直します。
409002 リンクの作成が競合しています
エラー 409002 LinkCreationConflict がデバイスの切断または cloud-to-device メッセージ エラーと共にログに示される場合があります。
一般に、このエラーは、クライアントに複数の接続があることが IoT Hub で検出されたときに発生します。 実際、既存の接続があるデバイスに対して新しい接続要求が到着すると、IoT Hub によって既存の接続が閉じられ、このエラーが発生します。
最も一般的なケースでは、別の問題 (404104 DeviceConnectionClosedRemotely など) によってデバイスの接続が切断されます。 デバイスではすぐに接続の再確立が試行されますが、IoT Hub ではまだデバイスが接続状態と見なされています。 IoT Hub では前の接続が閉じられ、このエラーが記録されます。
または、デバイス側のロジックに問題があると、既に接続されているときに、デバイスによって接続が確立されます。
このエラーを解決するには、通常、このエラーが別の一時的な問題の副作用として表示されるため、トラブルシューティングできる他のエラーをログで探します。 そうでなければ、接続が切断された場合にのみ、新しい接続要求を発行してください。
412002 デバイス メッセージのロックが失われました
cloud-to-device メッセージを送信しようとすると、要求がエラー 412002 DeviceMessageLockLost で失敗する場合があります。
このエラーは、デバイスが (たとえば、ReceiveAsync()
を使用して) cloud-to-device メッセージをキューから受信すると、1 分間のロック タイムアウト期間、IoT Hub によってメッセージがロックされることが原因で発生します。 ロック タイムアウトが終了した後にデバイスでメッセージの完了が試行されると、IoT Hub からこの例外がスローされます。
1 分間のロック タイムアウト期間内に IoT Hub が通知を受け取らないと、メッセージは、"エンキュー済み" の状態に戻されます。 デバイスは、メッセージの受信を再試行できます。 今後このエラーが発生しないようにするには、メッセージを受け取ってから 1 分以内にメッセージを完了するようにデバイス側のロジックを実装します。 この 1 分間のタイムアウトを変更することはできません。
429001調整の例外
IoT Hub に対する要求がエラー 429001 ThrottlingException で失敗する場合があります。
このエラーは、要求された操作で IoT Hub の調整制限を超えたときに発生します。
このエラーを解決するには、[テレメトリ メッセージ送信試行] メトリックを前述の指定された制限と比較して、調整制限に達しているかどうかを確認します。 また、"Number of throttling errors" (調整エラーの数) メトリックも確認できます。 これらのメトリックの詳細については、「デバイス テレメトリのメトリック」を参照してください。 メトリックを使用して IoT ハブを監視する方法の詳細については、「IoT Hub の監視」を参照してください。
IoT Hub から 429 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 ハブ チームは SLA を維持するために努力していますが、IoT Hub ノードのごく一部で一時的な障害が発生することがあります。 問題のあるノードにデバイスが接続しようとすると、このエラーが発生します。
500xxx エラーを軽減するには、デバイスから再試行を発行します。 自動的に再試行を管理するには、最新バージョンの Azure IoT SDK を使用してください。 一時的な障害処理と再試行のベスト プラクティスについては、「Transient Fault Handling (一時的な障害処理)」を参照してください。
問題が解決しない場合は、[リソース正常性] と [Azure の状態] で IoT Hub に既知の問題があるかどうかを確認します。 手動フェールオーバー機能を使用することもできます。
既知の問題がなく、問題が引き続き発生する場合は、サポートに問い合わせてさらに調査してください。
503003 パーティションが見つかりません
IoT Hub に対する要求がエラー 503003 PartitionNotFound で失敗する場合があります。
このエラーは IoT Hub 内部で発生し、一時的なものである可能性があります。 IoT Hub 内部サーバー エラーに関するページを参照してください。
このエラーを解決するには、 IoT Hub 内部サーバー エラーに関する記述を参照してください。
504101 ゲートウェイ タイムアウト
IoT Hub からデバイスへダイレクト メソッドを呼び出そうとすると、要求がエラー 504101 GatewayTimeout で失敗する場合があります。
このエラーは、IoT Hub でエラーが発生し、ダイレクト メソッドがタイムアウトになる前に完了したかどうかを確認できなかったことが原因で発生します。または、以前のバージョンの Azure IoT C# SDK (<1.19.0) を使用している場合、バグが原因でデバイスと IoT Hub の間の AMQP リンクが警告なしで削除されることがあります。
このエラーを解決するには、再試行を発行するか、Azure IOT C# SDK の最新バージョンにアップグレードします。