Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

aws ecs wait tasks-stoppedコマンド利用時の注意点

はじめに

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