話題の記事

【新機能】Amazon Elastic File System (Amazon EFS)がついにGA (一般利用可能)に!

2016.06.29

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

こんにちは、せーのです。今日はなかなか大きめなニュースが入ってきたのでご紹介します。AWS発の共有ストレージサービス「Amazon EFS」がGenerally Available、つまり正式リリース段階に入りました!

EFS、覚えてる?

EFS。この単語が初めて出てきたのは今から丸一年以上前に行われたAWS Summit 2015 San Franciscoでした。

【新サービス】共有ストレージ(EFS)が発表!EFSの良い点、気になる点 #AWSSummit

当時はNFSv4に対応した共有ストレージと言う事で柔軟なスケールアウトが特徴でもあるクラウドにおいてS3ほどレスポンスかからない、かと言ってEBSのように完全ローカルでもない、ちょうどいい感じのストレージサービスとして期待度マックスで、クラメソ内でもひたすらリリースを待ちわびる声が後を絶ちませんでした。

そして待つこと1年、ようやく本日リリースを迎えました!

特徴

それではEFSの特徴を見ていきましょう。

POSIX準拠、NFSを通じてアクセス

EFSはPOSIXに準拠したファイルシステムでEC2インスタンスとはNFS(Network File System)を通じてアクセスします。EFSはNFSのv4.0とv4.1クライアントに対応します。上のブログでもありましたがWindows Server 2012 以降は、NFS v4.1までのサポートとなり、なかでもクライアントに関してはWindows Server 2012 以降においても、NFS クライアント機能は NFS v2 および NFS v3 までのサポートになります。つまり現時点ではNFSはWindows Server EC2では使えません。

File system mount to Windows instance fails. / Using Amazon EFS with Microsoft Windows Amazon EC2 instances is not supported.

http://docs.aws.amazon.com/ja_jp/efs/latest/ug/troubleshooting.html

容量の指定をしない

EFSは事前に容量の指定をしません。使うと使っただけ拡張し、使った分だけが課金されるというシステムとなります。ドキュメントによると

there’s no fixed upper limit and you can grow to petabyte scale

つまりどこまででもいける、ということです。フルディスクの心配がない、事前の見積をしなくても最低限の課金で済む、という設計は嬉しいですね。

シングルVPC、マルチAZで使用可能

EFSは一つのVPCの各サブネットに対してマウントすることで使えるようになります。ですのでVPC内のEC2インスタンスであればAvailability Zoneを問わずにアクセスすることができます。ただAZごとに一つまでしかターゲットを作れないので、どのサブネットに作るべきかは設計が必要です。 EFSのデータそのものやメタ情報はEFS内部で複数のAZにコピーされて保管されるためAZによるアクセス速度も違いはないものと思われます(これも誰かが後でやってみるかと思います)。一方VPC内部でのアクセスを前提にしているため、VPC外からのアクセス(VPN connection, VPC peering, AWS Direct Connect)はサポートされていません。でも所謂EC2-Classicと呼ばれるインスタンスはClassicLinkを設定していればマウントできます。 各サブネットにマウントターゲットを作成することができ、それぞれのマウントに対するアクセスはセキュリティグループにて制御する形となります。各サブネットに対してマウントターゲットを作成する、ということはどのサブネットにインスタンスがいるかによってマウントするターゲットを変えることでどこにいても常に一定のパフォーマンスを出すことが出来そうです。

efs1

2つのパフォーマンスモード

EFSは[General Purpose]と[Max I/O]という2つのパフォーマンスモードがあり、このモードを使い分けることで状況にあった効率的なアクセスを可能にします。

General Purpose

General Purposeはその名の通りデフォルトの設定です。Webサービスやコンテンツ管理システム、ホームサーバー、ファイルサーバー等レイテンシ優先のユースケース時に使用します。レイテンシは確保される一方、何百台、何千台というEC2からの同時アクセスを捌く、という用途には厳しいです。

Max I/O

Max I/OはGeneral Purposeと変わって秒間のオペレーションや高スループットに重点を置いています。ビッグデータ処理や並列処理、メディアデータの処理、ゲノム解析等沢山の マシンで同時に処理をこなすような用途に使います。

