[AWS] AWS EFSがかなり便利そう!

 今月に東京リージョンでリリースされたAWS EFS(Elastic File System)を試してみたのですがなかなか便利そうだったので記事にしました。
 ただこの機能は個人利用で使うケースはあまり無い気がします。企業が運営するサービスのような大きいものに対して使う機能になりそうですね!ついに東京リージョンにも来たわけですがまだまだ国内企業の利用している情報が少ないので検証の段階なんでしょうか。そういった世間に少しでも助力になればと思います。

※この記事は書きかけなので後ほどアップデートします。

 

AWS EFSとは

 AWS EFSとは簡単に言うとスケーラブルな共有ファイルサービスです。EC2インスタンスにマウントすることで共通ファイルの管理を容易にすることができます。複数のアベイラビリティゾーンにも跨っており、耐久性も充分に補償されています。
 多数のインスタンスからマウントすることができます。設計上、千個ものEC2インスタンスと接続をした場合であっても高いパフォーマンスが維持されます。

 莫大なアクセスのあるWebサービスで、ソースコード側をEFSに置いてECS上でWebサーバーなどを用意する使い方で負荷分散ができそうですね。その場合にはソースコードの管理場所がEFS上のみになるので色々と便利ではないでしょうか。

ファイルシステムへのアクセス
Amazon EFS では、完全なファイルシステムアクセスのセマンティクスをサポートする標準的なファイルシステムインターフェイスを利用できます。NFSv4 を使用すると、Amazon EFS ファイルシステムを Amazon EC2 Linux ベースインスタンスにマウントできます。マウントが完了すると、ローカルファイルシステムと同じようにファイルやディレクトリを操作できるようになります。
https://aws.amazon.com/jp/efs/features/

 一度マウントしてしまえばEFSの存在を意識せずに利用できます。ただし当然ですがEBSよりも読み込み・書き込みには時間が掛かってしまうようです。マウントについてはEC2の起動設定に入れ込むことができますので、AutoScalingの設定にマウント設定を書き込んでおけばEFSのマウントを意識する必要がなくなりますね。

 

実際に試してみる

 実際に試す場合はAWS公式のチュートリアルにてECSで立ち上げたWebサーバーにEFSをマウントさせる例があるのでこれが非常に実用的です。

 実際に私の環境でも試してみることにします。目標としては下記の状態を構築します。
・ECSで利用するインスタンスにマウントする
・新規に立ち上がるインスタンスにも自動的にマウントされるようにする
・コンテナ内からもマウントポイントにアクセスさせる

 

環境構築

 ここでは検証のため「prd-testcluster」というクラスターを事前に作成しておきました。

 AWS EFSでファイルシステムの構築をしておく必要があります。EC2インスタンスへマウントするためには同一のVPC内にある同一のアベイラビリティゾーンを指定する必要があります。もしもマウントができない場合は異なるVPCの設定になっていないか、セキュリティグループの設定は適切であるかを確認する必要があります。

 ECSの配下になるインスタンスを設定するために、AutoScalingの設定画面から「起動設定の作成」を選択します。

 「起動設定」から「新しい起動設定を作成する」を選択して次のステップに進みます。
次のステップでは「コミュニティAMI」から最新のECSイメージ(ami-fbc1c684)を選択しておいてください。

 基本的に設定手順はEC2インスタンスを立てるときと同じですが、「起動設定の作成」の際にECS用のIAMロールを選択しておくことと、「ユーザーデータ」にてマウントの設定を記述する必要があります。

ユーザーデータの内容はAWSのチュートリアルにもあるように下記の通りにしました。
8,9行目:yum install にてマウントの為にnfsをインストールします。
12行目:マウント用のディレクトリを作成しています。
15行目:マウントするEFSとディレクトリを設定しています。
23行目:ECS_CLUSTER=prd-testclusterの部分でECSクラスターを指定しています。

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

--==BOUNDARY==
Content-Type: text/cloud-boothook; charset="us-ascii"

# Install nfs-utils
cloud-init-per once yum_update yum update -y
cloud-init-per once install_nfs_utils yum install -y nfs-utils

# Create /x folder
cloud-init-per once mkdir_efs mkdir /x

# Mount /x
cloud-init-per once mount_efs echo -e 'fs-xxxxxxxx.efs.xx-xx-x.amazonaws.com:/ /x nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0' >> /etc/fstab
mount -a

--==BOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
# Set any ECS agent configuration options
echo "ECS_CLUSTER=prd-testcluster" >> /etc/ecs/ecs.config

