不測の事態にも対応!AWS Batchがジョブのタイムアウトによる自動停止をサポート

AWS Batchにおいて、従来はアプリケーション側でのタイムアウト制御が必要だったのが、ジョブ定義およびジョブ実行パラメータにタイムアウトを設定できるようになりました。この記事では、タイムアウトの挙動なども含めたアップデート内容を紹介します。
2018.04.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「これで、夜も、眠れる…」

先日のアップデートで、AWS Batchがジョブ実行タイムアウトによる自動停止に対応しましたので、其の内容をご紹介。

AWS Batch が、ジョブ実行タイムアウトによる自動停止のサポートを追加

 __
(祭) ∧ ∧
 Y  ( ゚Д゚)
 Φ[_ソ__y_l〉     タイムアウトダワッショイ
    |_|_|
    し'´J

そもそもAWS Batchは、タイムアウト設定できなかったの?

できませんでした。自分が去年参加したre:Inventの下記セッションで、その旨話されています。

簡単で効率的なAWS Batchをさらに活用する方法 #reinvent #CMP323 | Developers.IO

バッチジョブのタイムアウトの扱い

AWS Batchは、タイムアウトを検知する仕組みがない。そのため、往々にして、ジョブがスタックする。そのため、ジョブを送信したときに、環境変数BATCH_TIMEOUTに、タイムスタンプを設定。定期的にアクティブなジョブの環境変数を検知し、タイムアウト基準にヒットしたジョブは、停止している。
引用:簡単で効率的なAWS Batchをさらに活用する方法 #reinvent #CMP323

なので、今回のアップデートのインパクトは大きいんですよ。

ジョブのタイムアウトについての詳細

公式ドキュメントに詳細の記載があります。

例えば、15分間で処理を完了させたいジョブが、時々アプリケーションが無限ループに陥り処理が完了しない場合があったとします。そういうジョブは、タイムアウトを30分間に設定することで、強制的にジョブを終了可能です。

タイムアウトの最小秒数は60秒。

ジョブスタート後このカウントが始まり、タイムアウトで設定した秒数を経過すると、AWS Batchはジョブを終了します。リソース側では、SIGTERMシグナルを受信して、アプリケーションが正常に終了するようにします。さらに、30秒後にコンテナがまだ稼働している場合、AWS BatchはSIGKILLシグナルを送信し、強制的にコンテナをシャットダウンします。

タイムアウト処理はベストエフォートです。正確なタイムアウトと終了処理が必要な場合は、アプリケーション側での実装が必要です。

また、タイムアウトがカウントを開始するのは、あくまでジョブが開始した後です。コンピューティングリソースの設定不備などでそもそもジョブが開始していない場合には、このタイムアウトは適用されないので注意が必要です。

親子ジョブの場合は、子ジョブは親と同様のタイムアウト時間を引き継ぎます。

タイムアウトの設定箇所

ジョブ定義、および各ジョブの送信画面で、タイムアウトが設定できるようになっています。

タイムアウトを利用可能なリージョン

現在、AWS Batchが利用できる全てのリージョンで、タイムアウトが利用可能です。もちろん、東京リージョンも使えます。

  • 米国東部 (バージニア北部)
  • 米国西部 (北カリフォルニア)
  • 米国西部 (オレゴン)
  • 米国東部 (オハイオ)
  • カナダ (中部)
  • 欧州 (アイルランド)
  • 欧州 (ロンドン)
  • 欧州 (フランクフルト)
  • アジアパシフィック (東京)
  • アジアパシフィック (ソウル)
  • アジアパシフィック (シドニー)
  • アジアパシフィック (シンガポール)

まとめ「転ばぬ先の杖としてタイムアウトを設定しておきましょう」

バッチ処理は往々にして、外部リソースの影響により処理がスタックすることがあります。ジョブが無限ループに陥ったときなどは、コンピューターリソースを食いつぶして延々に無駄遣いしてしまう危険性もあります。

バッチ処理の内容に応じて適切なタイムアウト時間を設定しておき、不測の事態にそなえておけば、安心してAWS Batchが利用できるかと思います。

それでは、今日はこのへんで。濱田(@hamako9999)でした。