AutoScaling(ALB＋EC2)＋EFS環境を構築してみる

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

以前作成したEC2+EFS環境を少し発展させていきたいと思います。具体的にはAutoScalingを試してみます。
AutoScalingされて自動デプロイされたEC2からも自動でEFSを使用できるかを確認してみます。また、ALBもついでにデプロイしてロードバランシング環境も構築します。
前回の記事は以下となります。

https://qiita.com/ohtsuka-shota/items/cbf6a19995e9fef18b4a

# 環境イメージ
今回は以下の環境のような環境を作っていきます。
AutoScalingグループを使用して、EFSに自動でマウントするEC2を自動でデプロイしていきます。また、併せてALBもデプロイします。
ALB経由でWebブラウジングをすると、EFS上にあるindex.htmlがされることを確認していきます。
さらに、EC2のCPU使用率を意図的に高めることで自動でEC2がスケールアウトされることも確認します。
![20240620から-ページ23.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/50a5a598-6c01-4a23-032a-e627c1ef0f69.png)


# 構築
## 既存のEC2からAMIを作成する
前回作成したEC2を選択し、イメージとテンプレートからイメージを作成を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/55d5ed80-1a6c-d613-8cd9-39584547b0c8.png)
以下のように設定を行いました。名前をqiita-efs-ec2-amiとしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d4269f6d-09de-2126-d0f2-a4ec0bd0d79d.png)
AMIの管理画面で確認が可能となります。ステータスが利用可能となることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5e70447b-ad5a-a43a-e3f7-bb7b54e10231.png)

## テンプレートを作成する
起動テンプレートの管理画面に移動します。起動テンプレートを作成を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e13aa7f2-c0d2-ba6d-f2d3-46e9387102b9.png)
今回は以下の設定で作成します。
名前をqiita-efs-ec2-templateとし、AMIは先ほど作成したものを選択。
インスタンスタイプは検証なので、最も小さいt2.microを選択しました。キーペアはこのテンプレートで作成されたEC2にSSH接続する際に必要なものになります。SGは前回作成したもの（icmpやSSH、HTTP、NFSのInboundを許可しているもの）を選択。
最後のユーザデータに関しては以下を張り付けています。これを張り付けておくことで、EC2がデプロイされたときに自動でこのコマンドセットが実行されます。前回作成した際に使用したコマンドから必要なものだけを抽出しました。
```
#!/bin/bash
yum update -y
yum install -y amazon-efs-utils httpd
mkdir /mnt/efs
mount -t efs -o tls fs-0039132e986f1c7c1:/ /mnt/efs
rmdir /var/www/html
ln -s /mnt/efs /var/www/html
systemctl start httpd
systemctl enable httpd
```
![screencapture-ap-northeast-1-console-aws-amazon-ec2-home-2024-07-04-08_08_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/fb5e4fab-c883-f18a-e4a1-40c87f266088.png)
作成できたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/0d698bc8-21d2-4b7a-425d-5936839da772.png)

## AutoScalingグループを作成する
 AutoScalingの管理画面を開きます。
 グループを作成を押下します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/12295220-311d-e02d-406a-fef9eb4dc4bc.png)
 今から作成するグループの名前を決めます。今回はqiita-efs-ec2-autoscalingとしました。
 また先ほど作成したテンプレートを指定します。
