awscliのwaitコマンドが便利だった

ECSにデプロイするスクリプトを書くとき、waitコマンドがとても便利だった。

デプロイする前にいくつかのECSタスクを実行し完了を待ってからデプロイしたい場合、ECSタスクのステータスをポーリングして完了したかどうかを監視する必要がある。aws ecs run-taskは即座に終了し、タスクの実行自体は非同期に行われるからだ。

そうしたとき、waitコマンドを使うと簡単にポーリングを行うことができる。

aws ecs wait tasks-stopped --tasks ${task_arn1} ${task_arn2}

これはaws ecs describe-tasksを定期的に実行してレスポンスからステータスを取得し、それが完了するまで待つ。--tasksオプションはECSタスクのARNを複数指定できるので、複数のタスクがすべて完了するのを待つことができる。

ECSタスクのARNはaws ecs run-taskのレスポンスから取得できる。実際にはこんな感じで書くと思う。

task_arn1=$(aws ecs run-task \
  --task-definition my-task-definition \
  --query "tasks[0].taskArn" \
  --output text)

aws ecs wait tasks-stopped --tasks ${task_arn1}

気をつける必要があるのは、ECSタスクが完了したかどうかは分かるものの、それが成功したのか失敗したのかは分からないということだ。なので、waitの後でdescribe-tasksによって失敗したかどうかをチェックする必要があるとおもう。

waitコマンドはタスクの完了だけでなくサービスのステータスの監視でも使えるし、またECS以外にもEC2などで使えるのでawscliを使ったスクリプトを書くときには今後もお世話になりそう。