これまでの記事では、AWS Batchの基本知識を整理し、複数のAWSサービスを組み合わせたアーキテクチャの動作検証を行ってきました。
参考:
- AWS Batchについて試してみた
- AWS Batchのコンピューティング環境を整理してみた
- AWS Batchのジョブキューとジョブスケジューリングを整理した
- AWS BatchとStep Functionsでバッチ処理を自動化する手順 – S3トリガーからジョブ実行まで –
今回は、AWS Batchのジョブキューとスケジューラに焦点を当て、特にリソース不足時にジョブがどのように処理されるかを検証します。ジョブがリソース不足時に適切に待機し、リソースが再確保された際に再開されるかを確認することで、AWS Batchのジョブ管理の仕組みを深く理解し、効率的なバッチ処理に向けた運用の最適化に役立てます。」
- はじめに
- AWS Batchのジョブキューとスケジューラ動作検証のためのガイド
- AWS Batchのジョブキューとスケジューラ動作検証手順
- よくある質問(FAQ)
はじめに
AWS Batchを利用してバッチ処理を行う際、ジョブがリソース不足で待機状態になるかどうかを検証することは、システムの安定稼働において重要です。本記事では、EC2マネージドコンピューティング環境におけるAWS Batchジョブの投入方法や、リソースが不足した際にジョブが正しく待機されるかを確認するための手順を解説します。
Dockerイメージの作成からECRへのプッシュ、ジョブキューの設定、実際に複数のジョブを投入してリソース不足をシミュレートするプロセスをハンズオン形式で紹介。AWS Batchでのジョブの動作確認を検証したい方に向けたガイドです。
本書で取り扱うシステム構成は下記のとおりです。

この記事の想定読者と、得られるメリットは以下となります。
- AWS Batchを使用しているが、ジョブスケジューリングやキューの動作に関する詳細な知識を深めたい開発者や運用担当者
- AWS Batchのジョブ管理やリソースの最適化を効果的に実践したい技術者
- 複数のジョブを効率的に実行し、リソース不足時に適切に対応できるシステムを構築したいAWSユーザー
- AWS Batchのジョブキューとスケジューラの動作について、リソース不足時にどのようにジョブが処理されるかを理解できる
- AWS Batchを利用したシステム運用において、効率的なジョブ管理やリソース割り当ての知識を得られる
- 実際にリソース不足のシミュレーションを行うことで、バッチ処理の安定性や拡張性を高める方法を学べる
AWS Batchの基盤となるコンテナサービスについて、参考になる書籍をご紹介します。
「AWSコンテナ設計・構築[本格]入門」は、AWSのコンテナサービスに関する基本から応用までを、イラストを交えながら解説しており、とても分かりやすい内容です。初心者から上級者までおすすめできる一冊です。
AWS Batchのジョブキューとスケジューラ動作検証のためのガイド
本ガイドでは、AWS Batchのジョブキューとスケジューラの動作を検証するためのフローを構築します。AWS BatchのEC2マネージドコンピューティング環境を使用し、ジョブがリソース不足時にどのように待機し、リソースが再度確保された際にどのように処理されるかを確認します。この仕組みを使うことで、リソース管理を最適化し、安定したバッチ処理を実現することが可能になります。
本ガイドは、下記の5つのステップと1つのオプションで構成されています。
- AWS BatchでEC2マネージドコンピューティング環境を作成する
AWS Batchの基盤となるコンピューティング環境を設定します。 - AWS Batchジョブキューの作成と優先度設定を行う
作成したコンピューティング環境に基づき、ジョブキューを作成し、優先度を設定します。 - DockerイメージをビルドしてECRにプッシュし、AWS Batchジョブで実行する
Pythonプログラムをコンテナ化し、ECRにプッシュしてAWS Batchでジョブを実行します。 - AWS CLIを使って複数ジョブを投入し、リソース不足時の挙動を確認する
複数のジョブをAWS Batchに投入し、リソース不足時にジョブがどのように待機するかを確認します。 - AWS Batchコンソールでジョブのステータスを確認し、滞留するジョブの動作を検証する
コンソールでジョブのステータスを確認し、滞留しているジョブの状況を検証します。 - オプション: vCPUを拡張してジョブを実行する
vCPUの設定を変更して、より多くのジョブを同時に実行できるように拡張し、ジョブのスケーリングを試します。
次の章より、詳細な手順を記載していきます。
AWS Batchのジョブキューとスケジューラ動作検証手順
事前準備
事前に下記の環境を用意してください。
- Dockerがインストールされているローカル環境。
- AWS CLIがインストールされ、適切に設定されていること。
- VSCodeがインストールされていること。(任意)
ステップ1: AWS BatchでEC2マネージドコンピューティング環境を作成する
AWS BatchのEC2マネージド環境を使用する際の設定手順を詳細に説明します。これにより、ジョブの実行に必要なインスタンスタイプやvCPU設定を効率的に行えます。
1.AWSにサインインし、AWS Batchに移動します。
2.ナビゲーションペインから、「コンピューティング環境」を選択します
3.コンピューティング環境で、「作成」をクリックします。
4.下記を入力し、「次へ」をクリックします
- 環境:EC2
- 名前:任意(my-managed-ec2-env)
- サーブスロール:AWSServiceRoleForBatch
- インスタンスロール:ecsInstanceRole(以前作成したものを流用。ない場合は、新規に作成する)

