AWS BatchでEFSをいい感じに扱う

記事タイトルとURLをコピーする

AWS Batchを利用しているとEFSを使いたくなりますよね。

AWS BatchがLaunchTemplateに対応したことでものすごく使いやすくなったので、今回はその方法を紹介します。

忙しい人向け

この記事のポイントは3つです。

  1. EFSをマウントする処理を書いたユーザデータを含むLaunchTemplateを作る
  2. LaunchTemplateを利用してAWS Batchのコンピューティング環境を作る
  3. コンテナがEFSを見れるようにVolumeとMount Pointを設定する

参考ドキュメント

実際にやってみる

ここからは実際に環境を作りながら試していきます。

EFSの作成

まずはEFSを作成します。

AWS マネジメントコンソールでEFSの管理画面に移動します。

ファイルシステムの作成をクリックしEFSの作成ウィザードを起動します。

あとは適宜必要なパラメータを入力します。

とりあえず試して見たいだけって方はセキュリティグループ以外はデフォルトで大丈夫でしょう。

セキュリティグループが後ほど作るAWS Batchが起動するEC2インスタンスからEFSへ接続できるセキュリティグループを設定します。

また、本格的に使う場合は用途に合わせてパラメータを設定しましょう。

作成できたらEFSのIDを控えておきます。

LaunchTemplateの作成

次はLaunchTemplateを作成します。

AWS マネジメントコンソールでLaunchTemplateの管理画面に移動します

起動テンプレートの作成をクリックしてLaunchTemplateの作成ウィザードを起動します。

新規テンプレートの作成を選択します。

次にテンプレート名とテンプレートの説明に任意のテンプレート名とテンプレートの説明を入力します。

他の項目は入力せず一番下までスクロールします

高度な詳細という項目があるのでクリックすると展開されさらに入力可能なパラメータが増えます。

ユーザデータという項目が今回のポイントです。

ここにEFSをマウントするための処理を記載します。

以下はサンプルの内容です。

とりあえず試して見たいという方はfs-hogehogeの部分を先ほど作ったEFSのIDに置換してください。

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==
Content-Type: text/cloud-config; charset="us-ascii"

packages:
- amazon-efs-utils

runcmd:
- file_system_id_01=fs-hogehoge
- efs_directory=/mnt/efs

- mkdir -p ${efs_directory}
- echo "${file_system_id_01}:/ ${efs_directory} efs tls,_netdev" >> /etc/fstab
- mount -a -t efs defaults

--==MYBOUNDARY==--

ユーザーデータの設定が完了したら起動テンプレートの作成をクリックしてLaunchTemplateの作成は完了です。

AWS Batchで利用するLaunchTemplateの詳細は以下のドキュメントを確認してください。

AWS Batchのコンピューティング環境の作成

次は先ほど作ったLaunchTemplateを利用してAWS BatchがEFSをマウントしたEC2を起動できるようコンピューティング環境を作成します。

AWS マネジメントコンソールでコンピューティング環境の管理画面に移動します。

環境の作成をクリックするとウィザードが起動します。

コンピューティング環境の作成

コンピューティング環境のタイプ

コンピューティング環境のタイプマネージド型を選択します。

コンピューティング環境の名前

コンピューティング環境の名前 は任意の名前を入力します。

サービスロールとインスタンスロール

サービスロールは既にIAM Roleがある場合はそのIAM Roleを選択します。 ない場合は新しいロールの作成を選択します。

インスタンスロールも同様に既にIAM Roleがある場合はそのIAM Roleを選択します。 ない場合は新しいロールの作成を選択します。

EC2 キーペア

EC2 キーペアは既存のキーペアを設定することでAWS Batchが起動させるEC2にSSHでログインすることが可能になります。

とりあえず試して見たいという場合はキーペアの設定を行いインスタンスの中で何が起きてるか観察してみるのも楽しいかもしれません。

