現象

シェルで下記のコマンドを実装しています。
サイクルテストのため、シェルをスケジューラに登録して繰り返しで実行します。たまに下記のエラーが出ます。

エラー:
An error occurred(Throttling) when calling the listStacks operation(reached max retries:2) Rate exceededAn error occurred(Throttling) when calling the listStacks operation(reached max retries:2) Rate exceeded

訳文:
listStacks操作の呼び出し時にエラーが発生しました(スロットル)(最大再試行回数に達しました:2)レートを超えました

実装内容抜粋:
[aws cloudformation list-stacks]でスタックが存在しているかどうかをチェックし、存在する場合、スタックを削除します。

①スタックの存在チェックコマンド

aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE | grep -e "EC2-Web"

②スタック削除コマンド

aws cloudformation delete-stacks --stack-name "EC2-Web"

原因

AWSのAPIコールには1秒間に発行できる回数の上限があり、APIリクエストが最大レートを超えた場合「Rate exceeded」(レート超過)エラーが生成されAPIコートがスロットリングされます。

AWS公式より抜粋:
AWS SDK を使用していない場合は、サーバーエラー(5xx)またはスロットリングエラーを受け取る元のリクエストを再試行する必要があります。ただし、クライアントエラー (4xx) は、再試行する前にリクエストを修正して問題を解決する必要があることを示します。

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

解決方法

下記を参考に失敗した場合、sleep時間を入れてから再試行することで解決しました。

[スタックの存在チェックコマンド]
実行後に戻り値を判定、失敗した場合、60秒待ってから再度同じコマンドを実行する。

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

Last modified: 2021-06-30

Author