AWSIoTPythonSDKでのpublish時のconnect timed out

AWSIoTPythonSDKを使ってpublishしたところconnect timed outというエラーが発生したので予防策を確認した結果を共有します。

目次

事象 エッジデバイスからIoTCoreにpublishするとconnect timed outが発生

以下のようにオンプレのエッジデバイスからpublishをおこなったところ、エラーが発生しました。

connect timed out
図1 connect timed out発生個所


エッジデバイスからIoTCoreへのメッセージ送信もできていません。
使用したSDKの詳細は以下に掲載します。

publish(topic, payload, QoS)


AWS公式APIリファレンス
github AWSIoTPythonSDK
なお、AWSIoTにはpublishのtpsやconnectionの数に上限がありますが、上限には達していません。
参考:AWS IoTクオータ

Inbound publish requests per second per account インバウンド発行リクエストのカウントには、クライアントまたはルールエンジンにルーティングする前に IoT Core が処理するすべてのメッセージが含まれます。例えば、予約済みトピックで 1 つのメッセージを発行すると、シャドウ更新、シャドウドキュメント、およびシャドウデルタに対して 3 つの追加メッセージが発行される可能性があるため、4 つのリクエストとしてカウントされます。一方、a/b のような予約されていないトピックでは、1 つのリクエストとしてカウントされます。 20000 2000 はい
AWS IoT Core エンドポイントとクォータ

原因調査 原因不明だったのでサポートを頼りました

上限に引っかかっているわけでもなく、たまにしか発生しない。まったく原因がわからなかったのでAWSサポートに泣きつきました。

ネットワークの疎通性が原因 低頻度ではあるがどうしても発生してしまう

ネットワークの一時的な疎通性の問題によりタイムアウトが発生した可能性がある旨の回答をいただきました。AWSではこのような一時的な疎通の問題を解決するのに努力しているが完全に解決には至っていないようです。

どうすればよいのか? 呼び出し側でリトライを実装する

AWSでは一時的な問題についてはクライアント側にてエクスポネンシャルバックオフでのリトライを実施いただくことを推奨しているようです。

エクスポネンシャルバックオフとは指数関数リトライとも呼ばれ、リトライの間隔を1秒→2秒→4秒… といった感じに倍々に増やしていくリトライのことです。

AWSでのエラー再試行とエクスポネンシャルバックオフ

シンプルな再試行に加えて、各 AWS SDK は、より良いフロー制御のためにエクスポネンシャルバックオフアルゴリズムを実装します。エクスポネンシャルバックオフの背後にある考え方は、連続したエラー応答の再試行間の待機時間を徐々に長く使用することです。最大遅延間隔と最大再試行回数を実装する必要があります。最大遅延間隔と最大再試行回数は、必ずしも固定値であるとは限らず、実行されるオペレーション、およびネットワークレイテンシーなどのその他のローカル要因に基づいて設定する必要があります。

AWSでのエラー再試行とエクスポネンシャルバックオフ

クラウドは冪等性が命ということを改めて実感しました。

冪等性(べきとうせい)とはある操作を1回行っても複数回行っても結果が同じであることをいう意味です。


PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!

SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ

ランキング

ランキングに参加しています。クリックして応援いただけると嬉しいです。
にほんブログ村 IT技術ブログ クラウドコンピューティングへ
にほんブログ村
AWSランキング
AWSランキング

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次