こんにちは!CSM課岩渕です。
EFSを使ったシステムを初めて構築しました。構築の過程で困ったところ含め、作成からマウントまでを、初めてEFSを使うよ!という方を対象に、残しておきたいと思います。どなたかの一助になれば嬉しいです!
システム構成
まず、システム構成をざっくり。
・開発用のEC2からは開発用のEFSへ
・本番用のEC2(AZ-a、AZ-c)からは本番用のEFSへ
という構成です。
(実際には他にもCloudFront、WAF、RDS等々ありましたが、
今回はEFSに特化したブログとするため、それらは構成図から端折りました。)
EC2にはRed Hat Enterprise Linux 8(以下、RHEL8)を導入しており、
今回はこのRHEL8にEFSマウントヘルパーをインストールしてマウントしたいと思います。
EFS用のセキュリティグループ作成
では、最初にEFSのセキュリティグループを開発用、本番用とそれぞれ作っておきましょう。
・開発用EFSへは開発用EC2からのみ接続可能
・本番用EFSへは本番用EC2からのみ接続可能
という具合にしておきます。
開発EFS用セキュリティグループ(インバウンド) | |||
タイプ | プロトコル | ポート範囲 | ソース |
NFS | TCP | 2049 | 開発用EC2のセキュリティグループIDを指定 |
本番EFS用セキュリティグループ(インバウンド) | |||
タイプ | プロトコル | ポート範囲 | ソース |
NFS | TCP | 2049 | 本番用EC2のセキュリティグループIDを指定 |
EFSの作成
次にEFSの作成です。
EFSの作成は、以下の4ステップで作成できちゃいます。びっくりですね。
ステップ1:ネットワークアクセスを設定する
ステップ2:ファイルシステムの設定を行う
ステップ3:クライアントアクセスを設定
ステップ4:確認と作成
それでは、やってみましょう。
最初に開発用EFSから。
開発用EFSのアクセス元であるEC2はAZ-aにしかないので、EFSのマウントターゲットもAZ-aにのみ設定します。
開発用EFS:ステップ1 | |
VPC | 開発/本番用EC2の設置されたVPCを選択 |
マウントターゲット:AZ-a | AZ-a内の開発用EC2が設置されたサブネット 上記作成の開発EFS用セキュリティグループを選択 |
ここでのポイントとしては、マウントターゲットをAZ-aの「開発用EC2が設置されたサブネット」にしていることです。
これは、「AWS Black Belt Online SeminarのQA」を参考にしました。
Q. 作成時のsubnet指定は、EFSをマウントするEC2インスタンスが所属しているsubnetを選択すればよいですか?
A. はい。 EC2 インスタンスが属するサブネットに EFS マウントターゲットを作成することができます。この場合、ネットワーク的にもアクセス効率の良い構成になります。 https://aws.amazon.com/jp/blogs/news/webinar-bb-efs-2018/
ステップ2ではNameタグだけ設定し、その他はデフォルト、
ステップ3もデフォルト設定のままとし、
ステップ4で「ファイルシステムの作成」を押下して作成完了させます。
※「ステップ2、3の設定についての解説が欲しかったのに~」という方、すいません!
今回はデフォルト設定のままで先に進みます~
以下が作成結果です。
続いて本番用EFSを作成します。
本番用EFSへのアクセス元EC2はAZ-a, cの両方に存在するため、マウントターゲットもそれぞれに設定します。
また、サブネットは本番用EC2が設置されたサブネットを選択します。
本番用EFS:ステップ1 | |
VPC | 開発/本番用EC2の設置されたVPCを選択 |
マウントターゲット:AZ-a | AZ-a内の本番用EC2が設置されたサブネット 上記作成の本番EFS用セキュリティグループを選択 |
マウントターゲット:AZ-c | AZ-c内の本番用EC2が設置されたサブネット 上記作成の本番EFS用セキュリティグループを選択 |
ステップ2以降は、開発用EFSと同様にして、最後に「ファイルシステムの作成」を実行しましょう。
ここまでで、開発、本番用EFSの作成が完了しました!
上記画面の中央付近にある「Amazon EC2のマウント手順(ローカルVPCから)」というリンクをクリックして
マウント手順を確認しておきましょう。
マウントツールのインストール方法の解説が記されていますね。親切ですね~
でも、今回は、EC2がRHEL8で、EFSマウントヘルパーを使用するので、ここに記載されている手順とは違う手順でインストールします。詳細は以下で記しますね。
その前に下にスクロールして「ファイルシステムのマウント」方法も見ておきましょう。
ふむふむ、おや?
No.3のところの「現在、Amazon VPCはDNS名を使用したマウントを有効にするように設定されていません。~~[DNS解決の編集]および[DNSホスト名の編集]を選択し、両方が[はい]に設定されていることを確認します。」
ってどういうこと? 調べてみました。
DNS 解決と DNS ホスト名の両方が有効な場合、
・パブリック IP アドレスを持つインスタンスは、対応するパブリック DNS ホスト名を受け取ります。
・Amazon が提供する DNS サーバーは、Amazon が提供するプライベート DNS ホスト名を解決できます。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-dns.html#vpc-dns-support
ということなので、VPCの「DNS解決」、「DNSホスト名」が両方とも「有効」になっていないとAmazonが提供するDNSサーバがEFSのDNS名をプライベートアドレスに解決できないということみたいです。
VPCを確認してみましょう。
「DNSホスト名」が無効になっていますね。
じゃ、これを有効化すればいいのか!って、ちょっと待て、このVPCには既に多くのリソースが動いているんだけど有効化することの影響って何かあるのかしら? 諸先輩方に聞いたところ、問題なしという結論だったのですが、気になって眠れないのでAWSサポートに聞いてみました。
DNS ホスト名を有効にした際に注意すべき点としては、同名のパブリックホストゾーンとプライベートホストゾーンが存在した場合に、プライベートホストゾーンから優先して名前解決が行われる点でございます。
1. リゾルバー は、プライベートホストゾーンの名前がリクエスト内のドメイン名と一致するかどうかを評価します (accounting.example.com など)。次のいずれかに該当すると、一致したとみなされます。
... 一致するプライベートホストゾーンがない場合、リゾルバー はリクエストをパブリック DNS リゾルバーに転送します。リクエストは通常の DNS クエリとして解決されます。
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zone-private-considerations.html#hosted-zone-private-considerations-public-private-overlapping
ふ~ん、そうなのか~、プライベートホストゾーンって使ったこと無いし、、、今回の環境でも、使われていないので大丈夫ってことだな!
ということで「DNS ホスト名」を有効化しました。
「DNSホスト名」を有効化するには、対象VPCを選択して「アクション」-「DNSホスト名の編集」で可能です。
No.3のマウント用コマンドが表示されるようになりましたね。
開発用、本番用それぞれのマウント手順リンク画面から、確認しておきましょう。それぞれ用のファイルシステムIDがコマンド中に記載されてます。やさしい~
EFSマウントヘルパーの導入
上記でEFSの作成、及びファイルシステムIDを使ったマウントの下準備が整ったので、EC2にEFSマウントヘルパーを入れて、マウントできるようにしていきましょう!
あと少し!
以下コマンドでソースコードをGitHubから取得して、RPMパッケージをビルド&インストールします。
開発用EC2、本番用EC2(AZ-a, AZ-c)でそれぞれ実施していきます。
$ sudo yum install -y git $ sudo yum install -y rpm-build $ git clone https://github.com/aws/efs-utils $ sudo yum -y install make $ cd ./efs-utils $ sudo make rpm $ sudo yum -y install ./build/amazon-efs-utils*rpm
マウント確認
それでは、いよいよマウントです。
本番用EC2(AZ-a)でマウントしてみましょう
マウントコマンドは、上記で確認した「Amazon EC2のマウント手順(ローカルVPCから)」からコピペしてきましょう。
$ mkdir efs ←マウントポイント用ディレクトリを作成 $ $ sudo mount -t efs fs-exxxxxd:/ efs ←マウント $ $ df -h ←マウント後確認 Filesystem Size Used Avail Use% Mounted on devtmpfs 3.7G 0 3.7G 0% /dev tmpfs 3.7G 0 3.7G 0% /dev/shm tmpfs 3.7G 17M 3.7G 1% /run tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup /dev/nvme0n1p2 200G 3.6G 197G 2% / tmpfs 747M 0 747M 0% /run/user/1000 fs-exxxxxd.efs.ap-northeast-1.amazonaws.com:/ 8.0E 0 8.0E 0% /home/ec2-user/efs $ ↑マウントできましたね! $ $ cd /home/ec2-user/efs $ sudo touch test_from_prd_a $ ll total 4 -rw-r--r--. 1 root root 0 Mar 23 12:24 test_from_prd_a $ ↑マウントしたディレクトリ内にファイル配置できました!
引き続き本番EC2(AZ-c)でマウントして、ファイル作成を試行、また、上記の本番EC2(AZ-a)で作成済みのファイルが見れることを確認してみましょう。
$ mkdir efs $ sudo mount -t efs fs-exxxxxd:/ efs $ cd ./efs $ sudo touch test_from_prd_c $ ll total 8 -rw-r--r--. 1 root root 0 Mar 23 12:24 test_from_prd_a ←本番EC2(AZ-a)で作成済みファイル -rw-r--r--. 1 root root 0 Mar 23 12:25 test_from_prd_c ←本番EC2(AZ-c)で今作成したファイル $
本番用EC2のAZ-aで作成済みのファイルが見えて、AZ-c側でもファイル配置できましたね。
開発用EC2でも同様に開発用EFSのファイルシステムIDでマウントしてみて下さい。
まとめ
長くなってしまいましたが、EFSの作成から、RHEL8へのEFSマウントヘルパー導入+マウントと終わってみれば、簡単でしたね。(いつも終わってみれば簡単なんですが、、、終わるまでが長い、、、)
このブログがEFSをこれから始める、どなたかの一助になったら、こんな嬉しいことはありません。
では、また!