📝

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