【AWS初心者向け】ハンズオンで学習!EFSの基礎を理解しよう。

マルチAZサイトを構築する際にAmazon Elastic File System(以下EFS)を触る機会がありましたが、いまいち理解が追い付かず苦労した斎藤です。
 
EFSを優雅に扱えるようになりたいので、本記事を作成することでマウント(後述)手順を整理し、EFSの基礎を頭の中に叩き込むこととしました。
 

本記事の目的

AWS初心者が、EFSについてハンズオンを通しながら理解を深める。
 

概要

  1. EFSって何?
  2. 検証環境構築
  3. 検証
  4. まとめ
     
     
    留意点
     
    本来は2台目のEC2インスタンスをプライベートサブネットにEC2を置いて検証をする予定でした。
     
    しかし、EC2インスタンスをプライベートサブネットに配置することで付随する作業がとても多くなってしまうことが判明しました。
     
    例)Session Managerの導入など
     
    そこで、サブネット配置等の構成はシンプルなものとし、ストレスをかけずに本記事の目的である【EFSの理解】を達成することを重要視しました。
     
    ちなみに、EC2インスタンスをプライベートに置き、EFS接続の検証をしたい場合は、以下の記事が参考になるでしょう。
     
    ↓ ↓ ↓
     

SSM を使用したプライベート EC2 インスタンスへの接続

プライベートサブネットにあるEC2インスタンスを Systems Manager で管理する

PrivateSubnetのEC2にSessionManager(NATゲートウェイ経由)で接続してみた

1.EFSって何?

 
EFSはフルマネージド型(運用管理を出来るだけAWS側で行い、ユーザーの負担を減らすこと)のファイルストレージです。
 
EFSを使用すると、簡単に障害に強い共有ファイルシステムを構築し、複数の接続元からのデータの共有とアクセスを容易にすることができるそうです。
 
ウェブサーバーのドキュメントルート、アプリケーションの設定ファイル、ユーザーデータ、ログファイルなど、複数のインスタンスで共有する必要があるファイルデータを格納するのに適しているとのこと。
 
主に以下の特徴があります。
 
↓ ↓ ↓
 

  • サーバ、ディスクなどの管理は不要
  • ファイルの追加や削除に合わせてストレージ容量を直ちに自動で拡張または縮小することが可能
  • 数千台のインスタンスから同時接続できて、同時に読み書きが可能
  • 高耐久性かつ高可用性を担保
  • 複数AZに複製されて保存される
  • 使用したストレージ容量やデータ転送量に基づく従量課金
     
     

    2.検証環境構築

     
    今回構築したい検証環境は以下の構成図の通りです。
     

     
    2つのアベイラリビティゾーンにパブリックサブネットを作成、その中に2台のAmazon Elastic Compute Cloud(以下EC2)を構築。2台のインスタンスからEFSに接続。
     
    手順は以下の通りです。

    1. マルチAZ構成でAmazon Elastic Compute Cloud(以下EC2)インスタンスを2台、およびEFSを作成する。
    2. インスタンス2台にマウントヘルパーをインストールし、[efs]という名前のディレクトリをマウントポイントとする。
    3. 1台目のインスタンスで[efs]ディレクトリ配下にテストファイルを作成
    4. 2台目のインスタンスでテストファイルを確認
    5. 1台目のインスタンスで容量の大きいダミーファイルを作成、コンソール画面でEFSの容量が自動拡張されているか確認
    6. 2台目のインスタンでダミーファイルを削除、コンソール画面でEFSの容量が自動縮小されているか確認
       
       

      2-1.VPCの作成

       
      まずはAWSマネジメントコンソール画面の検索窓からAmazon Virtual Private Cloud (以下VPC)を検索し、 本記事で検証する基盤を作成していきます。
       

       
       

項目
名前 任意の名前
IPv4 CIDR 10.0.0.0/16
タグ Key→User Value→識別するための名前

 
入力後、右下のVPCを作成をクリック。
作成後のVPCを選択すると、以下の詳細画面へ推移します。
 

 
右上のアクションをクリック
VPCの設定を編集
下の画面へ推移します。
 

 
DNSのホスト名を有効化し、保存しましょう。
 
 