コンピューティングリソースの設定

プロビジョニングモデル

プロビジョニングモデル は任意の設定をしてください。

オンデマンドを選択するとオンデマンド料金でEC2インスタンスが起動します。

スポットにすると起動してくるインスタンスはスポットインスタンスを利用することもできます。 AWS Batchで処理させる内容などに合わせて選択しましょう。

とりあえず試して見たいという方はオンデマンドを選択してください。

許可されたインスタンスタイプ

許可されたインスタンスタイプoptimal を選択することでC、M、Rインスタンスファミリーからジョブキューにあるジョブの状況に合わせて最適と思われるインスタンスタイプを選択し起動してくれます。

とりあえず試して見たいという場合はoptimalのままで大丈夫です。

GPUを使いたいなどある場合は、用途に合わせて他のインスタンスタイプを利用したいという場合は必要に応じてインスタンスタイプを設定してください。

Launch template とLaunch template version

Launch template では先ほど作ったLaunch templateを選択してください。

Launch template version も自動で入力される$Default$Latestを入力します。

これはLaunch templateLaunch template version は後から変更できないパラメータをなるためです。

$DefaultはLaunch templateのデフォルトバージョンに指定されたバージョンが利用されます。

$Latestは常に最新版のLaunch templateを利用することになりLaunch templateを更新するたびにコンピューティング環境を再作成するという手間が発生しなくなります。

とりあえず試して見たいという方は初期値である$Defaultのままで大丈夫です。

最小 vCPU 必要な vCPU 最大 vCPU

最小 vCPU 必要な vCPU 最大 vCPU この三つの項目は三つでワンセットとなります。

オートスケーリングでの最小台数、最大台数、希望する台数と似たようなものとイメージしてください。

最小値をゼロにすることでジョブがキューにない場合はEC2インスタンスは起動されません。

ジョブキューにキューが入るとEC2インスタンスが起動し、ジョブの処理が開始されます。

適宜必要な値を入力してください。

とりあえず試して見たいという場合は初期値のままでも問題ありません。

起動したEC2にログインしてみたいという場合は最小 vCPU必要な vCPUにそれぞれ1を入力するとEC2インスタンスは削除されず起動したままになるので中を確認しやすくなります。

ユーザー指定の AMI ID を有効にします。

ユーザー指定の AMI ID を有効にします。 は自分自身で設定したカスタムAMIを利用する場合にチェックを入れます。

カスタムAMIが必要なければ無視してください。

ネットワーキング

EFSが動いているVPCを選択しましょう。

サブネットやセキュリティグループは適宜選択してください。

EC2 タグ

必要に応じてタグをつけてください。 ここで設定したタグがついた状態でEC2が起動してきます。

全てのパラメータの設定が終わったら画面右下にある作成ボタンをクリックします。

これでコンピューティング環境の作成は完了です。

中身を見てみる。

最小 vCPU必要な vCPUにそれぞれ1 とした場合ここでEC2が起動してきます。

SSH接続し、EC2の中をのぞいてみましょう。

OSにはec2-userでログイン可能です。

PublicIPで直接SSHや踏み台経由でのSSHなど環境に合わせて接続してみましょう。

df コマンドを実行するとefsがマウントできていることが確認できます。

$ sudo df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        1.9G   92K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/xvda1      7.8G 1013M  6.7G  13% /
127.0.0.1:/     8.0E     0  8.0E   0% /mnt/efs  ←これ。
/dev/dm-3       9.8G   72M  9.2G   1% /var/lib/docker/devicemapper/mnt/fb150d8357289a3ca7a0996c06910cb6c154da9887d062088f9d5b7c91f4dd6f
shm              64M     0   64M   0% /var/lib/docker/containers/14a8da3869df557a81184980fc8951944ee1229eed9fa5e5c3b21c04695fa8ae/mounts/shm

テスト用のファイルを置いてみる