使い分け方

2つのモード、実際にはどのように使い分けるのでしょうか。目安となるのはCloudWatchの[PercentIOLimit]という項目です。これはIO制限にどれくらい近い値で使っているか、という指標で、これが100%近い数値を出しているようであればMax I/Oモードで運用するのが良いでしょう。

スループットの増減とバースト、クレジット

EFSのスループットはEBS同様使用している容量によって増減します。これがベースのスループットとなり、それに加えて「バースト」「クレジット」という考えに基いてスループットが増減します。これによりスパイキーな短期アクセスに対しては高スループットで余裕をもって捌いてくれる、平常時は普通のスループットに戻る、ということですね。

基本のバースト時スループット

まずどんな容量でも基本ベースとして100MiB/秒のバーストができます。使用している容量が1TB増えるごとにプラスで100MB/秒ずつバースト容量が増えていきます。つまり10TB使っていればバースト時は1GB/秒のスループットがでるわけです。

クレジット

クレジットの考え方はもう少し複雑です。まずクレジットはベースラインレートという基準となるアクセス頻度を下回っている時に溜まっていきます。ベースラインレートはEFSで言えば1TBごとに50 MiB/s、1GBで言えば50 KiB/sとなります。つまりこれを下回る頻度でのアクセスが続いている時にクレジットが溜まっていく、ということです。そしてベースラインレートを超えたアクセスがあった時、溜まっていたクレジットは自動的に使われてバーストアクセスが可能となります。

つまりどういうことか、例を出して考えてみましょう。

EFSに100GBの容量が入っていたとします。ベースラインレートは1GBで50 KiB/sなので、100GBであれば5MiB/sとなります。一方バーストするのは1TBいっていませんので基本ベースとなる100MB/秒のバーストとなります。一日の95%が5MiB/sのアクセス頻度だとすると432,000MiB分のクレジットがたまり、それを100MB/秒でバーストすると72分となります。簡単に言うと100GBの容量ではずーっと5MiB/s以下のアクセス頻度であれば1日に72分間バーストを続けることができる、ということです。

容量が1TBを超えると一日の50%、つまり12時間がベースラインレート以下であれば、残り12時間はずっとバーストし続けていることができます。要は容量が大きければ大きいほどスパイクした時に長時間耐えられる、ということです。

尚クレジットの下限は1GBとなりますので、それ以下の容量しか入っていなかったとしてもベースラインレートは50 KiB/sとなります。これらを表にまとめるとこんな感じになります。

ファイルシステムサイズ (GiB) ベースラインレート (MiB/s) バーストサイズ (MiB/s) 最大バースト時間 (hours) %
10 0.5 100 6.0 0.5%
256 12.5 100 6.9 12.5%
512 25.0 100 8.0 25.0%
1024 50.0 100 12.0 50.0%
1536 75.0 150 12.0 50.0%
2048 100.0 200 12.0 50.0%
3072 150.0 300 12.0 50.0%
4096 200.0 400 12.0 50.0%

CloudWatchには[BurstCreditBalance]という項目がありますので、こちらをチェックしてみるとどれくらいの容量が必要か見積が出せると思います。

非同期書き込み

EFSは共有ストレージ、ということで非同期による書き込みが出来るようにマウント時に非同期オプション(async)をつけることができます。その場合バッファはEC2内にキャッシュされます。 またパフォーマンスを確保するためにはEC2そのもののメモリやCPU処理能力も関係します。パフォーマンスが出ないと感じた時はインスタンスタイプを上げてみるのも手です。尚EBS最適化されたインスタンスでもEFSにはその影響はないので注意しましょう。

制限事項

