AWSIoTPythonSDKを使ってpublishしたところconnect timed outというエラーが発生したので予防策を確認した結果を共有します。
事象 エッジデバイスからIoTCoreにpublishするとconnect timed outが発生
以下のようにオンプレのエッジデバイスからpublishをおこなったところ、エラーが発生しました。
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サポートに泣きつきました。
ネットワークの疎通性が原因 低頻度ではあるがどうしても発生してしまう
ネットワークの一時的な疎通性の問題によりタイムアウトが発生した可能性がある旨の回答をいただきました。AWSではこのような一時的な疎通の問題を解決するのに努力しているが完全に解決には至っていないようです。
どうすればよいのか? 呼び出し側でリトライを実装する
AWSでは一時的な問題についてはクライアント側にてエクスポネンシャルバックオフでのリトライを実施いただくことを推奨しているようです。
エクスポネンシャルバックオフとは指数関数リトライとも呼ばれ、リトライの間隔を1秒→2秒→4秒… といった感じに倍々に増やしていくリトライのことです。
シンプルな再試行に加えて、各 AWS SDK は、より良いフロー制御のためにエクスポネンシャルバックオフアルゴリズムを実装します。エクスポネンシャルバックオフの背後にある考え方は、連続したエラー応答の再試行間の待機時間を徐々に長く使用することです。最大遅延間隔と最大再試行回数を実装する必要があります。最大遅延間隔と最大再試行回数は、必ずしも固定値であるとは限らず、実行されるオペレーション、およびネットワークレイテンシーなどのその他のローカル要因に基づいて設定する必要があります。
AWSでのエラー再試行とエクスポネンシャルバックオフ
クラウドは冪等性が命ということを改めて実感しました。
冪等性(べきとうせい)とはある操作を1回行っても複数回行っても結果が同じであることをいう意味です。
PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!
SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ
システムエンジニア
AWSを中心としたクラウド案件に携わっています。
IoTシステムのバックエンド開発、Datadogを用いた監視開発など経験があります。
IT資格マニアでいろいろ取得しています。
AWS認定:SAP, DOP, SAA, DVA, SOA, CLF
Azure認定:AZ-104, AZ-300
ITIL Foundation
Oracle Master Bronze (DBA)
Oracle Master Silver (SQL)
Oracle Java Silver SE
■略歴
理系の大学院を卒業
IT企業に就職
AWSのシステム導入のプロジェクトを担当