背景
久しぶりにNFSを触るかもしれないということで、ちょっと素振りをしてみました。NFSを最後に触ったのは10年くらい前、まだあの頃は学生だったと思います。そんなわけで、久々なのであらためて、手順を頭に入れなおしてみました。
今回試す条件は緩いものなので、プロダクトのなかで使う場合やより高い要求がある場合には、ここの手順だけでは圧倒的に足りませんが、大まかな流れをつかめればいいかなと思います。
NFSとは
ここでは簡単にNFSについて説明します。
- ネットワークをまたいでストレージをマウントさせるための技術
- 最新のプロトコルのバージョンは4
- 実質的な最初のバージョン、2が発表されたのは1984年のこと。私などよりも年上の歴史ある技術
- 構築や設定は少し面倒な部類
- 運用も大変なイメージ
歴史のある技術とは書きましたが、複数のマシンから共有ストレージとして利用する場合には今でも有力な選択肢の一つです。また、物理的なサーバやAWSのEC2などで、自分でストレージを増設できる、あるいはEBSなどのストレージをアタッチできるということであればあまりありがたみはないのですが、ストレージの増設のできないVPSや、共有サーバなどで自分の判断で気軽な増設が出来ない場合にも、選択肢となり得ます。
NFSを動かしてみよう
Linux環境で簡単に試してみましょう。 今回は、Windows上にVagrant/VirtualBoxでCentOS7の環境を二つ用意し、ファイルの共有をしてみます。
それぞれIPアドレスは、サーバ側を192.168.33.150、クライアント側を192.168.33.151で作っています。
NFSの環境構築(サーバー側)
必要なパッケージをインストールしていきます。
$ sudo yum install nfs-utils
本来はここで、各種の設定が必要となりますが、今回はおもむろにサービスを起動していきます。
$ sudo systemctl start nfs
本来はここまででパケットフィルタなどの対応が必要ですが、今回は割愛します。
NFSで共有するディレクトリについて
ストレージを共有すると言うことは、サーバに付属するストレージの一部を他のマシンと共有すると言うことです。まずは、その共有する部分を決定する必要があります。
NFSではこの部分を exports
というコマンドを使って管理を行います。
exportsの設定と反映
exportsの設定は /etc/exports
ファイルに記載することになります。
今回は簡単化のために、接続元ホストの設定にクライアント1台のみを指定していますが、ここはネットワークセグメントをまるごと指定する(192.168.33.0/24
や192.168.33.0/255.255.255.0
)なども可能です。
今回は、/export/share_dir
を共有してみます。あらかじめ、ディレクトリは作っておきましょう。
$ sudo mkdir -p /export/share_dir $ sudoedit /etc/export
/export/share_dir 192.168.33.151(rw,async,no_root_squash)
exportfs
コマンドを使って、このファイルの設定を反映させます。
$ sudo exportfs -ra
設定が反映されたか確認してみましょう。
$ sudo exportfs -v /export/share_dir 192.168.33.151(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
どうやらされているようです。
NFSの環境構築(クライアント側)
サーバに接続してくる側もパッケージを入れましょう。
$ sudo yum install nfs-utils
次に、マウントしてしてみましょう。今回は、 /mnt/
にマウントしてみます。
$ sudo mount -t nfs4 192.168.33.150:/ /mnt/ $ cd /mnt/export/share_dir/ $ pwd /mnt/export/share_dir
というわけで、到達できました。
クライアント側でファイルを作ってみましょう。
$ sudo touch /mnt/export/share_dir/hoge $ ls -l /mnt/export/share_dir/hoge -rw-r--r--. 1 root root 0 Apr 7 09:47 /mnt/export/share_dir/hoge
サーバ側で確認してみましょう。
$ ls -l /export/share_dir/ total 0 -rw-r--r-- 1 root root 0 Apr 7 09:47 hoge
同期されました。
今回は、サーバ側でno_root_squash
という設定を入れています。このため、クライアント側のroot権限でサーバ側に書き込むことができてしまいます。ここは潜在的にセキュリティ上の懸念となるため、設計時の注意が必要です。
大きくNFS導入の流れはこういった形になります。
EFSをNFSとして扱う
さて急に話は変わりますが、AWSのサービスの一つであるEFSというものがありまして、これはNFSのフルマネージドなサービスです。
この場合でいえば、サーバ側の設定についてはAWSがいい感じに設定してくれますし、クライアント側にしても、専用のクライアントを導入すればAWSのリソース名(ARN)でマウントすることができます。
AWSにロックインする形で利用するのももちろん便利なのですが、NFSのフルマネージドサービスですので、当然NFSの形式でマウントして利用することができます。
EFSには直接グローバルIPを付与することはできませんが、適切なセキュリティグループ設定をしてEC2経由でSSHポートフォワーディングを利用すれば、ローカルのマシンからも接続が可能になります。
大きなファイルなどを直接流し込みたいときには使ってみてもいいかもしれません。
最後に
さまざま運用上、セキュリティ上で考慮すべきの多いNFSですが、EFSという形でフルマネージドなサービスが登場するほどに需要のあるものです。
使い方と使いどころを考慮して、長く付き合っていけたらいい技術ですね。
NFSに限らず、セキュアなインフラの構築や運用を進めたいMNTSQでは現在もエンジニアの募集をしています。ご興味があれば、Wantedlyにさまざま記事などを掲載していますので、ぜひアクセスしてみてください!!
この記事を書いた人

中原大介
MNTSQ社でSREをやってます。最近は乗り鉄してることが多いですが、コロナ禍で実家に帰れず、実家においてきた愛車に乗れないことへの腹いせです。