過去にQiitaの記事でAWS Batchについて、基本的な知識の整理と、簡単な動作を確認をしました。
基礎的な知識や動作等が気になる方は、こちらのQiitaの記事を御覧ください。
今回は、S3にPutされたファイルをイベントトリガーに、Step Functionsが起動され、最終的にはAWS Batchを実行する構成で試してみます。
- はじめに
- S3トリガーからAWS Batchジョブを実行するためのガイド
- S3トリガーで自動化するAWS Batchジョブ実行の詳細手順
- よくある質問(FAQ)
はじめに
バッチシステムでは、大量のデータ処理や定期的なタスク実行が必要になる場面が多々あります。これを効率的に実行し、管理するためのツールとして、AWSが提供するAWS BatchとStep Functionsは有用です。特に、バッチ処理をスケールさせたり、自動化ワークフローを構築するのに最適です。
本記事では、AWS Batchでバッチ処理を自動化し、Step Functionsを使ってその処理を制御する方法を具体的な手順で解説します。また、S3のファイルアップロードをトリガーとしてバッチ処理を開始する自動化フローも作成し、シナリオでの利用方法を示します。
本書で取り扱うシステム構成は下記のとおりです。
この記事の想定読者と、得られるメリットは以下となります。
AWS Batchの基盤となるコンテナサービスについて、参考になる書籍をご紹介します。
「AWSコンテナ設計・構築[本格]入門」は、AWSのコンテナサービスに関する基本から応用までを、イラストを交えながら解説しており、とても分かりやすい内容です。初心者から上級者までおすすめできる一冊です。
AWS BatchやStep Functionsを使ったバッチ処理の自動化に興味のある方や、AWSでの効率的なタスク実行の基礎を学びたい方に向けたガイドです。以降で解説します!
S3トリガーからAWS Batchジョブを実行するためのガイド
本書では、S3にファイルがアップロードされた時にAWS Batchジョブを自動的に実行するフローを構築します。AWSのマネージドサービスであるStep Functionsを使用し、S3イベントをトリガーとしてAWS Batchジョブを実行する仕組みを作成します。この仕組みを使うことで、定期的に大量のデータを処理したり、特定のイベントに基づいてバッチ処理を自動化することが可能になります。
本ガイドは、下記の4つのステップで構成されています。
- AWS Batchで実行するPythonプログラムを作成し、Dockerイメージをビルドする
- AWS Batchのコンピュート環境をセットアップし、DockerイメージをECRにデプロイする
- Step FunctionsでAWS Batchジョブを管理し、自動化フローを構築する
- S3イベントでStep Functionsをトリガーし、AWS Batchジョブを自動実行する
次の章より、詳細な手順を記載していきます。
S3トリガーで自動化するAWS Batchジョブ実行の詳細手順
事前準備
事前に下記の環境を用意してください。
- Dockerがインストールされているローカル環境。
- AWS CLIがインストールされ、適切に設定されていること。
- VSCodeがインストールされていること。(任意)
ステップ1: AWS Batchで実行するPythonプログラムを作成し、Dockerイメージをビルドする
まずは、AWS Batchで実行するための簡単なPythonプログラムを作成し、そのプログラムを実行するDockerイメージをビルドしてECRにプッシュします。
ステップ 1.1: プロジェクトのセットアップ
- 作業ディレクトリを作成します。
% mkdir aws-batch-python-app
% cd aws-batch-python-app
2. 新しいPythonファイルを作成します。
% touch app.py
% ls -ltr
total 0
-rw-r--r-- 1 XXXX XXX 0 9 21 14:46 app.py
%
3.app.py
ファイルに、以下のコードを追加します。このプログラムは、AWS Batchでの実行時に引数を受け取り、それを出力する簡単なスクリプトです。
import sys
def main():
print("Hello World AWS Batch!")
if len(sys.argv) > 1:
print(f"Received arguments: {sys.argv[1:]}")
else:
print("No arguments recieved.")
if __name__ == "__main__":
main()
ステップ 1.2: Dockerfileの作成
次に、このPythonプログラムを実行するためのDockerイメージを作成します。
1. Dockerfile
を作成します。
% touch Dockerfile
%
2. Dockerfile
に以下の内容を記述します。Pythonの公式イメージをベースに、プログラムをコンテナ内で実行する設定です。
# ベースイメージを指定
FROM python:3.12-slim
# 作業ディレクトリを設定
WORKDIR /usr/src/app
# Pythonスクリプトをコンテナにコピー
COPY app.py .
# Pythonスクリプトを実行する
ENTRYPOINT ["python", "./app.py"]
ステップ 1.3: Dockerイメージのビルド
次に、作成したDockerfileを使ってDockerイメージをビルドします。
1.Dockerがインストールされていることを確認し、以下のコマンドを実行してイメージをビルドします。
% docker build -t aws-batch-python-app .
2.ビルドの結果を確認します。以下のコマンドでDockerイメージがローカルにあるか確認します。できていました。
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aws-batch-python-app latest XXXXXXXX About a minute ago 124MB
ステップ 1.4: ローカルでDockerイメージをテストする
ビルドしたイメージが正常に動作するかローカルでテストしてみます。
1. Dockerイメージを実行します。パラメータ有無で挙動が確認できました。
# パラメータなし
% docker run aws-batch-python-app
Hello from AWS Batch!
No arguments received.
# パラメータあり
% docker run aws-batch-python-app arg1 arg2
Hello from AWS Batch!
Received arguments: ['arg1', 'arg2']
%
ステップ 1.5: ECRリポジトリの作成
次に、ビルドしたDockerイメージをAWS Elastic Container Registry(ECR)にプッシュするため、プライベートリポジトリを作成します。
1. AWSにサインインし、Amazon Elastic Container Serviceに移動します。
2. ナビゲーションペインで、「Amazon ECR」をクリックします
3. リポジトリの作成で「作成」をクリックします
4. 下記を入力し、「作成」をクリックします
- リポジトリ名
ステップ 1.6: Dockerイメージのタグ付けとプッシュ
1.CLIが使用できるようにSSOでサインインします
aws sso login --profile ${PROFILE}
2.作成したECRリポジトリに対して、以下のコマンドでAWS CLIを使用してログインします。
$ aws ecr get-login-password --profile ${PROFILE} | docker login --username AWS --password-stdin ${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/aws-batch-python-app
Login Succeeded
$
3.作成したDockerイメージにECR用のタグを付けます。
% docker tag aws-batch-python-app:latest ${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/aws-batch-python-app
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
XXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/aws-batch-python-app latest YYYYYYY 26 minutes ago 124MB
4.イメージをECRにプッシュします。
% docker push ${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/aws-batch-python-app:latest
5.Pushが成功すると、ECRリポジトリにイメージがアップロードされます。
これで、AWS Batchで実行するPythonプログラムを作成し、DockerイメージをビルドしてECRにプッシュする手順が完了しました。次のステップでは、このイメージを使ってAWS Batchのジョブを実行する準備を行います。
ステップ2: AWS Batchのコンピュート環境をセットアップし、DockerイメージをECRにデプロイする
このステップでは、AWS Batchの実行環境を構築し、ECRにデプロイしたDockerイメージを使用してバッチジョブを実行できるように設定します。
ステップ 2.1: AWS Batch タスク実行 IAM ロールの作成
Batchタスク実行用のIAMロールを作成します
1. IAMに移動します
2.ナビゲーションペインで「ロール」をクリックします
3. IAMロールの画面で、「ロールを作成」をクリックします
4. 下記を選択し、「次へ」をクリックします
- 信頼されたエンティティタイプ:AWSサービス
- ユースケース:Elastic Container Service Task
5.IAMポリシーでは、「AmazonECSTaskExecutionRolePolicy」を選択し、「次へ」をクリックします
6. ロール名を入力し、「ロールを作成」をクリックします
ステップ 2.2: AWS Batch コンピュート環境の作成
1.AWS Batchに移動します。
2.ナビゲーションペインで、「コンピューティング環境」をクリックします
3. 「作成」をクリックします
4. 下記を入力し、⑥「次へ」をクリックします
- ①コンピューティング環境:EC2
- ②オーケストレーションタイプ:マネージド型
- ③名前:任意
- ④サービルロール:AWSServiceRoleForBatch
- ⑤インスタンスロール:新しいロールの作成
5. 下記を指定して、「次へ」をクリックします
- EC2スポットインスタンスを使用を有効化
- オンデマンド料金:空白
- 最小vCPU:0
- 必要なvCPU:0
- 最大vCPU:16
- 許可されたインスタンスタイプ:m7g.medium
- 配分戦略:Best fit progressive
6.VPCとサブネット、セキュリティグループを選択します。ここでは、インターネットゲートウェイとNATGatewayを使用した通信とします。(VPCエンドポイントは用意していません。)
7.確認画面では、「コンピューティング環境を作成」をクリックして完了します。
8.しばらくすると、ステータスがCreating→Validになります。
ステップ 2.3: ジョブキューの作成
次に、ジョブが送信されるジョブキューを作成します。
1. ナビゲーションペインで、「ジョブキュー」をクリックします
2.ジョブキュー画面で「作成」をクリックします
3. 下記を入力し、「ジョブキューの作成」をクリックします
- オーケストレーションタイプ:EC2
- 名前:任意
- 優先度:1
- コンピューティング環境:作成したコンピューティング環境
4. できました
ステップ 2.4: ジョブ定義の作成
次に、ECRにアップロードしたDockerイメージを使用するジョブ定義を作成します。
1. ナビゲーションペインで、「ジョブ定義」をクリックします
2.ジョブ定義の画面で「作成」をクリックします
3. 下記を入力し、「次へ」をクリックします
- オーケストレーションタイプ:EC2
- ジョブ名:任意
4. 下記を指定し、「次へ」をクリックします
- イメージ:あらかじめPushしておいたイメージ
- 実行ロール:あらかじめ作成しておいたIAMロール
- vCPU:1
- メモリ:2048
5.ロギングの設定を「awslogs」(CloudWatch Logs)を指定し、「次へ」をクリックします
6.確認画面で、「ジョブ定義を作成」をクリックし終了します。
7.できました
ステップ 2.4: ジョブの実行
最後に、作成したジョブ定義を使って、ジョブを実行します。
1. ナビゲーションペインで「ジョブ」をクリックします
2.ジョブ画面で「新しいジョブを送信」をクリックします
3.下記を指定して、「次へ」をクリックします
- 名前:任意
- ジョブ定義:作成したジョブ定義
- ジョブキュー:作成したジョブキュー
4.オーバーライドの画面では、何も指定せずに「次へ」をクリックします
5.確認画面で、「ジョブを作成」をクリックします
ステップ 2.5: ジョブのステータス確認
AWS Batchのジョブページで、実行したジョブのステータスを確認できます。RUNNING
から SUCCEEDED
になると、ジョブが正常に完了したことを意味します。
CloudWatch Logs でジョブの出力を確認できます。ジョブの実行ログが表示され、プログラムの実行結果を確認できます。
1. 完了しました。
2. CloudWatch Logsでも確認できました。
ステップ3: Step FunctionsでAWS Batchジョブを管理し、自動化フローを構築する
AWS Step Functionsは、AWSのさまざまなサービス(AWS Batchを含む)を連携してワークフローを作成・管理するためのサービスです。このステップでは、Step Functionsを使って、S3などのトリガーイベントからAWS Batchジョブを実行し、ステータスを監視する自動化されたフローを構築します。
ステップ 3.1: Step FunctionsのState Machineを作成
1.Step Functionsに移動します
1.ナビゲーションペインで、「ステートマシン」をクリックします
2.ステートマシンの画面で、「ステートマシンの作成」をクリックします
3.テンプレートの選択で、「Blank」を「選択」します
4. 画面上部の「{}コード」を選択します
5. 下記のコードを貼り付けます
{
"Comment": "S3 event triggers AWS Batch job",
"StartAt": "SubmitBatchJob",
"States": {
"SubmitBatchJob": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobDefinition": "arn:aws:batch:ap-northeast-1:XXXXXX:job-definition/batch-job-def:1",
"JobName": "test-batch-job",
"JobQueue": "arn:aws:batch:ap-northeast-1:XXXXXX:job-queue/batch-job-queue",
"Parameters": {
"Param1": "Value1"
}
},
"End": true
}
}
}
6. 設定をクリックします
7. 下記を入力し、⑥「作成」をクリックします
- ①.ステートマシン名:任意
- ②.タイプ:標準
- ③.実行ロール:新しいロールを作成
- ④.ログレベル:ALL
- ⑤.CloudWatchロググループ:新しいロググループを作成
8. ロールの作成を確認で、「確認」をクリックします
9. できました
ステップ 3.4: 手動実行
Step Functionsを設定した後、動作を確認します。
1. Step Functionsのコンソールから、先ほど作成したステートマシンを選択し、「実行を開始」をクリックします
2.実行直後は、「進行中」で表示されます
3.完了しました。
4. Batch Jobを確認します。ステータスがSucceededになっています。
5.CloudWatch Logsを確認します。キャプチャは貼り付けませんが、下記のTypeが記録されていました。
- ExecutionStarted
- TaskStateEntered
- TaskScheduled
- TaskStarted
- TaskSubmitted
- TaskSucceeded
- TaskStateExited
- ExecutionSucceeded
ステップ4: S3イベントでStep Functionsをトリガーし、AWS Batchジョブを自動実行する
このステップでは、S3バケットにファイルがアップロードされた際に、Step Functionsを自動的にトリガーしてAWS Batchジョブを実行するフローを構築します。
- S3バケットに対してファイルがアップロードされると、そのイベントを検知してStep Functionsを起動し、AWS Batchジョブを自動で実行します。
- これにより、S3バケットをトリガーとして、バッチ処理が自動化されるフローを構築できます。
ステップ 4.1: S3バケットの作成とイベント通知
1.AWSコンソールでS3に移動し、「バケットを作成」をクリックします。
2.バケット名を入力し、「バケットを作成」をクリックします
3. 作成したバケットを選択し、「プロパティ」タブをクリックします
4. Amazon EventBridgeで「編集を」クリックします
5. 通知を送信するで「オン」を選択し、「変更を保存」をクリックします
ステップ 4.2: EventBridgeルールの作成
1.EventBridgeコンソールに移動します
2.「イベントブリッジルール」を選択し、「ルールを作成」をクリックします
3.下記を入力し、「次へ」をクリックします
- 名前:任意
- イベントバス:default
- ルールタイプ:イベントパターンを持つルール
4.イベントパターンを設定し、「次へ」をクリックします
{
"source": ["aws.s3"],
"detail-type": ["Object Created"],
"detail": {
"bucket": {
"name": ["バケット名"]
}
}
}
5. 下記を指定して、「次へ」をクリックします
- ターゲットタイプ:AWSのサービス
- ターゲットを選択:Step Functionsステートマシン
- ステートマシン:作成したステートマシン
- 実行ロール:この特定のリソースについて新しいロールを作成
6. タグを設定では、指定せずに、「次へ」をクリックします
7. 確認画面で、「ルールの作成」をクリックします
ステップ 4.3: ファイルをS3にアップロードし確認する
1. 作成したS3バケットにテスト用のファイルをアップロードします。
2. EventBridgeで「モニタリング」タブをクリックすると、マッチし、トリガーされていることがわかります。
3. State Machineでも「成功」していることがわかります。
4. AWS Batchも、「成功」していました。
よくある質問(FAQ)
1. S3イベントで直接Step Functionsをトリガーできますか?
- 回答: いいえ、S3イベント通知では直接Step Functionsをトリガーすることはできません。代わりに、EventBridgeを使用してS3イベント(
CreateObject
イベントなど)をキャプチャし、そのイベントをStep Functionsに渡してトリガーすることが必要です。
2. S3バケットのイベント通知を有効にしたのに、EventBridgeがトリガーされません。原因は何ですか?
- 回答: S3バケットでEventBridgeへの通知を有効にする必要があります。S3の「イベント通知設定」内で「EventBridgeへの通知を有効化」オプションが選択されていない場合、S3イベントがEventBridgeに送信されないため、トリガーされません。設定が正しいか確認してください。
3. AWS BatchジョブがRunnableのまま進行しません。どうすればよいですか?
- 回答: いくつかの原因が考えられます。主な原因として、AWS Batchがインターネットに接続できない場合があります。プライベートサブネット内でNAT Gatewayが設定されていない場合、ECRからDockerイメージをプルできないためジョブが進行しません。NAT GatewayやIGWの設定を確認してください。
4. EventBridgeがイベントをトリガーしない場合、どうすれば確認できますか?
- 回答: EventBridgeの「イベント履歴」やCloudWatch Logsを確認して、イベントが正しくキャプチャされているかを確認してください。EventBridgeのイベントルールがトリガーされない場合、イベントパターンの設定を再確認し、適切にS3イベントをキャプチャしているかを確認してください。
5. S3バケットに特定のファイル形式(例: .csv)に限定してイベントを発生させることは可能ですか?
- 回答: はい、可能です。S3バケットのイベント通知設定で、ファイルのプレフィックスやサフィックス(例:
*.csv
)を指定することで、特定のファイル形式にのみイベントを発生させることができます。これにより、特定のファイルに対してのみ処理をトリガーできます。
参考資料とリソース
参考資料
AWS Batchの基盤となるコンテナサービスについて、参考になる書籍をご紹介します。
「AWSコンテナ設計・構築[本格]入門」は、AWSのコンテナサービスに関する基本から応用までを、イラストを交えながら解説しており、とても分かりやすい内容です。初心者から上級者までおすすめできる一冊です。
リソース
まとめと今後のステップ
まとめ
本記事では、S3バケットにファイルがアップロードされた時に自動でAWS Batchジョブを実行するフローを構築しました。S3イベントをEventBridgeルールでキャプチャし、Step FunctionsをトリガーしてAWS Batchジョブを実行する一連の自動化フローを設定しました。このシステムにより、データのアップロードからバッチ処理までを効率的に自動化できます。
- S3イベント通知を設定し、ファイルのアップロードをトリガーに自動処理を行う。
- EventBridgeを活用して、イベントをキャプチャし、Step Functionsによってバッチ処理の管理を行う。
- AWS Batchにより、コンピュートリソースを効率的に管理しながら、指定されたDockerイメージを実行できる環境を整備。
本記事により、自動化された処理フローの構築に参考になりましたら幸いです。
今後のステップ
今後は、AWS BatchのvCPU設定を活用して同時実行数を制御できるか確認したいと思います。これにより、リソースの効率的な利用や、ジョブの実行数を動的に調整することが可能かどうかを評価します。
- vCPUによる制御がどのように影響するかをテストし、同時実行数やジョブのパフォーマンスへの影響を確認する予定です。
- ジョブ実行結果の監視や最適化も引き続き行い、パフォーマンスをさらに向上させることが目標です。
今後の改善やテストを通じて、さらに柔軟で効率的なバッチ処理の運用が可能になると考えています。
コメント