もうすぐEFSが東京リージョンに来ますね。最近はAWS Batchを触る機会が多くなってきたので、AWS BatchでEFSを使ってのディスク共有を検証してみました。
まだ東京リージョンにはないので今回はバージニアリージョンを利用して検証してみます。
構成
手順概要
- EFSの作成
- Batch用イメージの作成
- AWS Batchの設定
- 実行確認
1. EFSの作成
まずAWS Batch用とEFS用にセキュリティグループを作成します。
Batch-SG(sg-batchsg)
Type | Protocol | Port Range | Source | Description |
---|---|---|---|---|
SSH | TCP | 22 | xxx.xxx.xxx.xxx/32 | ssh用 |
EFS-SG(sg-efssg)
Type | Protocol | Port Range | Source | Description |
---|---|---|---|---|
TCP | TCP | 2049 | sg-batchsg | batch→efs通信用 |
Batch用インスタンスからEFSに接続可能なように設定しておきます。
AWSコンソールからEFSを選択してEFSを作成します。
今回はデフォルトVPCとして、セキュリティグループは上で作成したEFS用のセキュリティグループを設定します。
ゾーンごとにセキュリティグループを設定するのは何だかなーという印象です。
作成後にDNS nameが割り当てられるので控えておいてください。
2. Batch用イメージの作成
ECS用のAMIからEC2を新規に作成し、起動時に指定のEFSを自動マウントする設定を行います。
バージニアリージョンの場合は以下のAMIから作成しました。
amzn-ami-2017.09.l-amazon-ecs-optimized (ami-aff65ad2)
以下にECS対応のAMIの一覧が記載されていますので参考にしてください。
ただし、AWS Batchのマネージド型で起動したインスタンスについては、2017.09のもので起動されていましたのでここではそれをベースとしています。
Amazon ECS 対応 AMI – Amazon Elastic Container Service
起動完了後にSSHでログインしrootユーザーで以下の設定を行います。
# マウント用のディレクトリ作成 mkdir /efs # NFSクライアントのインストール yum install -y nfs-utils
ここではEFSのFile system IDをfs-1234abcdとしていますが、実際のIDに合わせて変更してください。
# EFSをマウント mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-1234abcd.efs.us-east-1.amazonaws.com:/ /efs # 起動時にマウントするようにfstabを更新 echo 'fs-1234abcd.efs.us-east-1.amazonaws.com:/ /efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0' | sudo tee -a /etc/fstab
設定完了後にEC2を再起動し、EFSがマウントできていることを確認してください。
確認完了すれば、EC2を停止しAMIを作成し、それをAWS Batchの実行イメージとします。
※ 本番で利用する場合は、サポートログが出力されるefs-utilsのマウントヘルパーの利用を推奨
3. AWS Batchの設定
コンピューティング環境を作成
以下の設定で作成します
設定内容 | 設定値 |
---|---|
コンピューティング環境のタイプ | マネージド型 |
最小vCPU | 1 |
必要なvCPU | 1 |
以下の通りユーザー指定のAMIを有効にします。
上記以外はデフォルトで作成してください。
起動したインスタンスにssh接続
dockerコンテナからマウントした時の確認用として/efs配下に以下のファイル作成しておきます。
mkdir -p /efs/files $echo "Hello EFS!!" > /efs/files/test.txt $cat /efs/files/test.txt Hello EFS!!
ジョブ定義を作成します。
事前に以下を参照しroleを作成しておきます。
Amazon ECS コンテナインスタンスの IAM ロール – Amazon Elastic Container Service
busyboxを使ってホストの/efsディレクトリをコンテナの/homeディレクトリにマウントする設定を行います。
コンテナ起動時にtest.txtが表示することでマウントされていることを確認します。
設定内容 | 設定値 |
---|---|
コンテナイメージ | busybox |
コマンド | cat /home/files/test.txt |
vCPU | 1 |
メモリ | 128 |
ボリューム
設定内容 | 設定値 |
---|---|
名前 | efs |
ソースパス | /efs |
マウントポイント
設定内容 | 設定値 |
---|---|
コンテナパス | /home |
ソースパス | efs |
ジョブキューの作成
設定内容 | 設定値 |
---|---|
優先度 | 1 |
コンピューティング環境を選択 | 上記で作成したコンピューティング環境名 |
ジョブ実行
左ペインの「ジョブ」から「ジョブ送信」を選択します。
設定内容 | 設定値 |
---|---|
ジョブ名 | 任意 |
ジョブ定義 | 上記で作成したジョブ定義名 |
ジョブキュー | 上記で作成したジョブキュー名 |
他はデフォルトでOKです
実行結果
実行後しばらくすると正常に終了した場合は、コンソールのジョブのsucceededにジョブが表示されます。
cloudwatch logsに以下ログが出力されていれば成功です。
これまでAWS Batchのジョブ間でファイルを共有する場合は、S3が主な選択肢でしたが、今後はEFSも選択肢として使えそうです。
S3では耐えきれないワークロードなどで利用検討してみてください。
参考
docs.aws.amazon.com