EFSを作成してみた。

はじめに

今回はEFSを作成してみたのでその覚書となります。
大まかなステップは以下です。

  1. EFSの作成
  2. 作成したEFSを指定してEC2を起動
  3. 起動後の正常性確認

シンプルですね。

では早速始めましょう。

1. EFSの作成

EFSコンソールのナビゲーションペインからFile systemsページを開き、[Create file systems]を押下。

Customizeを押下。

以下のパラメータテーブルに則って設定値を入力します(コンソールのキャプチャは省略)。

パラメータテーブル

Parameter Category Parameter Setting More Information
Basic Settings
Automatic Backups Enabled https://docs.aws.amazon.com/efs/latest/ug/awsbackup.html
Network
Virtual Private Cloud(VPC) cfn-tom-vpc
Mount Targets Settings https://docs.aws.amazon.com/efs/latest/ug/manage-fs-access.html
Availability Zones ap-northeast-1a, ap-northeast-1c
Subnet Location cfn-tom-private-subnetA, cfn-tom-private-subnetC
Security Group Using the VPC’s default security group (Manageable post-creation)
File System Type https://docs.aws.amazon.com/efs/latest/ug/availability-durability.html#file-system-type
File System Type Regional
Performance https://docs.aws.amazon.com/efs/latest/ug/performance.html#performancemodes
method Enhanced
Performance Mode General Purpose
Throughput Mode Elastic https://docs.aws.amazon.com/efs/latest/ug/performance.html#throughput-modes
Encryption https://docs.aws.amazon.com/efs/latest/ug/encryption-at-rest.html
Data at Rest Encryption Enabled using default key for Amazon EFS (aws/elasticfilesystem)
Lifecycle Management https://docs.aws.amazon.com/efs/latest/ug/lifecycle-management-efs.html
Transition into IA Set to 30 days since last access
Transition to Archive Set to 90 days since last access
Transition into Standard Set to None
File system policy Set to None

2. EC2起動

EC2インスタンスを起動します。
通常と異なるのはStorageの設定のみのため、それ以外の説明は省略します。

File systemsでEFSを選択して[Add shared file system]を押下したら、設定値が下記の通りであることを確認します。

  1. 作成したEFSが選択されていること
  2. Mount pointを/app-data(任意)に変更
  3. Automatically create and attach security groupsを有効化
  4. Automatically mount shared file system by attaching required user data scriptを有効化

確認ができたらEC2を起動します。
すると、EFSが指定したEC2上のマウントポイントにマウントされ、ストレージとしてアクセスすることが可能となります。

補足:

3を有効化するとEC2インスタンス起動用に選択したSGとは別に、nfsとの接続のためのセキュリティグループがインスタンス用とEFS(マウントターゲット)用にそれぞれ1つずつ作成される。

4を有効化するとuserdataがデフォルトで含まれて自動的にマウントしてくれる。

公式doc

The User data automatically includes the commands for mounting your Amazon EFS file system.

3. 起動後の正常性確認

自動マウントされているか

fstabに自動的にエントリが追加されていることを確認します。
ドメイン名でのエントリが確認できますね。

[root@ip-10-0-2-159 ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Thu May 12 23:48:51 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=95070429-de61-4430-8ad0-2c0f109d8d50 /                       xfs     defaults        0 0

fs-027605c74463bd32a.efs.ap-northeast-1.amazonaws.com:/ /app-data nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0

念のため、マウントポイントを確認してみましょう。
すると、パーミッション755のrootユーザ所有で作成されていることが確認できます。

[root@ip-10-0-2-159 ~]# ls -ld /app-data/
drwxr-xr-x. 2 root root 6144 Jan  1 04:24 /app-data/

別のEC2から接続してファイル共有できているか

次は同じように起動した別AZのEC2インスタンスから接続して、ストレージが共有できているか確認してみます。

※以下、筆者が別サーバであることが識別しやすいようにhostnameをtom_server_aとtom_server_cに変えております。

まず、tom_server_aでファイルを作成します。

[root@tom_server_a ~]# ls -lrt /app-data/
total 0
[root@tom_server_a ~]# touch /app-data/hogehoge
[root@tom_server_a ~]# ls -lrt /app-data/
total 4
-rw-r--r--. 1 root root 0 Jan  2 06:37 hogehoge

次に、tom_server_cできちんと共有されているか確認します。

[root@tom_server_c ~]# ls -lrt /app-data/
total 4
-rw-r--r--. 1 root root 0 Jan  2 06:37 hogehoge

ちゃんと、同じものが見えていることが確認できましたね!

検証は以上です。

おわりにかえて

自動で設定されたuserdataについて確認してみるとミドルウェアとしてamazon-efs-utilsをインストールするようコマンドが書かれてあります。また、/sbin/mount.efsやefs-utils.confなどのファイルについて記述がありますが、今回の検証では詳しく掘り下げられませんでした。
また今度、この点について調べたことなど整理したいと思います。

補遺

参考 #1 作成されるSG

作成されるSGはインスタンスにアタッチされるinstance-sg-4と、EFSにアタッチされるefs-sg-4の2つ。

インスタンス用に作成されるSG

EC2起動時に選択したdefaultのSGと別に作成してアタッチされている。

in-boundに関する設定はなく、out-boundに関する設定が追加されている。

EFS用に作成されるSG

in-boundではnfs用のport2049が開いている。


out-boundではAll trafficが許可されている。

参考 #2 自動マウント用のuserdata

文字通り自動マウントのためのuserdataを自動で生成してEC2インスタンス起動時に実行させることができます。
実際のuserdataは以下の通りです。

#cloud-config
package_update: true
package_upgrade: true
runcmd:
- yum install -y amazon-efs-utils
- apt-get -y install amazon-efs-utils
- yum install -y nfs-utils
- apt-get -y install nfs-common
- file_system_id_1=fs-027605c74463bd32a
- efs_mount_point_1=/app-data
- mkdir -p "${efs_mount_point_1}"
- test -f "/sbin/mount.efs" && printf "\n${file_system_id_1}:/ ${efs_mount_point_1} efs tls,_netdev\n" >> /etc/fstab || printf "\n${file_system_id_1}.efs.ap-northeast-1.amazonaws.com:/ ${efs_mount_point_1} nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0\n" >> /etc/fstab
- test -f "/sbin/mount.efs" && grep -ozP 'client-info]\nsource' '/etc/amazon/efs/efs-utils.conf'; if [[ $? == 1 ]]; then printf "\n[client-info]\nsource=liw\n" >> /etc/amazon/efs/efs-utils.conf; fi;
- retryCnt=15; waitTime=30; while true; do mount -a -t efs,nfs4 defaults; if [ $? = 0 ] || [ $retryCnt -lt 1 ]; then echo File system mounted successfully; break; fi; echo File system not available, retrying to mount.; ((retryCnt--)); sleep $waitTime; done;

参考

AWS公式doc
https://docs.aws.amazon.com/efs/latest/ug/getting-started.html

Last modified: 2024-01-02

Author