2-2.サブネットの作成

 
画面左のVPCダッシュボードからサブネット→サブネットを作成をクリック
 


 

項目
VPC ID 作成したVPC
サブネット名 任意の名前
アベイラリビティゾーン 一つ目のサブネットはap-northeast-1a 二つ目のサブネットはap-northeast-2a
IPv4 CIDRブロック 一つ目のサブネットは10.0.1.0/24 二つ目のサブネットは10.0.2.0/24
タグ 任意の値

 
上記を入力後、サブネットを作成をクリック
 
 

2-3.インターネットゲートウェイの作成

 
画面左のVPCダッシュボードからインターネットゲートウェイ→インターネットゲートウェイを作成をクリック
 

 

項目
名前 任意の名前
タグ 任意の値

 
インターネットゲートウェイの作成を選択
 
作成したインターネットゲートウェイを選択すると、以下の画面に推移します。
 
そこで作成したインターネットゲートウェイをVPCにアタッチします。
 


 
VPC:作成したVPC
 
インターネットゲートウェイのアタッチをクリック
 
 

2-4.ルートテーブルの作成

 
画面左のVPCダッシュボードからルートテーブル→ルートテーブルの作成をクリック
 

 

項目
名前 任意の名前
VPC 作成したVPCを選択
タグ 任意の値

 
上記を入力後、ルートテーブルを作成
 
作成後、該当のルートテーブルを選択すると以下の画面に推移
 

 
ルートを編集をクリックし、以下の画面に推移
 

 
ルートを追加をクリック
 

項目
送信先 0.0.0.0
ターゲット 作成したインターネットゲートウェイ

 
上記を入力後、変更を保存します。
 
続いて、作成したルートテーブルにサブネットを関連付けるために、【サブネットの関連付け】項目を選択すると、以下の画面に推移します。
 


 
作成した2つのサブネットのチェックボックスにチェックを入れ、関連付けを保存し、ルートテーブルの作成を完了します。
 
 

2-5.セキュリティグループの作成

 
画面左のVPCダッシュボードからセキュリティグループ→セキュリティグループの作成をクリック
 

 
以下の画面に推移後、EC2インスタンス用のセキュリティグループを作成します。
 

 

項目
セキュリティグループ名 任意のもの
VPC 作成したVPC
一個目のインバウンドルール タイプ:SSH ソース:マイIP
二個目のインバウンドルール タイプ:HTTP ソース:0.0.0.0/0
タグ 任意の値

※一個目のインバウンドルールでSSHでの接続を許可し、二個目のインバウンドルールでHTTPからの通信を許可しています。

 
上記を入力後に、セキュリティグループを作成をクリック
 
 
続いてEFS用のセキュリティグループを作成します。
 

 

項目
セキュリティグループ名 任意のもの
VPC 作成したVPC
インバウンドルール(タイプ) NFS
インバウンドルール(ソース) 先ほど作成したEC2のセキュリティグループ
タグ 任意の値

 
上記を入力後に、セキュリティグループを作成をクリック
 
以上でEC2、EFS用の二つのセキュリティグループの作成が完了しました。
 
 

2-6.EFSの作成

 
AWSコンソールのサービス検索窓でEFSと入力すると、以下の画面に推移します。
 

 
ファイルシステムの作成をクリックすると、以下の画面へ
 

 

項目
名前 任意の名前
VPC 作成したVPC

 
以上を入力後、作成をクリック
 
作成したEFSを選択後、以下の画面に推移します。
 

 
ネットワークを選択し、管理ボタンをクリックすると以下の画面に推移します。
 

 
VPC、アベイラリビティゾーンは先の手順で作成したものを選択します。
 
セキュリティグループは先の手順で作成したEFS用のセキュリティグループを選択してください。
 
 

2-7.EC2の作成

 
AWSコンソールのサービス検索窓でEC2と入力すると、以下の画面に推移します。
 

 
EC2ダッシュボードから、インスタンスを選択すると以下の画面へ推移するので、インスタンスを起動をクリック
 

 

項目
名前 任意の名前
AMI 今回はAmazonLinux2を選択
インスタンスタイプ 無料のt2.microを選択
キーペア 事前に作成していたものを選択

