AWSのオートスケーリングをWEBサーバーで試してみた。

## オートスケーリングの大まかな流れ
EC2の起動時にWEBサーバーが実行されるsystemdのserviceを作成して、AMIにする。
↓
AWSのオートスケーリングのテンプレート作成
↓
Auto Scalingグループの作成

## AMIの作成
### ec2 を立ち上げる
t3.nanoを利用する場合はUnlimitedモード（クレジット仕様を無制限のチェックをON）になるように注意。
そうしないとホストのcpu利用率があがらないので、cpuが高負荷になった時にオートスケールできない。


### ec2 に nginx と php-fpmのコンテナを作成
```
# docker と docker-compose を利用できるようにする。
sudo yum update -y && \
sudo amazon-linux-extras install  -y docker && \
sudo usermod -a -G docker ec2-user && \
sudo systemctl start docker.service && \
sudo systemctl status docker.service && \
sudo systemctl enable docker.service && \
sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# docker grop への追加を反映する
sudo su ec2-user
```

https://github.com/unamu1229/auto-scaling.git
こちらのファイルを /home/ec2-user/auto-scaling に展開してコンテナ起動。

```
curl -OL https://github.com/unamu1229/auto-scaling/archive/refs/heads/master.zip
unzip master.zip
cd auto-scaling-master
docker-compose up --build
```

### SyetemdのService作成
#### /opt/docker-compose-up.sh

```
#!/bin/bash
docker-compose -f /home/ec2-user/auto-scaling-master/docker-compose.yml up -d
```
```
sudo chmod +x docker-compose-up.sh
```

#### /etc/systemd/system/docker-compose-up.service

```
[Unit]
Description = docker-compose up

[Service]
ExecStart = /opt/docker-compose-up.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
```
```
sudo systemctl enable docker-compose-up
```
ec2を再起動してブラウザからアクセスしてレスポンスが帰ってくるか確認。

イメージ名 docker-compose-up でAMIを作成

## 起動テンプレートの作成
https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/GettingStartedTutorial.html#gs-create-lt
の手順を参照。
テンプレート名template-docker-compose-upで作成する。
使用するAMIの項目で先程のdocker-compose-upのAMIを選択する。
「起動設定を作成するには」の項目の対応は必要ありません。

## Auto Scalingグループの作成
ステップ1の起動テンプレートで、先程のtemplate-docker-compose-upを選択する。
### ステップ3 詳細オプションを設定の内容
Internet-facingを選ばないとロードバランサーにvpc外からアクセスできないので注意。
![screencapture-ap-northeast-1-console-aws-amazon-ec2autoscaling-home-2021-06-25-08_03_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/a2ae5535-0db7-7713-4810-d6c413ca26e3.png)

## ステップ4 グループサイズとスケーリングポリシーを設定するの内容
![screencapture-ap-northeast-1-console-aws-amazon-ec2autoscaling-home-2021-06-20-08_28_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/913ae950-ef2f-1ea8-7008-19d3595568fd.png)

メトリックスに含める前にウォームアップする秒数をすくなくすると、負荷の増えた時にスケールアウトするまでの待ち時間が短くなります。負荷が減ってスケールインするまでの待ち時間には関係しませんでした。


## ロードバランサーのエンドポイント
先程の設定でAuto Scalingグループを作成するとロードバランサーが作成されるのでリクエストを送るエンドポイントを確認する。
![screencapture-ap-northeast-1-console-aws-amazon-ec2-v2-home-2021-06-25-08_43_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/d1f7dafe-de2f-bdcc-ada6-958d8504d4f5.png)



## 負荷試験
Locustsを利用する。
https://docs.locust.io/en/stable/installation.html
の手順通りインストールして、
https://docs.locust.io/en/stable/quickstart.html
で起動。

### 設定内容
hostに先程のロードバランサーのエンドポイントを設定する、http://も必要。
![スクリーンショット 2021-06-25 8.53.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72832/3b6da240-4551-f1b5-290f-82a478b79164.png)

## 動作確認
負荷試験を実行して数分待つと、ec2インスタンスの起動数がグループサイズ設定の最大キャパシティ数まで増え、Auto Scaling グループのアクティビティでもLaunching a new EC2 instanceの履歴が作成されていました。
また、負荷試験を終了して数分待つと、起動数が希望する容量数まで減ることを確認できました。


## 参考url
### ec2へdocker-composeの設定
https://aws-cloud-tech.com/topic/%e3%80%90docker%e8%ac%9b%e5%ba%a75%e3%80%91ec2%e7%92%b0%e5%a2%83%e3%81%ae%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97-%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97%e3%82%b3
### systemd
https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff