AWS Batch でカスタム AMI を使ってみた
Compute resource AMIs - AWS Batch
カスタム AMI でジョブを実行してみました。
前提
- AWS Batch のサービスロール作成済み
- EC2 インスタンスにアタッチする IAM ロール作成済み
- 権限は AdministratorAccess
1. EC2 インスタンスの作成
まずはカスタム AMI のもとになる EC2 インスタンスを作成します。
ただし、AWS Batch で使用するインスタンスにはいくつか条件があるため、詳細については以下のドキュメントもご参照ください。
Tutorial: Create a compute resource AMI - AWS Batch
条件の一例としては以下のような点があります。
- HVM 仮想化のベース AMI を使用する必要がある
- Windows AMI は使用できない
- ECS コンテナエージェントがインストールされている必要がある
今回は上記条件を満たせるよう、ECS に最適化された AMI をベース AMI として使用します。
ECS に最適化された AMI の AMI ID は以下のブログの方法で取得できます。
最新の ECS に最適化された AMI を取得する方法を教えてください | DevelopersIO
今回は以下のコマンドを実行しました。
# Amazon Linux 2
$ aws ssm get-parameters \
--names /aws/service/ecs/optimized-ami/amazon-linux-2/kernel-5.10/recommended/image_id \
--query "Parameters[0].Value"
ami-00eb74aa50b8c46ef
上記 AMI から以下の設定で EC2 インスタンスを起動しました。
- パブリックサブネットで起動
- キーペアはなし
- SSM セッションマネージャーで接続
- IAM インスタンスプロファイルに AdministratorAccess を付与した IAM ロールを指定
EC2 インスタンス起動後にセッションマネージャーで接続して以下のコマンドを実行します。
$ sudo yum update -y
$ echo "This is a custom ECS-optimized AMI for AWS Batch learning" > /tmp/custom-ami-info.txt
$ cat /tmp/custom-ami-info.txt
$ sudo systemctl stop ecs
$ sudo rm -rf /var/lib/ecs/data/*
2. AMI の作成
手順 1 の終了後、EC2 インスタンスを停止せずに AMI を作成します。
インスタンスの再起動はせずに AMI を作成します。

作成した AMI のステータスが利用可能になれば AMI の作成完了です。
AMI の作成が完了したら手順 1 のインスタンスは削除しても問題ありません。

3. AWS Batch コンピューティング環境の作成
以下の設定でコンピューティング環境を作成します。
- コンピューティング環境設定: Amazon Elastic Compute Cloud (Amazon EC2)
- オーケストレーションタイプ: マネージド型
- サービスロール: AWSBatchServiceRoleForBatch
- インスタンスロール: 作成済みの EC2 用 IAM ロール
- インスタンス設定 > その他設定 > EC2 設定
- イメージタイプ: Amazon Linux 2
- イメージ ID の上書き: 手順 2 で作成した AMI ID
上記以外はデフォルト設定です。



4. AWS Batch ジョブキューの作成
以下の設定でジョブキューを作成します。
- オーケストレーションタイプ: Amazon Elastic Compute Cloud (Amazon EC2)
- 接続されたコンピューティング環境: 手順 3 で作成した環境
上記以外はデフォルト設定です。


5. AWS Batch ジョブ定義の作成
以下の設定でジョブ定義を作成します。
- オーケストレーションタイプ: Amazon Elastic Compute Cloud (Amazon EC2)
- イメージ: busybox
- コマンド: 以下のコマンドを入力
["sh","-c","echo 'Hello from ECS-optimized custom AMI!' && echo 'カスタムAMIが正常に動作しています!' && echo 'AWS Batch learning completed successfully!' && sleep 5"]
上記以外はデフォルト設定です。


6. ジョブの実行
以下の設定でジョブを実行します。
- ジョブ定義: 手順 5 で作成した定義
- ジョブキュー: 手順 4 で作成したキュー
上記以外はデフォルト設定です。

7. 動作確認
ジョブの実行後、以下のような状態になります。
- Auto Scaling グループから EC2 インスタンスが起動
- ECS クラスターに EC2 インスタンスが登録される
- ECS クラスター内でタスクが起動される
- タスク内でジョブが実行される
ジョブの実行結果については CloudWatch Logs の /aws/batch/job というロググループに出力されます。
ジョブが Succeeded になっており、以下のようなログが出力されていれば成功です。
Hello from ECS-optimized custom AMI!
カスタムAMIが正常に動作しています!
AWS Batch learning completed successfully!

まとめ
今回は AWS Batch でカスタム AMI を使ってみました。
どなたかの参考になれば幸いです。
Discussion