※事前にキーペアを作成していない場合は新規作成

 

 
VPC:作成したもの
サブネット:一つ目のパブリックサブネット
 
※2台目のインスタンスを作成時は、一つ目のインスタンス作成時と別のサブネットを選択
 
パブリックIPの自動割り当て:有効化
ファイアウォール:作成したEC2用のセキュリティグループ
 
続いてファイルシステム項目の編集
 

 
EFSを選択
共有ファイルシステムを押下
作成したEFSを選択
 
以上を入力後、インスタンスを起動をクリック
 

 
ここまでの作業で、EC2インスタンスの1台目が作成されました。
 
2台目のインスタンスも同様に作成します。
インスタンス名は一台目と別のもの、
サブネットは一台目のインスタンスを作成した時と別のサブネットを選択する点に注意しましょう。
 
 

2-8.EFSのマウント作業

 
マウントとは、外部のストレージやデバイス(今回はEFS)をコンピュータ(今回はEC2インスタンス)に接続して、その中のファイルやデータにアクセスできるようにすることです。
 
AWSは、EFSのマウントを簡素化するためにamazon-efs-utilsというパッケージを用意しており、利用することを推奨しています。
 
amazon-efs-utilsをインストールすることで、マウントや転送時のデータ暗号化を簡単にできるようになります。
 
それでは、一台目のEC2インスタンスにssh接続して、以下のコマンドを入力しながらマウント作業を実施しましょう。
 

  1. amazon-efs-utils パッケージ(EFS クライアント)をインストール
    sudo yum install -y amazon-efs-utils

     

コマンド 意味
sudo 管理者の強い権限でこの後に続くコマンドを実行しますよ~
yum ソフトウェアパッケージの管理ツール。インストール、アップデート、削除等を行う。
install インストールしますよ~
-y このオプションを指定することで、インストール作業を対話形式ではなく自動的に行う

 
 

  1. ディレクトリを作成
    sudo mkdir /mnt/efs
    コマンド 意味
    mkdir make directoryの略。ディレクトリを作成するコマンド。ディレクトリとはフォルダのようなもの
    /mnt/efs mntディレクトリ配下のefsディレクトリ

 
 

  1. efs ディレクトリが作成できたことを確認します
    cd /mnt
    ll
    total 0
    drwxr-xr-x 2 root root 6 May 16 01:51 efs
    コマンド 意味
    cd コマンドの後に指定したディレクトリへ移動。指定がない場合はホームへ
    ll このディレクトリの中に、どんなファイルやディレクトリがあるのか教えて

 
efsという名のディレクトリが作成されていることが確認できますね。
 
 

  1. EFS ファイルシステムをマウントします。
    sudo mount -t efs -o tls fs-【EFSのID】:/ /mnt/efs
    コマンド 意味
    mount ファイルシステムをマウントしますよ。
    -t マウントするファイルシステムのタイプを指定するオプション。ここでは"EFS"を指定しています。
    -o tls マウント時にトランスポートレイヤーセキュリティ(TLS※通信時のセキュリティを確保する暗号化プロトコル)を使用しますよ。
    fs-【EFSのID】:/  マウントするEFSファイルシステムのIDとマウントポイントを指定。
    /mnt/efs マウントされるファイルシステムが配置されるディレクトリのパス。

 
EFSのIDは以下のEFS詳細画面で確認します。
 

 
 

  1. マウントが成功しているか確認
    df -h
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        468M     0  468M   0% /dev
    tmpfs           477M     0  477M   0% /dev/shm
    tmpfs           477M  468K  476M   1% /run
    tmpfs           477M     0  477M   0% /sys/fs/cgroup
    /dev/xvda1      8.0G  1.7G  6.4G  21% /
    tmpfs            96M     0   96M   0% /run/user/1000
    127.0.0.1:/     8.0E     0  8.0E   0% /mnt/efs
    コマンド 意味
    df ディスク使用状況を表示して
    -h ファイルサイズをキロバイト、メガバイト等のわかりやすい形式で出力して

 
上記の出力例では、/mnt/efsというディレクトリが、127.0.0.1:/というEC2自体を表すローカルホストに正常にマウントされていることが確認できます。
 
