EC2(Apache) + EFS環境を作ってみる

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はEC2にEFSをマウントしていきます。

# 環境イメージ
今回は以下のようなイメージで作成しました。
EC2はAmazon Linux2023でデプロイしています。EC2とEFSに関してはEFSマウントヘルパーを使用してマウントしました。
EFSでindex.htmlを共有化し、どちらのEC2に対してWebblousingしても同じ内容が表示されることを確認します。
![20240620から-ページ16.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/63898f9a-4f0e-775a-59dc-a20f2f91e50c.png)

# 構築
## SGの作成
EC2とEFSにアタッチするSGを事前に作成していきます。
※セキュリティ的には分けるべきだと思います。
EC2管理画面よりセキュリティグループを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/520558e3-f75b-7e07-c20b-b71b1cbce44e.png)
今回は以下のような設定にしました。SSH、HTTP、NFS、ICMPを開放しています。
SGの名前をqiita-efs-ec2としています。
![screencapture-ap-northeast-1-console-aws-amazon-ec2-home-2024-07-03-05_26_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/c85b70a6-97f8-76e3-fe19-bf7ab937fdce.png)
作成出来たことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/195d2951-3dd6-fdd9-adc6-08a704b3be1f.png)

## EFSのデプロイ
AWSマネジメントコンソールでEFSと検索をかけると出てきますので、これを押下して管理画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1904191c-1c04-78ce-0a84-de067191a493.png)
こんな感じの画面が表示されます。ファイルシステムの作成を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e22f3c46-4a6b-da37-f832-a3f3c124b58e.png)
カスタマイズを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/85c43c0b-b522-5372-c04b-f58586d95bb6.png)
EFSの名前をqiita-efsとしました。
ファイルシステムのタイプですが、1ゾーンの方が安いのですが利便静的なのを見てみたいなと思いリージョンを選択しています。
![screencapture-ap-northeast-1-console-aws-amazon-efs-home-2024-07-03-05_32_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/61578363-4b14-37cb-402f-095f575e8592.png)
EFSをどのVPC、Subnetにデプロイするかを決定します。
今回はデフォルトではなく、自作したVPCとサブネットを選択し、SGは先ほど作成したものを選択しました。
![screencapture-ap-northeast-1-console-aws-amazon-efs-home-2024-07-03-05_34_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/55657540-06f4-a07b-0759-4fe59e4689c8.png)
これはデフォルトのまま先に進みます。設定をした方がセキュリティ的には良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2d05356b-682b-e803-cb2c-0d94708beacb.png)
最終確認画面が表示されますので、確認してデプロイしていきます。
![screencapture-ap-northeast-1-console-aws-amazon-efs-home-2024-07-03-05_37_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/70b162ea-4630-0e7c-09e3-2e623b1fff69.png)

作成されたことが確認できます。作成したEFSにアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/c4b1038a-640e-1b88-01c8-baf8132b9727.png)
EFS内にどれくらいファイルがあるかを確認することが出来るようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/56f4f1b6-1068-044b-8220-83e5c5c018a2.png)

