概要
Fargate を RunTask するときに稀にエラーで起動できないときがある。
エラーの種類は様々あるが、 ECS.ServerException
が生じたときに、表面上はエラーだが実際はタスク起動に成功しているときがあった。
※ 2022/06 時点の情報です。AWS 側の基盤改善により、将来的に問題が解消されている可能性があります。
詳細
Step Functions から RunTask させており、TaskFailed となった。
Service Unavailable. Please try again later. (Service: AmazonECS; Status Code: 500; Error Code: ServerException; Request ID: 6eb18907-4228-4a73-b3b2-569ad0b4c436; Proxy: null)
エラーメッセージにも 「try again」 と書かれているので、パッと見は RunTask に失敗したようにみえる。
だが、RunTask が失敗したのとほぼ同時刻にタスクが起動されていることを確認した。
サポートに確認したところ、以下のような回答を得た。
こちらの挙動について調査したところ、ECS の基盤側の問題により、RunTask API の呼び出しが ServerException にて失敗した際にもタスクが実行される場合があることを確認いたしました。
担当部署でもこちらの問題を認識しており、修正対応にあたっておりますが、現時点におきまして対応完了時期は未定となっております。
大変恐縮ではございますが、現状の動作として、ServerException にて RunTask API が失敗した際、多くの場合はタスクは実行されないものの、タスクが実行される場合もあるものとお考えいただけますと幸いです。
問題
多くの場合はタスクは実行されないものの、タスクが実行される場合もあるものとお考えいただけますと幸いです
という仕様が少し厄介。
Step Functions で RunTask をしているが、RunTask に失敗したときにはリトライをするようなステートマシンにしている。
だが今回のように「ServerException が起きたけど実はタスクが起動」されてしまった場合、リトライによってタスクが 2 つ分起動されてしまう。
Lambda などでうまく実装して、多重起動されないように制御する必要がある。(どうやって?)
一方、AWS のサポートから提示いただいたのは、実行されるタスクに冪等性や排他制御を持たせること。これができるなら一番良い。
まとめ
- RunTask で ECS.ServerException が起きてもタスクが起動されることが稀にある
- ECS.ServerException をトリガーに RunTask が自動リトライされる場合は要注意