はじめに
ECSタスクの終了をコマンドから確認できる便利なAWS CLIのコマンド(aws ecs wait tasks-stopped)ですが、ECSタスクが終了していないにもかかわらずコマンドが終了してしまう事象に遭遇しました。
$ /usr/local/bin/aws ecs wait tasks-stopped --cluster ${cluster_name} --tasks ${task_id} Waiter TasksStopped failed: Max attempts exceeded
原因
100回チェックに失敗すると、コマンドが終了する仕様によるもの。
This will exit with a return code of 255 after 100 failed checks.
tasks-stopped — AWS CLI 2.8.2 Command Reference
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecs/wait/tasks-stopped.html
対策
今回のケースでは、ジョブ実行サーバで実行するスクリプト内にてタスク終了チェックを実装したかったため、スクリプト内で工夫することとしました。
tasks-stoppedコマンドが終了した場合、ECSタスクの終了状態を確認し、
- 終了状態が"STOPPED"の場合は、ECSタスクが終了しているので処理を継続
- 終了状態が"STOPPED"ではない場合は、待ち時間を設け、再度タスクの終了状態を確認し、終了状態となるまで確認を続ける
以上の機能を実装することで、長時間のタスクにおいてもtasks-stoppedコマンドと同等の機能を実現することとしました。
(一部抜粋) while [ ${count} -le ${max_count} ] do /usr/local/bin/aws ecs wait tasks-stopped --cluster ${cluster} --tasks ${task_arn1} task_status=$(/usr/local/bin/aws ecs describe-tasks --cluster ${cluster} --tasks ${task_arn1} --query "tasks[0].lastStatus" --output text) if [ "${task_status}" = "STOPPED" ];then break fi count=`expr ${count} + 1` sleep 10 done
おわりに
コマンド単体では制約があっても、少し工夫することで問題解決可能な事例でした。
参考資料
Task lifecycle
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-lifecycle.html