![screencapture-ap-northeast-1-console-aws-amazon-ec2-home-2024-07-04-08_11_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7490c1c0-e469-9895-a812-7d19be09b36e.png)
インスタンスタイプやネットワークの要件を決めていきます。
AutoScaling時に指定のVPC/Subnetにデプロイしてほしいので、編集して指定しておきます。
![screencapture-ap-northeast-1-console-aws-amazon-ec2-home-2024-07-04-08_12_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f63594af-6f4d-cdb6-f3d9-f5569bd9408b.png)
ALB(AWS ELB)をデプロイしてAutoScalingされたEC2にLBしてもらいます。
新しいロードバランサにアタッチするを選択し、Application Load balancerを選択します。
インターネットからのアクセスを想定しているので、Internet-facingを選択。VPCやAZ/Subnetが先ほど設定した通りであることを確認します。また、今回ALBはHTTP通信を受け付けるので、80ポートを指定します。
ALBにLBするターゲットグループはここで作成します。中身は空で問題ありません。不安になるかもしれませんが自動で紐づけされるようです。
![screencapture-ap-northeast-1-console-aws-amazon-ec2-home-2024-07-09-20_25_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/99828b0f-6a6f-f868-7cc9-9525742b73cd.png)
AutoScalingのサイズを決めます。希望するキャパシティを2として、CPU使用率の平均が10%を超えたら上限3台迄スケールアウトするように設定を入れております。
※スクショだとターゲット値が50%となっていますが、自動でスケールアウトすることをサクッと確認したかったので、グループ作成後10%と修正しました。
![screencapture-ap-northeast-1-console-aws-amazon-ec2-home-2024-07-09-23_20_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/8e5995fa-ccbd-b019-e37e-c6326a85f57e.png)
この辺りは今回は省略しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/28c3e06d-f886-2de1-1de6-cdce814f2a12.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/0eb4596d-cc3f-6ac9-a093-ad8905812006.png)
確認して作成ボタンを押下します。
![screencapture-ap-northeast-1-console-aws-amazon-ec2-home-2024-07-09-20_29_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d2c7f1c3-7ea4-bd19-2e45-cba8d4af23f3.png)
AutoScalingグループが作成されたことを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/33dd9ce1-7231-671c-2299-3a9af31a42e5.png)

## デプロイ状態の確認と接続試験
AutoScalingグループが作成されると、裏側で設定に応じて環境が自動デプロイされます。
今回の設定の場合、EC2が2台作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/c4c763fe-c3c6-2a34-5d66-ffc6c110e8c0.png)
ALBに紐づくターゲットグループや、ALB自体もデプロイされます。
ターゲットグループにEC2が紐づいてヘルスステータスがHealthyとなっていることや、ALBのリソースマップを確認して、ターゲットグループやEC2と紐づいていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/10d21fb4-ab38-efaf-52a6-c4296440f664.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3610eb63-edae-9c01-2789-4d0d0db63977.png)
ALBのセキュリティグループの穴あき状態を確認します。IDを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ab3f6599-0897-140d-3ec0-06532b7e6b8e.png)
HTTPのインバウンドが解放されていることを確認します。空いていないようであれば空けましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7bae7878-3d55-a30b-54fb-9c39b1e19eb9.png)
接続試験を行います。ALBの画面に戻りDNS名を控えます。今回はhttp:\//qiita-efs-ec2-autoscaling-ALB-256392127.ap-northeast-1.elb.amazonaws.comでしたので、これをWebブラウザに突っ込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/6b2e8075-333d-20d7-a364-8a625d195f18.png)
以下のように以前作成したHTMLファイルの中身が表示されていることを確認します。自動デプロイ＆EFSへの自動マウントが出来ていることがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/4df08a45-7299-531c-35df-7eb76cc35e36.png)

## スケールアウトされることの確認
各EC2のCPUに対して意図的に負荷をかけていき、それにより自動でスケールアウトされることを確認していきます。
各EC2にSSH接続し以下のコマンドを実行。CPUに負荷をかけます。
```
[root@ip-192-168-2-248 ~]# dnf install -y stress
[root@ip-192-168-2-248 ~]# stress --cpu 1 --timeout 600 &
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d24e0d2f-20b2-644e-5dc5-602c4016783f.png)
暫くすると、EC2の管理画面にてインスタンスが1台自動でデプロイされることが確認出来ました。AZもまだデプロイされていないものが選択されていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/0a901bb9-d080-9466-66b3-ac7c5843c901.png)
ALBのリソースマップを見てみても、スケールアウト前から1台追加でぶら下がっていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7a96cb76-8313-7cac-58e0-e0160a467c7e.png)
ALBのDNS名を使って再度通信確認してみます。問題なく通信できてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/4df08a45-7299-531c-35df-7eb76cc35e36.png)