AWS BatchがジョブレベルでEFSボリュームをサポートするようになっていました

AWS BatchからEFSを使うのが簡単に。そしてFargate起動タイプからも利用できるようになっています。
2021.04.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。AWS事業本部のKyoです。

AWS BatchがジョブレベルでEFSボリュームをサポートするようになっていました。

BatchでEFSを使うためには一手間が必要だったのでより簡単に使えるようになったというアップデートです。

AWS Batch now supports EFS volumes at the job level

これまでとこれから、そして何がうれしいのか

これまで

EFS自体の利用は可能でした。一方で、マウントには起動テンプレートが必要でバッチインスタンス(EC2)レベルでのマウントが必要でした。具体的な方法は以下にあります。

これから

ジョブ定義からEFSを指定することでマウントできるようになりました。マウントのための起動テンプレートは不要になります。

何がうれしいのか

Batchのストレージに何を使うかは、扱うデータのサイズや求められる計算スピードなどを踏まえての検討が必要となるため、ケースバイケースと考えていますが、マウントの手間が減ったことでEFSを使うハードルが下がった、というのは単純に喜んでいいと思います。

また、Fargate起動タイプからEFSが利用できるようになった というのもポイントです。

Fargate起動タイプはEC2起動タイプと異なりストレージサイズの変更ができません。(Fargateプラットフォームバージョン1.4.0以降であれば20GBのエフェメラルストレージが割当)。

また、Fargate起動タイプは利用できるCPUとメモリの組み合わせが決まっており、重たい計算というよりは比較的軽量な計算を並列で行う場合などに利用されるケースが多いと考えられます。そうなると複数のジョブから共有ストレージを参照できる今回のアップデートはメリットが大きいのではないでしょうか。

制約

いくつか制約がありますので簡単にまとめます。詳しくはこちらのドキュメントをご覧ください。

EC2起動タイプ

  • ECS optimized AMI version 20200319 or later を推奨
    • 20200319 with container agent version 1.38.0がGAの対象
    • 20191212 with container agent version 1.35.0は現時点でパブリックプレビュー

Fargate起動タイプ

  • プラットフォームバージョン 1.4.0以降が必要
  • EFS管理用のスーパーバイザーコンテナが作成され、これによってジョブのメモリが少量使用される

やってみる

個人的によく利用するEC2起動タイプ(スポット)でやってみます。

要素が多いのですが、重要なのは以下の3点です。 1. セキュリティグループ: コンテナインスタンスからEFSのアクセス許可 2. ジョブロール: EFSへアクセスするためのロール 3. ジョブ定義: ボリュームとマウントポイントの指定

セキュリティグループ

以下の2種類のセキュリティグループを準備します。

  • batch-instance-sg
    • Batchインスタンス(Batchコンピューティング環境)に付与
    • インバウンドなし
  • efs-sg
    • EFSに付与するsg
    • batch-instance-sgからのNFSアクセスを許可

IAM

Batchのジョブ定義様に以下の2種類のIAMロールを作成します。

  • batch-efs-job-role
    • ジョブロールとして使用
  • batch-exe-role
    • 実行ロールとして使用

余談ですが、この2つを間違えてハマってしまった経験がある方も多いのではないでしょうか。

この部分はECSと共通なので、以下のエントリのタスクをジョブと読み替えるとすっきりすると思います。

EFS

Batchコンピューティング環境と同じVPC内に作成し、先ほど作成したefs-sgを付与してください。また、後で必要になるのでファイルシステムID(fs-xxxxx)をメモしておいてください。

Batch コンピューティング環境

スポットインスタンスを利用する設定にしています。矢印で示した箇所にセキュリティグループとしてbatch-instance-sgを指定しています。

Batch ジョブキュー

任意の名前でジョブキューを作成し、先ほど作成したコンピューティング環境を紐付けてください。

特に設定値の変更は行っていません。

Batch ジョブ定義

ジョブ定義を作成します。

コンテナにAmazon EFSファイルシステムボリュームを使用するには、ジョブ定義でボリュームとマウントポイント設定を指定する必要があります。

図中の赤枠の4箇所がポイントになります。

  • EFSのマウントを確認するため、コマンドをdf -h
  • ジョブロールと実行ロール
    • ジョブロールに batch-efs-job-role
    • 実行ロールに batch-exe-role
  • マウントポイントの指定
  • ボリュームの指定
    • ファイルシステムIDはメモしておいたものを入力

エラーが出たら

作成ボタンを押下した際に以下のエラーが発生することがあるようです。

エラー: Error executing request, Exception : When the volume parameter is specified, only one volume configuration type should be used., RequestId: xxxxx

対応として、「プラットフォームで一度Fargateを選択して、再度EC2を選択する」とエラーが発生しなくなりました。原因は不明ですが、Batchが内部的に扱っているパラメータの変更に起因するのではないかと考えています。

Batch ジョブ実行

ジョブを実行します。任意の名前をつけることと、先ほど作成したキューを指定する以外、パラメータの変更は行っていません。

SUCCEEDEDになったログを覗いてみます。

/mnt/efsにEFSが確認できていますね。

おわりに

本エントリではBatchのジョブ定義から簡単にEFSがマウントできるようになった、というアップデートを紹介しました。

以上、何かのお役に立てれば幸いです。