EFS(Elastic File System)の利用方法
EFS(Elastic File System)を試してみます。
前提情報
以下の図は公式サイトのドキュメントから持ってきたものです。AWSネットワーク上に共有ファイルとなるファイルシステムが存在し、各サブネットにマウントターゲットというENIを作成することになります。このマウントターゲットを、Linux上ファイルシステムでネットワーク・マウントして利用することになります。
Amazon EFS: 仕組み - Amazon Elastic File System
EFSファイルシステムのオプション
作成されるファイルシステムには、3つのオプションがあります。
- performance mode
- throughput mode
- https://docs.aws.amazon.com/ja_jp/efs/latest/ug/performance.html#throughput-modes
- 2つのオプションがあり。こっちは作成後にも変更可能。
- Bursting
- Provisioned
- 上のBurstingモードでは困った場合に利用する
- 利用するスループットを指定することができる
- 暗号化の有無
事前準備
セキュリティグループの作成
事前にEFSで使用するセキュリティグループを作成します。このセキュリティグループは、マウントターゲットにアタッチすることになるセキュリティグループとなります。つまり、各EC2からアクセスを受けるセキュリティグループですね。今回の例では、自己参照ルールを持ったセキュリティグループを作成し、マウントターゲットとEC2の両方に設定します。
具体的に、セキュリティグループで設定するポリシーは以下の通りです。
EFSファイルシステムの作成
AWS CLIにて作成をします。AWSコンソールからも当然作業できるのですが、コンソールから作成した場合、マウントターゲットで利用するIPアドレスを指定できないため、IPアドレスを指定したい場合はCLIで作成することになります。尚、本作業を実行するに、 AdministratorAccess
のポリシーが必要となるので、CLI実行のIAMユーザにポリシー付与してあげておいてください。
ファイルシステム作成のコマンド例は以下となります。 creation-token
には、64文字以内の任意のアスキー文字で指定してください。作成するファイルシステムが一意のものであることを確認するために利用するものとなります。尚、今回のコマンドは、いずれもWindows環境で実行しています。
> aws efs create-file-system ^ More? --creation-token FileSystemForSample ^ More? --performance-mode generalPurpose ^ More? --no-encrypted ^ More? --region ap-northeast-1 { "SizeInBytes": { "Value": 0 }, "CreationToken": "FileSystemForSample", "Encrypted": false, "CreationTime": 1537334185.0, "PerformanceMode": "generalPurpose", "FileSystemId": "fs-f96d9fd8", "NumberOfMountTargets": 0, "LifeCycleState": "creating", "OwnerId": "XXXXXXXXXX" }
マニュアル見ると、 --throughput-mode
のオプションを指定できるようですが、(現時点では)指定できませんでした。デフォルトのburstingのスループットモードでファイルシステムが作成されます。
create-file-system
のコマンドリファレンスです。
create-file-system — AWS CLI 1.16.28 Command Reference
続いて、作成したファイルを管理しやすいよう、Nameのタギングをしておきます。 --file-system-id
の値には、上記処理アウトプットに記載されている値を指定します。
> aws efs create-tags ^ More? --file-system-id fs-f96d9fd8 ^ More? --tags Key=Name,Value=sample
マウントターゲットの作成
マウントターゲットのCLI実行例です。複数のマウントターゲットを一度に作成できないので、作成必要なだけ実行してあげます。 --security-group
で指定する値は、上記で作成したセキュリティグループのidになります。
> aws efs create-mount-target ^ More? --file-system-id fs-f96d9fd8 ^ More? --subnet-id subnet-d3cdf99a ^ More? --ip-address 172.31.32.200 ^ More? --security-group sg-04bc89fe838aa76b0 { "MountTargetId": "fsmt-18806d39", "NetworkInterfaceId": "eni-01fc85eb7cd204678", "FileSystemId": "fs-f96d9fd8", "LifeCycleState": "creating", "SubnetId": "subnet-d3cdf99a", "OwnerId": "XXXXXXXXXX", "IpAddress": "172.31.32.200" }
create-mount-target
のコマンドリファレンスです。
create-mount-target — AWS CLI 1.16.28 Command Reference
EC2側の作業
今回利用するOSは Red Hat Enterprise Linux 7.5
となります。
セキュリティグループのアタッチ
EFSをマウントしたいEC2に、上記で作成したセキュリティグループをアタッチしてあげます。
NFSクライアント(amazon-efs-utils)のインストール
EFSのファイルシステムをマウントするには、 amazon-efs-utils
の利用が推奨されています。ファイルシステムをマウントする際や、EFSへ暗号化してデータ転送する際に、便利な機能を提供してくれるものとのこと。現在(2018/09/19)のところ、利用できるLinuxディストリビューション・バージョンは下記となります。
- Amazon Linux 2
- Amazon Linux
- Red Hat Enterprise Linux (および、その派生物 CentOS など) バージョン7以降
- Ubuntu 16.04 LTS 以降
また、以下のプログラムが依存プログラムとしてインストールされることになります。
- NFSクライアント (nfs-utilsパッケージ)
- ネットワークリレー (stunnelパッケージ、バージョン4.56以降)
- Python (バージョン2.7以降)
- OpenSSL 1.0.2 以降
実際にインストールしてみます。
まず git
と rpm-build
をインストールしてきます。 rpm-build
とは、makeした時にrpmファイルを作成してくれるモジュールらしいです。
$ sudo yum -y install git $ sudo yum -y install rpm-build
amazon-efs-utilsのソースを、githubからcloneしてきます。
$ git clone https://github.com/aws/efs-utils
cloneしてきたフォルダに移動して、makeして、作成されたrpmファイルをインストールします。
$ cd efs-utils/ $ sudo make rpm $ sudo yum -y install ./build/amazon-efs-utils*rpm
公式のドキュメントはこちらです。
amazon-efs-utils ツールを使用する - Amazon Elastic File System
EFSファイルシステムをマウントする
amazon-efs-utilsを利用して、EFSのファイルシステムをマウントします。
$ sudo mkdir /data/efs $ sudo mount -t efs fs-f96d9fd8:/ /data/efs
amazon-efs-utilsを利用してマウントすると、自動的に以下の最適なパラメータ設定にてマウントしてくれるらしいです。
- nfsvers=4.1
- rsize=1048576
- wsize=1048576
- hard
- timeo=600
- retrans=2
ちゃんとマウントされていることを確認。
$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/xvda2 10473452 1385624 9087828 14% / devtmpfs 484748 0 484748 0% /dev tmpfs 506948 0 506948 0% /dev/shm tmpfs 506948 13140 493808 3% /run tmpfs 506948 0 506948 0% /sys/fs/cgroup tmpfs 101392 0 101392 0% /run/user/1000 fs-f96d9fd8.efs.ap-northeast-1.amazonaws.com:/ 9007199254739968 0 9007199254739968 0% /data/efs
公式のドキュメントはこちらです。
ファイルシステムをマウントする - Amazon Elastic File System
fstabへの書き方
当然、OS起動時に自動的にマウントされていて欲しいので、fstabに設定情報を記載しておきます。記載する内容はこんな感じです。詳しくは、下記に貼った公式マニュアルを参考。
fs-f96d9fd8:/ /data/efs efs defaults,_netdev 0 0
公式のドキュメントはこちらです。
Amazon EFS ファイルシステムの自動マウント - Amazon Elastic File System
その他
アクセス権
アクセス権の考え方は、一般的なNFSサーバと一緒ですね。Linuxファイルシステムのファイルパーミッションで管理されています。ファイルの所有者は、OSユーザ名で管理されるのではなく、OSユーザidにて管理されることになるので、複数サーバから同一ファイルにアクセスする場合には、注意が必要です。ユーザidレベルで、ユーザ名を統一しておく必要があります。