以下のコマンドを実行してEFS内にテスト用のファイルを作成します。

cd /mnt/efs/
sudo mkdir test
sudo chown ec2-user. test
echo test > test.txt

ここで作ったファイルを後でジョブを実行して中身を見てみます。

AWS Batchのジョブ定義作成

これまでの作業でDockerが動くホストOSにEFSをマウントすることはできたので 次は起動してくるコンテナからEFSを見えるようにしてあげる必要があります。

これはジョブの定義の中で行います。

AWS マネジメントコンソールでジョブ定義に移動します。

※ドキュメントはこちら

ジョブ定義の作成

Job definition name

Job definition nameは任意のジョブ定義の名前を入力してください。

Job attempts

ジョブの試行回数を入力します。

とりあえず試して見たいという場合は1で問題ありません。

Execution timeout

ジョブのタイムアウト時間設定です。

ジョブ実行時、処理が終わらずここで指定した秒数以上経過するとジョブはFAILDという状態になります。 必須項目ではないのでとりあえず試して見たいという場合は空欄のままで問題ありません。

※詳細についてはJob Timeoutsをご確認ください。

Job requires multiple node configurations

並列ノードでジョブを実行するための設定です。

とりあえず試して見たいという場合はチェックはいれなくてOKです。

用途に応じて必要となる場合は設定してください。

※詳細についてはCreating a Multi-node Parallel Job Definitionをご確認ください。

Parameters

コマンド引数を変数化するときに利用します。

とりあえず試して見たいという場合はスキップして問題ありません。

※詳細についてはParametersをご確認ください。

Environment

この項目ではコンテナ環境の設定を行っていきます。

Job role

ジョブに割り当てるIAM Roleを指定します。

実行されるジョブ内でAWSのAPIを利用する処理がある場合はそのAPIを実行できる権限を持った IAM Roleをここで指定します。

必須項目では無いためとりあえず試して見たいという場合は空欄のままでOKです。

Container image

実行するコンテナイメージをここで指定します。

DockerHUBに登録しているイメージや、ECRに登録してあるイメージを利用することができます。

とりあえず試して見たいという場合はamazonlinuxと記載するとAmazonLinuxのコンテナが実行されます。

Command

コンテナ内で実行するコマンドを指定します。

とりあえず試して見たいという場合は cat /mnt/test/test.txt と入力してみてください。

vCPUs

コンテナに割り当てるvCPUの数です。

ジョブの内容によって割り当てを変えましょう。

とりあえず試して見たいという場合は1で十分です。

Memory (MiB)

コンテナに割り当てるメモリの量です。

MiB単位で割り当てます。

とりあえず試して見たいという場合は1024で十分です。

Security

この項目ではコンテナに特権を持たせるかを選択できます。 docker コマンドの --privileged オプションと同じ意味を持ちます。

Volumes

マネジメントコンソールでは Mount points が先にありますが一旦スキップして Volumes の設定を行います。

EFSをマウントした領域をコンテナに見せるためにボリュームを作成します。

Nameはボリューム名を指定します。

source path はホストOSのEFSをマウントしている部分のパスを指定します。

とりあえず試して見たいという場合はNameefssource path/mnt/efsを入力してください。

Mount points

マウントポイントでは作成したボリュームをコンテナのどこにマウントするかを指定します。

Container path にはコンテナ内のどこにマウントするかを指定します。

Source path ではどのボリュームをマウントするかを指定します。

マネジメントコンソール上では Source pathとなっていますが、英語版公式ドキュメントでは For Source volume, enter the name of the volume to mountとという記述になっています。

Source pathという表現に混乱するかもしれませんがSource volumeの名前を指定する場所と覚えておいてください。

とりあえず試して見たいという場合はContainer path/mntsource pathefsを入力してください。

Environment variables

この項目ではコンテナ内の環境変数を設定できます。

とりあえず試して見たいという場合はこの項目は設定の必要はありません。

