IoT Hub、IoT Edge のゲートウェイとリーフデバイスの時刻について
IoT Hub、IoT Edge のゲートウェイとリーフデバイスの時刻が一致しない場合、接続が行えなくなる事象が発生する場合があります。
IoT Edge のゲートウェイは、リーフデバイスの代わりに、IoT Hub とセキュアな接続を行うために、SAS トークンを使用します。
そして、このSAS トークンは、生成を行うクライアントの現在時刻を元に有効期限を設定しており、1 時間に1 回生成され直されます。
実際、edgeHub のログに以下のように、 “Getting new token from the client…” のログが定期的に表示されます。
[INF] - Attempting to connect to IoT Hub for client <リーフデバイス名> via AMQP...
[INF] - Existing token not found for <リーフデバイス名>. Getting new token from the client...
[INF] - Device connection removed for device <リーフデバイス名>
- SAS トークンについて
</ja-jp/azure/iot-hub/iot-hub-devguide-security#security-tokens >
=======================
IoT Hub では、デバイスとサービスの認証にセキュリティ トークンを使用することにより、ネットワーク経由でのキーの送信を回避します。
(中略)
{expiry}
1970 年1 月1 日の00 時00 分00 秒UTC からのエポック秒で表されるUTF8 文字列。
(中略)
注意
トークンの有効期間は IoT Hub コンピューターで検証されるため、トークンを生成するコンピューターのクロックのずれは最小限である必要があります。
=======================
この時、edgeHub のログに以下のエラーが表示されます。
[ERR] - Error creating or updating the cloud proxy for client <リーフデバイス名>
上記のエラーに関連する事例に、以下の記載もあります。
[V2] Windows container sometimes doesn't sync time with host, cause edgeHub failed to connect to IoT Hub. #565
<https://github.com/Azure/iot-edge/issues/565 >
=======================
Since edge runtime requires secure connection with IoT Hub, hence the time synchronization of IoT Hub DeviceClient does matter. If the client device time goes ahead (or behind) too much, IoT Hub will reject such connection from client. Then we'll got operation timeout at client side.
=======================
IoT Edge ゲートウェイを使わない場合でも、日本で動作していたデバイスを海外に持ち込んだ際に、デバイスの時刻を現地時間に設定してもタイムゾーンが日本時間のままになっていたことで、常に有効期限を過ぎたトークンが生成されることにより、接続できなくなった事例もありますので、ご留意ください。
上記の内容がお役に立てば幸いです。
Azure IoT 開発サポートチーム 津田