public note

aws batch list-jobs コマンドでのフィルタリング方法

AWS Batch Job のステータスを AWS CLI で確認する際のフィルタリング方法を調べました。

list-jobs コマンド

ジョブのステータスを確認するには、aws batch list-jobs コマンドを使います。

docs.aws.amazon.com

aws batch list-jobs --profile $PROFILE --region $REGION --job-queue $JOB_QUEUE 

もっとも基本的な形はこうです。こちらのコマンドをベースに、フィルタをかける方法を色々試しました(シェルは Bash で確認しています)。

フィルタリング オプション

--job-status

ジョブステータスで絞り込みます。ジョブステータスには以下の7つがあります。

  • SUBMITTED
  • PENDING
  • RUNNABLE
  • STARTING
  • RUNNING
  • SUCCEEDED
  • FAILED

job-status オプションを指定しない場合は RUNNING の結果のみが戻ります。

--filter

KeyValue 方式で指定します。Key として指定できるのは、以下に4つに限られています。

  • JOB_NAME
  • JOB_DEFINITION
  • BEFORE_CREATED_AT
  • AFTER_CREATED_AT

下2つの *_CREATED_AT は、Unix time(milliseconds) で指定します。なお filter オプションを指定した際には、job-status オプションは無視されます。そのため、job-status も抽出条件に加えたい場合は、次に紹介する query オプションで指定します。

# 今日実行したジョブを抽出する
after_created_at=$(TZ="Asia/Tokyo" date -d "2022-09-04 00:00:00" +%s&N | cut -b1-13)
aws batch list-jobs \
    (中略) \
    --filter name="AFTER_CREATED_AT",values="$after_created_at"

--query

job-status もしくは filter で抽出した結果に対して、更に絞り込みを行うために使用します*1

JMESPath 方式で指定するので、出力のデータ構造を見ながらクエリを書いていきます。

# 日本時間 2022-09-04 以降に実行したジョブのうち、ジョブ名が "test" で始まり、かつ失敗したものを抽出する。
# 抽出する情報は、JobId, jobName, status に限定する。
after_created_at=$(TZ="Asia/Tokyo" date -d "2022-09-04 00:00:00" +%s&N | cut -b1-13)
aws batch list-jobs \
    (中略) \
    --filter name="AFTER_CREATED_AT",values="$after_created_at" \
    --query "jobSummaryList[?status == 'FAILED' && starts_with(jobName, 'test')].[jobId, jobName, status]"
# 日本時間 2022-09-04 以降に実行したジョブのうち、ジョブ名が "test" で始まり、かつ終了したものを抽出する。
# 抽出する情報は、JobId, jobName, status に限定する。
status_list='["SUCCEEDED", "FAILED"]'
after_created_at=$(TZ="Asia/Tokyo" date -d "2022-09-04 00:00:00" +%s&N | cut -b1-13)
aws batch list-jobs \
    (中略) \
    --filter name="AFTER_CREATED_AT",values="$after_created_at" \
    --query "jobSummaryList[?contains('$status_list', status) && starts_with(jobName, 'test')].[jobId, jobName, status]"

余談: ジョブの一括キャンセル

ジョブを投入したものの、やっぱりキャンセルしよう...となったことがあると思います。大量にジョブを作っていた場合には Management Console でキャンセルするのはかなりつらいです。そうした声もあってのことか、AWS Knowledge Center でキャンセル方法を紹介しています。

aws.amazon.com

こちらの方法では、list-jobs コマンドによってキャンセル対象の絞り込みをしています。ここで上記のフィルタリング方法を使いこなせれば、そのときの実行状況に合わせて細かいハンドリングができそうです。

*1:job-status と filter が Pre-filter、query が Post-filter という位置づけであるため、Pre-filter で絞り込みをしておくとレスポンス効率がよいと理解しています。