その他制限事項を羅列します。

  • 最大ファイルシステム数: 10
  • AZ毎の最大ターゲットマウント数: 1
  • ターゲット毎の最大セキュリティグループ数: 5
  • ファイルシステム毎の最大タグ数: 10
  • ファイルシステムに紐付けられるVPC: 1
  • インスタンス毎の最大スループット: 250 MB/s
  • 同時にファイルアクセスできる最大アカウント: 128
  • 特定インスタンスから同時アクセスできる最大ファイル数: 32,768
  • EFSに接続されているインスタンスに対する最大総スループット: 3 GB/s(サポートに申請すれば上限緩和できる)
  • 名前の長さ: 255バイトまで
  • 1ファイルの最大容量: 52TiB

料金

料金はひと月$0.30/GBとなります。EBSとS3のまんなかくらい、といったところでしょうか。

やってみた

前置きが長くなりましたが、とりあえずやってみましょう。マネージメントコンソールからEFSをクリックします。

efs2

現在EFSが使えるのは3リージョンになります。速く東京こないかなー。

efs3

トップページからcreateボタンをクリックします。

efs4

対象となるVPCを選択すると自動的に各AZに所属しているサブネットとセキュリティグループが選択されます。今回はテスト、と言う事で全体をカバーするdefaultのセキュリティグループを選択していますが、本来はTCP/2049ポートを空けてもらえればOKです。

efs5

次にタグを設定します。

efs6

確認画面をサクッと確認して

efs7

出来ました。超簡単ですね。

efs8

ちなみに下の方にある[EC2 mount instructions]というリンクをクリックすると

efs10

実際のマウント方法がチュートリアルとして載っているので参考にしましょう。

efs11

もう一つの[DNS Name]というリンクはVPCのDNSホスト名やResolutionを許可しているとマウントターゲットに対してDNS Nameが振られています。

efs12

これでEFS側の設定は終わりです。VPC上にEC2を立てて確認してみましょう。

efs9

EC2が立ったらログインして上のチュートリアルをなぞってみます。ますefs-utilsを入れてみます。

[ec2-user@ip-10-0-0-236 ~]$ sudo yum install -y nfs-utils
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main/latest                                         | 2.1 kB     00:00
amzn-main/latest/group                                   |  35 kB     00:00
amzn-main/latest/primary_db                              | 3.5 MB     00:00
amzn-updates/latest                                      | 2.3 kB     00:00
amzn-updates/latest/group                                |  35 kB     00:00
amzn-updates/latest/updateinfo                           | 319 kB     00:00
amzn-updates/latest/primary_db                           | 597 kB     00:00
パッケージ 1:nfs-utils-1.3.0-0.21.amzn1.x86_64 はインストール済みか最新バージョンです
何もしません

はいってました。次にディレクトリを作ってEFSをマウントしてみます。

[ec2-user@ip-10-0-0-236 ~]$ sudo mkdir efs
[ec2-user@ip-10-0-0-236 ~]$ sudo mount -t nfs4 -o nfsvers=4.1 $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone).fs-9816ecd1.efs.us-east-1.amazonaws.com:/ efs
[ec2-user@ip-10-0-0-236 ~]$ cd /efs
-bash: cd: /efs: そのようなファイルやディレクトリはありません
[ec2-user@ip-10-0-0-236 ~]$ df -h
ファイルシス                                         サイズ  使用  残り 使用% マウント位置
/dev/xvda1                                             7.8G  961M  6.8G   13% /
devtmpfs                                               238M   60K  238M    1% /dev
tmpfs                                                  246M     0  246M    0% /dev/shm
us-east-1b.fs-9816ecd1.efs.us-east-1.amazonaws.com:/   8.0E     0  8.0E    0% /home/ec2-user/efs

できました。エラいサイズを指しています。

[ec2-user@ip-10-0-0-236 ~]$ cd /home/ec2-user/efs/
[ec2-user@ip-10-0-0-236 efs]$ sudo touch test.txt
[ec2-user@ip-10-0-0-236 efs]$ ls -l
合計 4
-rw-r--r-- 1 root root 0  6月 29 08:25 test.txt
[ec2-user@ip-10-0-0-236 efs]$

問題なく使えるようです。

まとめ

いかがでしたでしょうか。新たな使用法やアイデアがどんどん浮かんでくるかと思います。東京リージョンがくるまでに使い倒して色々なノウハウを身につけておきましょう!

参考リンク