こんにちは、Shimaco(@shimacotrip)です。
最近、仕事でタイトルのような問題に遭遇し、結構悩んだのでまとめておきたと思います。
状況としては、
- IoT EdgeからIoT Edgeに対してメッセージ送信できるようになった。
- メデタシメデタシと思っていたのも束の間。大体、1週間以内に疎通が切れてしまう(再現性あり)
- IoT Edgeを再起動すると再度通信が始まるという、原因不明だが解決方法は分かっているという気持ち悪い状況
ちなみに調べた限りでは、日本語・英語ともに解決策に至る記事には巡り合えませんでした。
私の環境はこんな感じです。
- IoT Edge Runtime1.2
- IoT Edgeのインストール先はOpenblocks(OS debian10.x)
- Openblocksはwlan0のNICのみを有効化(つまり無線LANに接続)
- 接続先の無線LANは閉域網であり、インターネットに出る際はプロキシ経由となる。
原因を知るために
ログ解析との闘いになる。
しかもログが数日で上書きされるため、ちょうど事象発生時のログが見れない!なんてこともあり、ログの保持期間を長めにしたりと事前の小細工も必要でした。
まず、カスタムモジュールのログの出力を見てみる。特に異常なさそう。
続いて、syslog。特に問題なさそう。
Agentlogには、
「接続できなくなった」という趣旨が1行出力されるだけで、ヒントになりえないログが出力されていました。
Edgehubのログは?
最も有力なログが残されていたのはこちら。でも、めちゃめちゃに長くて解析には苦労しました。
このメッセージを頼りに調べるも、
2017-11-28 18:46:19 [INF] – Edge agent attempting to connect to IoT Hub via AMQP… 2017-11-28 18:46:49 [INF] – Edge agent attempting to connect to IoT Hub via AMQP over WebSocket…
しかも類似の状況がなく(あったけど解決していない)、手がかりがない。
そしてどうしたか?
こんな時はいつも初心に帰ることを意識している。さて、設定したときのドキュメントを見直すか。
IoT Edge ランタイムでは既定で、AMQP を使用して IoT Hub と通信します。 一部のプロキシ サーバーでは、AMQP ポートをブロックします。 この場合は、WebSocket 経由で AMQP を使用するように、edgeAgent を構成することも必要になります。 UpstreamProtocol パラメーターをコメント解除します。
ネットワーク プロキシ対応のデバイスを構成する – Azure IoT Edge | Microsoft Docs
あれ、確か、ログにこう書いてあった。
[INF] – Edge agent attempting to connect to IoT Hub via AMQP over WebSocket…
AMQP via Websocketで通信していることが問題?
AMQP via Websocketって何?
こちらの記事の通り、既定ではAMQP(ポート番号:5671)で通信すればよいものを、敢えてWebsocket経由(ポート番号:443)で通信しているのが問題なの?と思い、
configファイルを確認するとやはり UpstreamProtocol パラメーターのコメントが解除されていた。
下記の通り、UpstreamProtocol をコメント化し、
[agent]
name = “edgeAgent”
type = “docker”
[agent.env]
# “RuntimeLogLevel” = “debug”
# “UpstreamProtocol” = “AmqpWs”
“https_proxy” = “<proxy URL>”
再起動。
それによって、疎通が途切れなくなった。解決。
注)IoT Edge Runtime1.3もリリースされたらしく、もしからしたらRuntime1.3では別の問題が起きるのかも。
似たような状況で悩んでいる方の一助になれば幸いです。