はじめに
今回はEFSを作成してみたのでその覚書となります。
大まかなステップは以下です。
- EFSの作成
- 作成したEFSを指定してEC2を起動
- 起動後の正常性確認
シンプルですね。
では早速始めましょう。
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]を押下したら、設定値が下記の通りであることを確認します。
- 作成したEFSが選択されていること
- Mount pointを/app-data(任意)に変更
- Automatically create and attach security groupsを有効化
- 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