AWS Batchの調査
2種類の「バッチ処理」
A 定型業務におけるバッチ処理
夜間バッチなど。ジョブの起動予約や順序を定義して、ジョブを実行するもの。
B 大規模計算におけるバッチ処理
スパコンで行う大規模科学計算、CGレンダリング、機械学習における学習プロセス、ゲノム解析など。
AWS BatchはBの用途。
スパコンは高価で空き時間がもったいない→ジョブをキューイングしてできるだけ効率的にジョブ実行を行おう!このジョブをマネジメントするのがジョブスケジューラ。
オンプレだとリソースが固定。ジョブの待ち時間が長くなったり、無駄が出たりする。また、インフラの管理も必要→クラウドの出番!
クラウドのバッチコンピューティング
ジョブが実行されるときに、必要なコンピューティングリソースを作成。ジョブがない時にはリソースを削除することで、コストが減らせる。
AWS Batch
EC2またはFargate上でDockerコンテナを実行。
バッチ環境をフルマネージドで提供している。(キュー、コンピューティング環境、タイムアウト・リトライの処理)
他のサービスが適している場合
数秒で終わるジョブ→Step Functions+Lambda
アーキテクチャ
batch
コンピューティング環境はECSが利用される。ジョブ定義
ジョブを作成するテンプレート。コンテナイメージや実行コマンド、コンピューティングリソースなどのタスク定義。ジョブのリトライやタイムアウトも指定できる。
ジョブ
元となるジョブ定義や投入先ジョブキュー。ジョブ定義を上書くことも可能。シングルジョブor配列ジョブの指定や、ジョブの依存関係等も指定できる。
ジョブキュー
ジョブの待ち行列となる場所。
ジョブキューの優先度を設定できる。コンピューティング環境では複数のジョブキューを指定することができ、優先度の高いジョブキュー内のジョブを先にスケジュールする。
コンピューティング環境
計算を行うECSクラスター。
マネージドorアンマネージド。ジョブの最大最小vCPU数を設定する。最小vCPUを0にすることで、ジョブがない時はインスタンスを起動しないようにできる。
使用できるインスタンスタイプを指定する。
ジョブ状態の遷移
ジョブの投入方法
- ユーザが手動で投入
- APIから投入(Lambdaから投入など)
- EventBridgeから投入
スポットの利用
EC2, Fargate共にスポットインスタンスを使用可能。
Tips
- キューを分けて、通常ジョブはスポット、優先度の高いジョブはオンデマンドに割り振ることができる
- 最初はスポットで処理し、失敗した場合はSNSを経由してオンデマンド用のジョブキューに投入する
AWS Batchか、ECS Taskか
両者の違い
どちらもECSクラスター上にコンピューティングリソースを作成して、ジョブを実行する。
ECS Taskは1つのタスク(1つ以上のコンテナ)をクラスター上で即時実行する。終了するとコンピューティングリソースは削除される。
一方AWS Batchは利用者がジョブをキューに積み、AWS Batchが管理する空いているコンピューティングリソースでジョブを実行してくれる。簡単に言えば、ジョブをキューイングしておけば、よしななタイミングで実行しておいてくれるサービスである。コンピューティングリソースはAWS Batchがプールしており、ジョブの量に応じて自動的にスケールしてくれる。コンピューティングリソースの範囲を決めるので、並行できるジョブに制限がかけられる。
使い所
AWS Batchのベストプラクティスに沿うと、「非常に短いジョブ」と「即時に実行する必要のあるジョブ」の場合はLambdaまたはECS Taskを推奨する。
「非常に短いジョブ」については、ジョブの実行時間よりもジョブのスケジューリング時間が長くなる可能性があるからである。そんなに待つなら、ECS Taskでパッと実行してしまったほうがよい。
「即時に実行する必要のあるジョブ」については、AWS Batchが即座にジョブを実行するかわからないからである。他のジョブの実行状況によるため、キューイングしたジョブが即座に実行されるかはわからない。AWS Batchあくまでジョブのキューイングおよび自動実行サービスということを認識しておく。
反対に長時間、並列して実行する可能性がある場合はAWS Batchが良い。FargateはENIを使用するため、並行して長時間のジョブが実行される場合はIPアドレスを消費する。このため、IPアドレスが確保できない場合、ジョブを実行できない。AWS Batchはリソースの上限とジョブキューを持つため、リソースの範囲の中でジョブを順次実行してくれる。Google Meetsの録画機能は、録画した後しばらくしてからストレージに動画が保存されるが、このようにジョブのキューイング&実行を行なっていると思われる。
また、Fargateが使えない場合(CPU,メモリの制限、GPUなど)もAWS Batchの使用を検討できる。Fargateで使用できない場合はEC2を利用する。この際、ECS TaskではEC2のプロビジョニングが必要になるが、AWS Batchではジョブがない場合はEC2インスタンスを0にできる。
大雑把に、実行時間が短いもしくは実行頻度が多くない場合はECS Task、実行時間が長く実行回数も多い場合はAWS Batchが良さそう。