EC2 AutoScaling環境を構築しスケールアウト・スケールインの動作を確認する
AutoScalingグループを作成して自動でスケールアウト・スケールインする環境を構築し、動作を確認する。
目次
1.概要
「ドメイン取得およびSSL/TSLサーバ証明書取得しWebサイト(EC2:Tomcat+RDS)を構築する」にて構築した環境に手を加え、サーバの負荷状況によってスケールアウト・スケールインを自動で行う環境を構築する。負荷掛けはApacheBenchを使用する。
2.構成図
構成図は以下の通り。

3.構築手順
3-1.ALBを修正する
現状のALBのtargetsは前回作成した2つのEC2インスタンスを参照するようになっている。
今回作成したAutoScalingが作成したインスタンスのみとしたいため、2つのインスタンスをtargetsから削除をする。
ALBのターゲットグループのtargetsからインスタンスを削除する。

3-2.EC2を修正する
現状、ALBにてポート番号:443で受けて8080へ転送するよう設定しているが、AutoScalingで作成されたEC2インスタンスへは標準では80へ転送となる。そのため、EC2では80で受け取り、8080へ転送するようapache設定を行う。

apacheをインストールする。
sudo yum -y install httpd
sudo systemctl enable httpd.service
service httpd restart
下記定義をapacheの設定ファイルに追加する。
LoadModule proxy_module modules/mod_proxy.so
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</IfModule>
3-3.AMIを作成する
スケールアウトされた際に自動で作成されるEC2インスタンスは、起動テンプレートを元に作成される。
その起動テンプレートが使うAMI(EC2のイメージ)を作成する。
前回作成したEC2インスタンスからAMIを作成する。

AMIが作成された。

3-4.起動テンプレートを作成する
作成したAMIを使った起動テンプレートを作成する。

起動テンプレートが作成された。

3-5.AutoScalingグループを作成する
AutoScalingグループを以下の要領で作成する。(平均CPU使用率が40%を超えたら最大3つまでEC2インスタンスを追加)
希望する容量 | 1 |
最小キャパシティ | 1 |
最大キャパシティ | 3 |
スケーリングポリシー:メトリクスタイプ | 平均CPU使用率 |
スケーリングポリシー:ターゲット値 | 40 |
AutoScalingグループに対してALBを紐づけする。

グループサイズとスケーリングポリシーを設定する。

AutoScalingグループの作成が完了した。

AutoScalingグループを作成すると、CloudWatchにアラームが追加された。
上限しきい値(スケールアウトする条件) | 3 分内の3データポイントのCPUUtilization > 40 |
下限しきい値(スケールインする条件) | 15 分内の15データポイントのCPUUtilization < 28 |

EC2インスタンス一覧を確認するとインスタンスが自動で1つ作成されている。

自動生成されたインスタンスにALB経由で接続してアプリが正しく動くことを確認する。

4.実演
以下の手順でAutoScalingの動作を確認する。
4-1.ApacheBenchによる負荷掛けを行う
以下コマンドを発行し、構築したサーバに対して負荷をかける。
ab -c 50 -n 200000 https://www.z-frontier.com/HelloApp/sample
<コマンドのパラメータ>
パラメータ | 説明 |
-c | 並列数を指定 |
-n | 総リクエスト数を指定 |
URL | 負荷を掛けるサイトのURL |
-c 50 -n 200000 と指定した場合、50並走で200000リクエスト発行するまで実行する。
4-2.スケールアウトの確認をする
1台当たりのCPU利用率が上限しきい値の40%を超えた。(下記グラフはインスタンス#1のCPU利用率)

上限しきい値のアラームがアラーム状態になっている。

2つ目のインスタンスが自動的に作成された。(スケールアウトした)

2並走となったため、1台当たりのCPU使用率は落ちたが、それでも上限40%は超えた状態が続いている。

さらにインスタンスが追加され、3並走となった。

3並走となったことで、1台当たりの負荷はさらに減った。

4-3.スケールインの確認をする
ApacheBenchの負荷掛けを停止し、状況を見る。
(以下はApacheBenchを停止した際に出力されたログ)
$ ab -c 50 -n 200000 https://www.z-frontier.com/HelloApp/sample
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking www.z-frontier.com (be patient)
Completed 20000 requests
Completed 40000 requests
Completed 60000 requests
Completed 80000 requests
Completed 100000 requests
^C
Server Software:
Server Hostname: www.z-frontier.com
Server Port: 443
SSL/TLS Protocol: TLSv1/SSLv3,ECDHE-RSA-AES128-GCM-SHA256,2048,128
Document Path: /HelloApp/sample
Document Length: 245 bytes
Concurrency Level: 50
Time taken for tests: 856.848 seconds
Complete requests: 115771
Failed requests: 0
Write errors: 0
Total transferred: 62979424 bytes
HTML transferred: 28363895 bytes
Requests per second: 135.11 [#/sec] (mean)
Time per request: 370.062 [ms] (mean)
Time per request: 7.401 [ms] (mean, across all concurrent requests)
Transfer rate: 71.78 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 50 163 60.7 158 2317
Processing: 26 207 151.4 163 3278
Waiting: 26 200 152.4 153 3278
Total: 78 370 171.7 321 3393
Percentage of the requests served within a certain time (ms)
50% 321
66% 363
75% 443
80% 500
90% 579
95% 650
98% 719
99% 771
100% 3393 (longest request)
停止して少し経った状態。CPU使用率は0%程度になっている。

下限のCPU利用率28%よりも小さくなったため、アラート状態となった。

3つのインスタンスのうち、一つが「終了済み」となった。(スケールインした)

さらに待つとまたインスタンスが「終了済み」となった。

以上。