--==BOUNDARY==--

 この起動設定からAutoScalingグループを作成すると、立ち上がるインスタンスは常にEFSをマウントしている状態になります。
ECSのタスクを立ち上げる際には、タスクの設定JSONファイルに下記を追加してください。

      "mountPoints": [
        {
          "containerPath": "/var/www/html",
          "sourceVolume": "efs-html"
        }
      ]
  "volumes": [
    {
      "host": {
        "sourcePath": "/x"
      },
      "name": "efs-html"
    }
  ]

この設定によりECSのコンテナ内の/var/www/htmlディレクトリ内の内容はEFSが参照されます。

 

書き込み・読み込み速度について

測定したデータが手元にないので後で更新します。
数値乗っけなきゃ意味ないですもんね。

◆ベンチマーク
——————————
— 読み込み速度測定 —
——————————

◆◆◆EBSの読み込み速度
sudo fio –directory=/ –name fio_test_file –direct=1 –rw=randread –bs=4k –size=1G –numjobs=4 –time_based –runtime=180 –group_reporting –norandommap

Run status group 0 (all jobs):
READ: io=2163.4MB, aggrb=12307KB/s, minb=12307KB/s, maxb=12307KB/s, mint=180002msec, maxt=180002msec

◆◆◆EFSの読み込み速度
sudo fio –directory=/var/www/html –name fio_test_file –direct=1 –rw=randread –bs=4k –size=1G –numjobs=4 –time_based –runtime=180 –group_reporting –norandommap

Run status group 0 (all jobs):
READ: io=926956KB, aggrb=5149KB/s, minb=5149KB/s, maxb=5149KB/s, mint=180003msec, maxt=180003msec

◆◆◆EFS先にさらに別のEFSをマウントした時の読み込み速度
[ec2-user~]$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 484M 60K 484M 1% /dev
tmpfs 494M 0 494M 0% /dev/shm
/dev/xvda1 7.8G 3.2G 4.6G 41% /
fs-084caf29.efs.ap-northeast-1.amazonaws.com:/ 8.0E 0 8.0E 0% /home/ec2-user/efs-mount-point
fs-154caf34.efs.ap-northeast-1.amazonaws.com:/ 8.0E 0 8.0E 0% /home/ec2-user/efs-mount-point/test-mount

sudo fio –directory=/home/ec2-user/efs-mount-point/test-mount –name fio_test_file –direct=1 –rw=randread –bs=4k –size=1G –numjobs=4 –time_based –runtime=180 –group_reporting –norandommap

Run status group 0 (all jobs):
READ: io=853464KB, aggrb=4741KB/s, minb=4741KB/s, maxb=4741KB/s, mint=180005msec, maxt=180005msec

結論だけいうと、私の環境ではベンチマークの方法によってはEBSの10~40%程度の読み込みパフォーマンスでした。
また、大量データ(30GBほど)の書き込みを行おうとするとフリーズしてしまい、あせってEC2インスタンスを再起動するハメになりました。これについては公式Q&Aに似たような事例があり、どうやらフリーズしていたわけではないのですが大量データのアップロードに関しては注意が必要かもしれません。

そしてPHPとかサーバーサイドで動くものはここに置いてもよいのかよく検証する必要はありそうです。キャッシュを活用すればある程度はカバーできそうですが・・。そもそも静的データならばS3の選択もあるので、こまめに更新が行われるhtmlファイルなどがもっともらしいEFS利用対象になりそうですね。

また、EFSで現在使用しているデータ容量はEFSのコンソールやdfコマンドでの確認では即座にはわからないようです。挙動的に一定時間ごとに保存容量を確認しているのかもしれません。

 

終わりに

 企業で大規模なWebサービスを展開している場合、ソースコード側をEFS上においてマウントさせればコード管理が容易になりますし、デプロイ環境の構築もしやすくなるのではないかと思っています。
 AWS EFSは東京リージョンでリリースされたばかりなのでまだまだ活用している企業は少ない印象ですが、日本での利用実績が出回れば結構流行るんじゃなかろうかと思っています。ただし、地雷っぽい挙動もみられていることとやや大きめのレイテンシーがどの程度まで許容できるのかについては検証が必要ですね。逆にAWSの個人利用者ではあまり使うケースが少なそうです。EBSやS3で事足りそう。

 なんやかんやで東京リージョンでのリリースから日が浅いので、新しい情報がもっと出回ることを願うばかりです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)