## EC2のデプロイとEFSと紐づけ
EC2をデプロイしていきます。今回はAmazon Linux2を選択し、VPCはEFSをデプロイしているのと同じものを選択します。SGも最初に作成したものを選択します。
![screencapture-ap-northeast-1-console-aws-amazon-ec2-home-2024-07-03-05_43_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/c91614bc-b489-21d2-de6f-a9a8271f51ef.png)
デプロイされたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2207e007-0582-d3e1-002b-b1760b06ac7e.png)
TeratermでEC2に接続し以下のコマンドを実行します。
```
[ec2-user@ip-192-168-1-175 ~]$ sudo su -
[root@ip-192-168-1-175 ~]# dnf update && dnf upgrade -y
[root@ip-192-168-1-175 ~]# dnf install -y amazon-efs-utils
[root@ip-192-168-1-175 ~]# mkdir /mnt/efs
```
改めてEFSの管理画面に遷移してアタッチを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/b3e24f80-d3ea-9bcb-4207-4de0064abb29.png)
NFSマウントヘルパーのコマンドをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/42d7eaf9-e859-2114-6f45-35d5097085e6.png)
EFSにマウントします。
dfコマンドを実行してマウントされていることを確認します。
```
[root@ip-192-168-1-175 ~]# mount -t efs -o tls fs-0039132e986f1c7c1:/ /mnt/efs
[root@ip-192-168-1-175 ~]# df -m
Filesystem         1M-blocks  Used     Available Use% Mounted on
devtmpfs                   4     0             4   0% /dev
tmpfs                    475     0           475   0% /dev/shm
tmpfs                    190     1           190   1% /run
/dev/xvda1              8116  1554          6563  20% /
tmpfs                    475     0           475   0% /tmp
/dev/xvda128              10     2             9  13% /boot/efi
tmpfs                     95     0            95   0% /run/user/1000
127.0.0.1:/    8796093022207     0 8796093022207   0% /mnt/efs
```
apacheをインストールしていきます。
```
[root@ip-192-168-1-175 ~]# dnf install -y httpd
[root@ip-192-168-1-175 ~]# systemctl start httpd
[root@ip-192-168-1-175 ~]# systemctl enable httpd
```
apacheで使用するディレクトリ（/var/www/html）にシンボリックリンクを作成したり、シンボリック内にindex.htmlを作成しました。
```
[root@ip-192-168-1-175 ~]# cd /var/www
[root@ip-192-168-1-175 www]# ls
cgi-bin  html
[root@ip-192-168-1-175 www]# rmdir html/
[root@ip-192-168-1-175 www]# ls
cgi-bin
[root@ip-192-168-1-175 www]# ln -s /mnt/efs /var/www/html
[root@ip-192-168-1-175 www]# ls
cgi-bin  html
[root@ip-192-168-1-175 www]# cd html/
[root@ip-192-168-1-175 html]# vi index.html
[root@ip-192-168-1-175 html]# cat index.html
Hello! EC2 + EFS World!!
[root@ip-192-168-1-175 ~]# systemctl restart httpd
```
今回のシンボリックのイメージは以下となりますでしょうか？
![20240620から-ページ17.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ffeafbff-e988-eb87-3865-2ac060e779b2.png)


Webブラウザでアクセステストをしてみます。
index.htmlに記載の通り表示がされていることがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/4da57cca-3f22-54c4-486f-87a0426a97b1.png)

# マウントされているかの確認
もうひとつEC2インスタンスを立ち上げます。
![screencapture-ap-northeast-1-console-aws-amazon-ec2-home-2024-07-03-07_02_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ffe340af-f712-b136-3d1e-4e58425b905d.png)
デプロイされたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/6312de7b-2d97-936d-e220-6f1604be3473.png)
Teratermで接続して以下のコマンドを実行します。
初期設定をしたり、EFSに対してマウントなどをしております。
```
[ec2-user@ip-192-168-2-196 ~]$ sudo su -
[root@ip-192-168-2-196 ~]# dnf update && dnf upgrade -y
[root@ip-192-168-2-196 ~]# dnf install -y amazon-efs-utils httpd
[root@ip-192-168-2-196 ~]# mkdir /mnt/efs
[root@ip-192-168-2-196 ~]# mount -t efs -o tls fs-0039132e986f1c7c1:/ /mnt/efs
[root@ip-192-168-2-196 ~]# systemctl start httpd
[root@ip-192-168-2-196 ~]# systemctl enable httpd
[root@ip-192-168-2-196 ~]# cd /var/www/
[root@ip-192-168-2-196 www]# ls
cgi-bin  html
[root@ip-192-168-2-196 www]# rmdir html/
[root@ip-192-168-2-196 www]# ln -s /mnt/efs /var/www/html
[root@ip-192-168-2-196 www]# ls
cgi-bin  html
[root@ip-192-168-2-196 www]# cd html/
[root@ip-192-168-2-196 html]# ls
index.html
[root@ip-192-168-2-196 html]# cat index.html
Hello! EC2 + EFS World!!
```
このEC2に対してWebブラウジングしてみます。先程と同じ内容が表示されていることがわかります。
良い感じにEFS環境を使えるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/b1bfb157-cef5-caf4-c50a-0ad4afd56b51.png)