share facebook facebook facebook twitter twitter menu hatena pocket slack

2018.07.23 MON

AWS BatchでEFSをマウントしディスク共有してみる

河村 敏貴

WRITTEN BY 河村 敏貴

もうすぐEFSが東京リージョンに来ますね。最近はAWS Batchを触る機会が多くなってきたので、AWS BatchでEFSを使ってのディスク共有を検証してみました。
まだ東京リージョンにはないので今回はバージニアリージョンを利用して検証してみます。

構成

手順概要

  1. EFSの作成
  2. Batch用イメージの作成
  3. AWS Batchの設定
  4. 実行確認

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では耐えきれないワークロードなどで利用検討してみてください。

参考

Amazon Elastic File System (Amazon EFS) では、Amazon EC2 インスタンスで使用するためのシンプルでスケーラブルなファイルストレージを提供します。Amazon EFS を使用すると、ストレージ容量が伸縮自在になり、ファイルの追加および削除時に自動的に伸縮されるよ...

docs.aws.amazon.com

元記事はこちら

AWS BatchでEFSをマウントしディスク共有してみる

河村 敏貴

河村 敏貴

クラウド業界に興味を持ち、業務系のアプリエンジニアからインフラエンジニア見習いに転身しました。日々新しい技術に触れることができる環境でもがきつつも楽しい毎日を過ごしています。 河村 敏貴

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。