uLimits

コンテナuLimitを設定できます。

とりあえず試して見たいという場合はこの項目は設定の必要はありません。

設定が完了したら画面右下にあるCreate job definitionのボタンを押して作成完了です。

作成完了するとジョブ定義一覧に作成したジョブ定義が表示されます。

ジョブのキューの作成

ジョブ定義ができたらジョブキューを作成します。

AWS マネジメントコンソールでジョブキューに移動します。

画面遷移したら、キューの作成をクリックします。

※詳細についてはCreating a Job Queueをご確認ください。

Create a job queue

Queue name

Queue name には任意のキュー名を入力します。

Priority

Priority はキューの優先度です。

複数のキューがある場合優先度が高いキュー入っているジョブから実行されます。

とりあえず試して見たいという場合は1で問題ありません。

Enable Job queue

Enable Job queue キューを有効化するかどうかです。

キューが有効化されていないとジョブをキューに入れることはできません。

そのため基本的にはチェックは入れっぱなしで大丈夫です。

Connected compute environments for this queue

キューを処理するコンピューティング環境を指定します。

先ほど作った環境を指定しましょう。

全ての項目の設定が終わればCreate Job Queueをクリックします。

ジョブの実行

いよいよジョブを実行し、EFSの中にあるファイルにアクセスしてみます。

AWS マネジメントコンソールでジョブに移動します。

ジョブの送信をクリックします。

Job run-time

Job name

Job name には分かりやすい任意のジョブ名を入力します。

Job definition

Job definition には先ほど作成したジョブ定義を選択、指定します。

Job queue

Job queue は先ほど作成したジョブキューを指定します。

Job Type

Job Type はジョブ内容に合わせて選びます。

とりあえず試して見たいという場合はSingleで問題ありません。

Job depends on

Job depends on はジョブの依存関係を指定します。

他のジョブの成果物を利用して動くジョブの場合はこの設定を利用して実行順をコントロールします。

とりあえず試して見たいという場合は空欄で問題ありません。

Job attempts

Job attempts はジョブの試行回数です。

空欄の場合はジョブ定義の設定で実行されます。

とりあえず試して見たいという場合は空欄で問題ありません。

Execution timeout

Execution timeout はジョブのタイムアウト時間設定です。

空欄の場合はジョブ定義の設定で実行されます。

とりあえず試して見たいという場合は空欄で問題ありません。

Parameters

ジョブ定義で設定したパラメータに追加、上書きができます。

とりあえず試して見たいという場合は設定は必要はありません。

Container properties

この項目はジョブ定義を指定したタイミングで自動入力されます。

原則変更の必要はありませんが今回はリソース多めに割り当てたいやコマンドを変更したいなどがあれば変更してください。

とりあえず試して見たいという場合は特に変更する必要はありません。

Environment variables

ジョブ定義で設定した環境変数の追加、上書きができます。

必要に応じて設定してください。

とりあえず試して見たいという場合は特に変更する必要はありません。

以上の設定が完了したらSubmit jobをクリックしてください。

ジョブが実行されます。

実行結果の確認

ジョブがうまくいけばSUCCEEDEDのステータスになります。

ジョブIDをクリックすると詳細をみることができます

ジョブのログはCloud Watch Logsに出力されます。

View logsをクリックするとCloud Watch Logsの対象のログの画面に移動します。

テストファイルを開いた場合はtestを表示されているはずです。

まとめ

再度の記載になりますが、重要なポイントは3つです

  1. EFSをマウントする処理を書いたユーザデータを含むLaunchTemplateを作る
  2. LaunchTemplateを利用してコンピューティング環境を作る
  3. コンテナがEFSを見れるようにVolumeとMount Pointを設定する

この三つの設定をAWS Batch構築時に行うことでEFSが簡単に使えるようになります。

AWS Batchをうまく利用してバッチサーバの管理の手間を減らしていきたいですね。