EFS(Elastic File System)の利用方法

EFS(Elastic File System)を試してみます。

前提情報

EFSとは、AWSにおけるNFSのサービスですね。

以下の図は公式サイトのドキュメントから持ってきたものです。AWSネットワーク上に共有ファイルとなるファイルシステムが存在し、各サブネットにマウントターゲットというENIを作成することになります。このマウントターゲットを、Linuxファイルシステムでネットワーク・マウントして利用することになります。

f:id:goodbyegangster:20180925224429p:plain

Amazon EFS: 仕組み - Amazon Elastic File System

EFSファイルシステムのオプション

作成されるファイルシステムには、3つのオプションがあります。

事前準備

セキュリティグループの作成

事前にEFSで使用するセキュリティグループを作成します。このセキュリティグループは、マウントターゲットにアタッチすることになるセキュリティグループとなります。つまり、各EC2からアクセスを受けるセキュリティグループですね。今回の例では、自己参照ルールを持ったセキュリティグループを作成し、マウントターゲットとEC2の両方に設定します。

具体的に、セキュリティグループで設定するポリシーは以下の通りです。

f:id:goodbyegangster:20180925224726p:plain

  • Inbound
    • 2049/tcp(NFS) を許可
    • 今回は自分のセキュリティグループIDを指定
      • EFSにアクセスする(マウントした)EC2を指定できればOK
  • Outbound
    • デフォルト設定まま

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ディストリビューション・バージョンは下記となります。

また、以下のプログラムが依存プログラムとしてインストールされることになります。

  • NFSクライアント (nfs-utilsパッケージ)
  • ネットワークリレー (stunnelパッケージ、バージョン4.56以降)
  • Python (バージョン2.7以降)
  • OpenSSL 1.0.2 以降

実際にインストールしてみます。

まず gitrpm-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レベルで、ユーザ名を統一しておく必要があります。