5.インスタンス設定画面で、下記を入力し「次へ」をクリックします
- EC2スポットインスタンスを使用:ON
- 最小 vCPU:0
- 必要な vCPU:2
- 最大 vCPU:4
- インスタンスタイプ: 任意(m7i.large等)
- 配分戦略:Best fit progressive


6.ネットワークの設定画面で、VPCとサブネット、セキュリティグループを選択し、「次へ」をクリックします。
7.確認画面で、「コンピューティング環境を作成」をクリックします
8.しばらくすると、ステータスが「Valid」、状態が「Enabled」になります

ステップ2: AWS Batchジョブキューの作成と優先度の設定
AWS Batchでジョブキューを作成し、ジョブの優先度を設定する方法を説明します。キューを使用することで、リソース管理とジョブスケジューリングを最適化できます。
1. AWS Batchのナビゲーションペインから、「ジョブキュー」を選択します
2.ジョブキュー画面で、「作成」をクリックします
3.ジョブキューの作成画面で、下記を入力し「ジョブキューの作成」をクリックします
- オーケストレーションタイプ:EC2
- 名前:my-job-queue
- 接続されたコンピューティング環境:上記で作成したコンピューティング環境(my-managed-ec2-env)



4.できました

ステップ3: DockerイメージをビルドしてECRプライベートリポジトリへプッシュする
AWS Batchで使用するDockerイメージのビルドからECRへのプッシュまでの具体的な手順を解説します。Pythonスクリプトによるジョブ実行を含め、バッチ処理を効率化するためのステップを説明します。
3.1. リポジトリを作成
1. Amazon Elastic Container Serviceに移動します。
2. ナビゲーションペインで、「Amazon ECR」をクリックします
3. リポジトリの作成で「作成」をクリックします
4. 下記を入力し、「作成」をクリックします
- リポジトリ名:任意(my-batch-app等)
3.2.コード作成〜ビルド
1. ローカルPCでプロジェクトを作成します
% mkdir aws-batch-app-scheduler
% cd aws-batch-app-scheduler
2. Pythonファイルを作成します
touch sleep_example.py
3. 実行待ちを確認できるようsleepを入れたコードを書きます
import time
# 開始時刻を記録して出力
start_time = time.time()
start_time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(start_time))
print(f"Job started at: {start_time_str}")
# 60秒間スリープ
time.sleep(60)
# 終了時刻を記録して出力
end_time = time.time()
end_time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(end_time))
print(f"Job completed at: {end_time_str}")
# 実行時間を計算して出力
execution_time = end_time - start_time
print(f"Total execution time: {execution_time:.2f} seconds")
4.Dockerfileを作成します
touch Dockerfile
5.コードを書きます
# ベースイメージ
FROM python:3.8-slim
# 作業ディレクトリを設定
WORKDIR /app
# Pythonスクリプトを追加
COPY sleep_example.py .
# エントリーポイントを設定
ENTRYPOINT ["python", "sleep_example.py"]
6. ビルドします
% docker build -t my-batch-app .
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-batch-app latest XXXXXX 15 seconds ago 125MB
7. PC上で動作確認します
% docker run my-batch-app
Job started at: 2024-09-22 06:37:00
Job completed at: 2024-09-22 06:38:00
Total execution time: 60.06 seconds
%
3.3. Dockerイメージのタグ付けとECRレジストリへプッシュ
1. CLIが使用できるようにSSOでサインインします
% aws ecr get-login-password --profile ${PROFILE} | docker login --username AWS --password-stdin ${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/my-batch-app
Login Succeeded
%
2.作成したDockerイメージにECR用のタグを付けます。
% docker tag my-batch-app:latest ${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/my-batch-app
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/my-batch-app latest XXXXX 9 minutes ago 125MB
%
3.ECRプライベートリポジトリへプッシュします
% docker push ${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/my-batch-app:latest
%
4.プッシュされていました

ステップ4: ジョブ定義を作成する
AWS Batchでジョブを実行するためには、事前にジョブ定義を作成する必要があります。このステップでは、コンテナイメージやリソース要件(vCPUやメモリ)を指定し、ジョブの実行に必要な情報を登録します。
1. AWS Batchのナビゲーションペインから、「ジョブ定義」を選択します
2. ジョブ定義の画面で、「作成」をクリックします
3. ジョブとオーケストレーションタイプを設定画面で、下記を入力し、「次へ」をクリックします
- オーケストレーションタイプ:EC2
- 名前:任意(my-batch-job等)


4.コンテナ設定画面で、下記を入力し、「次へ」をクリックします
- イメージ:ECRにプッシュしたDockerイメージ
- 実行ロール:事前に作成したIAMロール
- vCPU:2
- メモリ:1024


5.ロギングの設定を「awslogs」(CloudWatch Logs)を指定し、「次へ」をクリックします
6.確認画面で、「ジョブ定義を作成」をクリックし終了します。
ステップ5: AWS CLIを使用して複数ジョブをAWS Batchに投入する
AWS CLIを用いて複数のジョブをAWS Batchに送信します。こちらはCLIによりジョブを実行します。
コンピューティング環境 は以下の設定で作成しているので、ジョブは3以上実行すると滞留するはずです。
- 必要な vCPU:2
- 最大 vCPU:4
1. 下記のコマンドで、10のジョブを投入します
% for i in `seq 1 10`;do \
echo $i; aws batch submit-job --job-name my-batch-job-$i \
--job-queue my-job-queue --job-definition my-batch-job --profile ${PROFILE} \
;done
$
ステップ6: AWS Batchコンソールでジョブのステータスを確認する
AWS Batchコンソールでジョブのステータスを確認する手順を解説します。ジョブがキューに滞留しているか、または実行中かを確認する方法を説明します。
1. 実行直後のジョブキューの状態を確認します。ジョブ名1がありません。実行されているのでしょう。

2. ジョブ画面で状態を確認します。いくつかSuccededになっているものと、Runnableがあります

3. すべての上部がSuccededになりました。

4.詳細を確認すると、①ジョブは10秒の間に10件作成され、その後、②の赤枠で囲った2つのジョブ単位で処理され、次のジョブに進んでいます。③合計時間は、いずれもsleepの60秒(1分)です。

5. 上記から想定通りの結果が得られました。
- 最大4vCPUに対して、必要数2vCPUでジョブを投入すると、2つつづ処理される
- 実行されないジョブは、Runnableになり、キューイングされたままになる
オプション: vCPUを拡張してジョブを実行する
上記では、想定通りジョブキューで滞留している様子がわかりました。
次に、コンピューティング環境の最大vCPUを20に拡大し、10個のジョブが1分以内にすべて完了するか確認してみます。
1. コンピューティング環境の設定変更
1. AWS Batchに移動します。
2.ナビゲーションペインから、「コンピューティング環境」を選択します
3.対象ジョブを選択します
4. ①「コンピューティングリソース」タブをクリックします。②最大vCPUが4になっています。

5.編集をクリックし、必要vCPU 2、最大vCPU 20とします。これで10個のジョブが実行できるはずです。
2. ジョブの実行
1. 下記のコマンドでジョブを投入します
% for i in `seq 11 20`;do \
echo $i; aws batch submit-job --job-name my-batch-job-$i \
--job-queue my-job-queue --job-definition my-batch-job --profile ${PROFILE} \
;done
$
3. 実行状況の確認
1. AWS Batchのジョブ画面を確認します。すべてRunnableになりました。

2.しばらくすると、10個のジョブが、ほぼ同開始時刻でステータスがRunningになりました。

3.下記の通り①で同時に作成され、②の開始時刻で同タイミングでジョブが処理され、③の終了もほぼ同タイミングでした。

4. なお、EC2インスタンス画面を確認すると、10台のインスタンスがほぼ同時刻に起動されていることも確認できました。

5. 上記から、最大vCPUで同時実行のジョブ数が制御可能であることがわかりました。
よくある質問(FAQ)
Q1: AWS BatchのEC2マネージド環境の仕組みとは?
A1: EC2マネージド環境は、AWS Batchが自動的にEC2インスタンスの起動、スケーリング、終了を管理してくれる環境です。ユーザーは必要なvCPUやインスタンスタイプを指定し、リソースの管理をAWSに任せることができます。
Q2: AWS Batchでリソース不足時のジョブ処理の流れは?
A2: リソースが不足している場合、ジョブはRUNNABLE(実行可能)の状態でキューに待機します。リソースが利用可能になると、順次ジョブが実行されます。リソース不足時にはスケジューラが適切な処理を行い、ジョブが確保されるまで待機します。
Q3: AWS BatchのvCPU設定がジョブスケジューリングに与える影響とは?
A3: vCPUの設定は、ジョブごとのリソース要件を定義するため、同時に実行可能なジョブ数に影響を与えます。例えば、コンピューティング環境に指定された最大vCPU数を超えるジョブが投入された場合、超過したジョブはリソースが空くまで待機します。
Q4: AWS BatchのDockerイメージの準備方法とは?
A4: Dockerイメージはローカルでビルドし、その後ECR(Elastic Container Registry)にプッシュします。AWS Batchジョブは、このECRに保存されたイメージを使用して実行されます。
Q5: AWS Batchでジョブが滞留する場合、どのように確認できますか?
A5: AWS Batchコンソールの「ジョブキュー」セクションで、RUNNABLE
ステータスのジョブを確認できます。RUNNABLE
の状態は、ジョブがリソースを待っていることを示しています。CLIを使ってもジョブのステータスを確認可能です。
参考資料とリソース
参考資料
AWS Batchの基盤となるコンテナサービスについて、参考になる書籍をご紹介します。
「AWSコンテナ設計・構築[本格]入門」は、AWSのコンテナサービスに関する基本から応用までを、イラストを交えながら解説しており、とても分かりやすい内容です。初心者から上級者までおすすめできる一冊です。
リソース



まとめと今後のステップ
まとめ
今回の検証では、AWS BatchのEC2マネージド環境を使用し、ジョブキューとスケジューラの動作を検証しました。リソース不足時にジョブがどのように待機され、リソースが再確保された際にどのように再開されるかをシミュレートし、その仕組みを理解しました。これにより、AWS Batchを活用したバッチ処理において、リソース管理とジョブスケジューリングの重要性が再確認されました。適切な設定により、安定したバッチ処理が可能となり、システム運用が効率化されることがわかりました。
今後のステップ
今後は、AWS BatchにおけるvCPU設定がジョブの同時実行数にどのように影響を与えるかをさらに検証していきます。特に、vCPU数がジョブのスケジューリングやリソース管理にどのように関わるのかを確認し、より効率的なバッチ処理環境の構築に向けた調査を進める予定です。この検証結果を通じて、AWS Batchを最大限に活用したジョブ管理の最適化に役立つ知見を得ることを目指します。
コメント