ここまでで1台目のインスタンスのマウント作業が完了したので、同様の手順で2台目のインスタンスも行いましょう。
 
 
 

3.検証

3-1.マウントできているか検証

 
手順は以下の通りです。
 

  1. 1台目のインスタンスでテストファイルを作成
  2. 2台目のインスタンスでテストファイルの存在を確認
     
     

    ①1台目のインスタンスでテストファイルを作成

    sudo touch /mnt/efs/testfile
    コマンド 意味
    touch 指定するディレクトリにファイルを作成しますよ~

 
 

②2台目のインスタンスでテストファイルの存在を確認

ll /mnt/efs
total 4
-rw-r--r-- 1 root root 0 May 16 09:11 testfile

2台目のインスタンスでtestfileが確認できれば検証大成功です!
 
2台のインスタンスともに、/mnt/efsディレクトリにEFSがマウントされているので、1台目のインスタンスで作成したファイルが2台目のインスタンスで確認できるのです。おめでとう!
 
 

3-2.EFSが自動伸縮するか検証

 
手順は以下の通りです。
 

  1. 1台目のインスタンスで容量の大きいダミーファイルを作成
  2. コンソール画面でEFSの容量が自動拡張してるかどうか確認
  3. 2台目のインスタンスでダミーファイルを削除
  4. コンソール画面でEFSの容量が自動縮小してるかどうか確認
     

    ①1台目のインスタンスで容量の大きいダミーファイルを作成

     
    マウント自体は成功しておりますが、EFSがファイルの容量により自動伸縮されるかどうか確認するための作業を行ってみましょう。
     
    まずはAWSマネジメントコンソール画面でEFSを開きましょう。現在の容量は6KiBです。
     

     
    1台目のインスタンスで6GBのダミーファイルを作成してみます。

    cd /mnt/efs/
    dd if=/dev/zero of=6GB.dummy bs=1MD count=6000
    ll -1h
    total 5.6G
    -rw-rw-r-- 1 ec2-user ec2-user 5.6G May 16 09:28 6GB.dummy
    -rw-r--r-- 1 root     root        0 May 16 09:11 testfile
    コマンド 意味
    dd データのコピーと変換をしますよ~
    if input fileの略。コピー元のファイル名やデバイス名を指定しますよ~
    /dev/zero ゼロバイトデータを提供しますよ~
    of=6GB.dummy 出力ファイルとして6GB.dummyを指定しますよ~
    bs=1M ブロックサイズを1メガバイトに設定しますよ~
    count=6000 6000回のブロックをコピーしますよ~

 
結果として、サイズが約6ギガバイトのダミーファイルが作成されます。
 
 

②コンソール画面でEFSの容量が自動拡張してるかどうか確認

 
コンソール画面上で自動伸縮が確認できるまで数十分かかりますが、EFSファイルシステムのサイズを確認しましょう。
 

 
ダミーファイル(6GB)とほぼ同じサイズまで自動拡張されていることを確認出来ました!
 
EFSは使った分だけ請求されるため、ダミーファイルとはいえ使わないファイルは以下のコマンドで消しておきましょう。
 
 

③2台目のインスタンスでダミーファイルを削除

 
もう一度可用性、冗長構成を確認するために、1台目のインスタンスで作成したダミーファイルを、2台目のインスタンスで削除してみます。

sudo rm /mnt/efs/6GB.dummy
コマンド 意味
rm removeの略。コマンドに続くファイルを消してしまう、とても怖いコマンド。

 
 

④コンソール画面でEFSの容量が自動縮小してるかどうか確認

 
数十分後、EFSファイルシステムが12KiBまで縮小していることを確認しました。
 

 
EFSはディレクトリに収納されているデータの容量に合わせ、風船のように伸縮するのですね!
 
以上で検証は終わりです!おつかれさまでした!
 
 
 

4.まとめ

 
今回の記事作成でハンズオン手順をまとめることで、EFSの理解がだいぶ進みました。
 
次のステップでは、プライベートサブネットにインスタンスを作成して、もう一歩レベルの高い構成で検証してみたいと思います。
 
この記事が皆様のEFSの理解になれば幸いです。

Last modified: 2023-05-18

Author