EC2で静的ページを公開してELB / AutoScaling / CloudWatchで動作検証してみる

##環境
macOS Big Sur バージョン 11.2.3
EC2 / ALB / CloudWatch / Apache

##目的
EC2で静的ページを公開、CloudWatchでCPUを監視、CPUの値によってEC2を増減させます。
※ハンズオン形式ではりませんので、記事としてご参考ください。

以下のテスト環境で検証を進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/6e9f0b1d-b4fc-7ccf-9ff6-76f88223c8e4.png)

##作成済みのEC2(ST-WebServer1)にindex.htmlを作成

```terminal:EC2
# SSH接続後にec2-user からRoot へユーザ切替
sudo su -

# パッケージをアップデート
yum -y update

# Apacheのインストール
yum -y install httpd

# Apacheの起動
systemctl start httpd

# EC2の再起動後にもApacheが自動起動するように設定
systemctl enable httpd

# Apacheが起動したか確認
systemctl status httpd
#serviceがactiveになっていればOKです.
```

下記の手順でEC2でHTMLファイルを作成して公開します。

```terminal:EC2
# HTMLファイルを格納するディレクトリへ移動
cd /var/www/html

#HTMLファイル作成
touch index.html

# HTMLファイルの中身を記述
vi index.html

# iを押下して、insert mode に移行し、以下内容を記述し、 :wq で保存します。
<html lang="ja">
 <head>
  <meta charset="utf-8">
  <title>test-page</title>
 </head>
   <body>
    <h1>Hello  world!</h1>
    <p>ST-WebServer1</p>
   </body>
</html>
```

ブラウザからEC2のパブリックIPアドレスにアクセスしてHello world!が表示されればokです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/f44cd057-5709-e019-ce83-0c5826348442.png)

###このままだと障害の発生でサービス停止してしまうので、EC2を冗長化します。

####1.EC2のAMIを取得
すでに作成済みのST-WebServer1を停止.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/80b6c674-2c8c-f13e-5133-7feb432b2592.png)

EC2が停止済みとなっていることを確認して、
[アクション]の[イメージとテンプレート]から[イメージを作成]を選択。
イメージ名を入力、その他の値はデフォルトで進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/a6a266fe-b9fb-48e0-fa88-425a069de1ef.png)
左ペインAMIからイメージのステータスを確認。
作成中(pending)なのでしばらく待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/b06f3e4c-ce49-17e0-9237-0b5a5fabffc9.png)
作成したイメージからインスタンスを起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/0da2103f-e873-aa29-577c-8c9144010b0f.png)
左ペインのマイAMIから作成したAMIを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/63dacc6b-dbf9-d2e7-34fb-1fd1c1bdcb20.png)
ネットワークはST-VPC1、サブネットはパブリックサブネット2を選択。
自動割り当てパブリックIPは有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/093b5d9a-5769-4083-11bc-de1dd48db63a.png)
タグはNameをST-WebServer2とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/8780aaaf-57a6-714d-3c17-f6a55c772833.png)
セキュリティグループはST-WebServer1で使用しているST-Web-SG1を選択。
最後にサマリを確認して起動を押下します。
キーペアの確認画面が出ますが、ここではST-WebServer1ですでに作成しているキーペアを使います。
上記まででST-WebServer1と2が構築できました。
ST-WebServer1が停止状態なのでインスタンスを開始しておきます。

続いて、ST-WebServer2のindex.htmlを書き換えます

```terminal:EC2
#ST-WebServer2へ接続
ssh -i Downloads/MyKeyPare1.pem ec2-user@パブリックIPアドレス

#SSH接続後にec2-user からRoot へユーザ切替
sudo su -

# HTMLファイルを格納する場所ディレクトリへ移動
cd /var/www/html

#HTMLファイルの作成
touch index.html

# HTMLファイルの中身を記述
vi index.html

# i を押し、insert mode に移行、以下内容を記述し、 :wq で保存します。
<html lang="ja">
 <head>
  <meta charset="utf-8">
  <title>test-page</title>
 </head>
   <body>
    <h1>Hello  world!</h1>
    <p>ST-WebServer2</p>
   </body>
</html>
```

保存後、ブラウザからST-WebServer2のパブリックIPへ接続、
「Hello world!ST-WebServer2」が表示されればokです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/7c14b6d4-7406-7cc3-140e-50eca31eb07a.png)
これで2台のWebサーバーが構築できました。


##ELBを作成
左ペインからロードバランサーを選択します.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/0cb3947c-7cd0-d060-1845-089a08d6d0e8.png)
ロードバランサーを作成。
Application Load Balancerを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/ac3665e4-ac49-0e03-1595-0c68ae5c455e.png)
ロードバランサーの設定を進めます。
名前はST-LB1として、
VPCとアベイラビリティゾーンを選択(1aと1cからパブリックサブネット1と2)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/567ecced-2e08-d262-699a-5ebb04d7f976.png)
セキュリティグループは名前をST-LB-SG1として新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/3bb56bb2-6db6-c974-399a-520342a9e7b2.png)
####ルーティングを設定します。
新しいターゲットグループをST-TG-1として作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/f2ed5e70-7b34-6843-979c-196a97992ede.png)
続いてヘルスチェックの詳細設定。
テスト環境なので今回は正常の閾値を2、間隔は10秒としておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/0744d0d3-0574-321b-23f0-654ed3d53141.png)
ターゲットの登録ではST-WebServer1とST-WebServer2を選択し登録済みに追加。
最後にサマリ画面を確認して問題なければ作成します。
作成後、左ペインのターゲットグループからタブのTargetsを選択するとヘルスチェックの状態を確認できます。作成直後はinitialになっています。

###Webページにアクセスしてロードバランサーの振り分けを確認
再度左ペインのロードバランサーから作成したST-LB1を選択、DNS名をコピーします。
ブラウザの検索窓にDNS名を入力してindex.htmlが表示されることを確認します。

何度か読み込みをしてみてST-WebServer1とST-WebServer2が切り替わって表示されていれば振り分けはokです。しかしこのままだとWebサーバーのセキュリティグループが全ての接続元からの接続を許可した設定のため、ロードバランサーのセキュリティグループからの通信のみを許可するよう設定を変更していきます。
EC2の画面の左ペインからセキュリティーグループを押下、
ST-Web-SG1を検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/87f1a363-be5c-0198-9948-3f5a17a9734b.png)
インバウンドルールを編集。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/07f7e37c-bcc6-69f0-426f-10057c596b75.png)
すでに設定されているHTTP の0.0.0.0/0と::/0は削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/5c805705-79c7-cf85-00a6-971996763920.png)
ルールを追加します。
タイプにHTTPを選択、ロードバランサーに設定したST-LB-SG1を選択してルールを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/c9f8bb51-7357-34d7-87ba-97ce29d4bcf1.png)
続いて、再度ブラウザにロードバランサーのDNS名を入力、ST-WebSever1と2からレスポンスがあるか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/a1cac01e-2455-941b-2ff9-56cc0fbd1d2b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/9ee0312b-8b30-a339-d4e1-964707e0e620.png)


ST-WebSever1を停止してもST-WebSever2で継続して閲覧できるか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/3f9d896b-4637-bfab-ee37-8a8548e72e86.png)
ST-WebSever2でWebサイトを継続して閲覧できることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/d0a10e07-1cf1-49e5-7a27-ad858f4d3bd3.png)

##AutoScalingでEC2を増減させる
上記手順でEC2を2台で通信を振り分けることが可能になりましたが、この２台で処理し切れないほどの通信が発生した場合には、ページを閲覧できなくなってしまうので、EC２を増減させることで一時的な対応が可能になリます。

###1.起動テンプレート作成
EC2の画面の左ペインから[テンプレートの起動]へ移動、[起動テンプレートを作成]を押下.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/434d208a-56ac-27cc-7ce5-f45467c03ae2.png)
テンプレート名とバージョンを入力、チェックボックスにはチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/af9cfb61-e8d9-65ec-d157-d1687072da0a.png)

AMIはすでに作成しているST-WebServerを選択.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/52763af4-d444-0547-07ff-020f5a06ea8b.png)
インスタンスタイプ、キーペアを選択、ネットワーク設定はVPCを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/f1873792-d680-edcd-e610-250348e7d861.png)
リソースタグのキーにST-WebServer-Autoと入力しておくことで、自動で立ち上がるインスタンスに任意のNameが付与することができます。
セキュリティグループはST-Web-SG1を選択、既存のEC2インスタンスと同様のセキュリティグループを設定します。
パブリックIPの自動割り当ては有効化、高度な詳細はデフォルト値で作成します。
なお、起動テンプレートは設定を変更できますが、バージョン管理できる点が最大のメリットです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/88139808-347b-0eb9-b638-2af4e73afade.png)

###EC2インスタンスをスケーリングさせてみる
すでに作成したEC2インスタンスのST-WebServer1とST-WebServer2は停止状態にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/1983621b-f3b1-62c9-f887-9fb181d53c27.png)
EC2の画面の左ペインからAutoScalingグループを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/d83f0777-3e55-fc18-f6d5-e7f5d639cdbf.png)
Auto Scaling グループ名はTEST-ST-AutoCaling1とします。
起動テンプレートはST-LaunchTemplate1を選択、バージョンはLatest()を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/84894c61-ba0b-067c-ebbb-5d445c4df365.png)
インスタンスの購入オプションは[起動テンプレートに準拠する]を選択、VPCを選択、
ST-PublicSubnet1とST-PublicSubnet2を選択します。
続いて、詳細オプションを設定します。
既存のロードバランサーにアタッチを選択し、ST-TG-1を選択、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/2923bc62-7c96-b33b-c3b3-b483a8291e7d.png)
ユーザーがWebページを閲覧できることが目的のため、ELBのHTTP80番ポートのヘルスチェックも必要となります。そのためELBにはチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/b3335fd0-42f9-fe20-a987-51586ac3e0d4.png)
グループサイズは、希望する容量2 最小キャパシティ2 最大キャパシティ4とします。
インスタンスのスケールイン保護はチェックなしで進めます。
次のステップの[通知を追加]と[タグを追加]は今回は追加せずに進めます。
サマリを確認して間違いがなければ[AutoScallingグループを作成]を押下します。
EC2インスタンスの画面に戻るとすでにST-WebServer-Autoが2台立ち上がっていることを確認できました.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/28107e53-2748-bc20-9d77-8252d7d68df1.png)
再度、ロードバランサーのDNS名にアクセスしても継続してWebページが表示されていることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/aae4b011-fbc4-0741-ed4d-28c92c8d5593.png)

##CloudWatchでCPUを監視して、使用率によってEC2を増減させる

###1.CloudWatchでアラームを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/100d8dfd-e550-d1cc-511b-fa60b66c103c.png)
メトリクスはEC2を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/f4cb0f16-6f31-ef1f-8905-e62d2c7dc59f.png)
[Auto Scaling別]を選択、TEST-ST-AutoCaling1のCPUUtilizationを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/e4ac5d41-402d-1a2b-361e-db5e26673f87.png)
条件を選択していきます。
欠落データの処理については、EC2のCPU高負荷が原因でデータが取得できないことを想定して
[閾値を超えているとして処理]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/92ae885f-f735-01cd-e314-ff6e99f52480.png)
アラーム名はわかりやすい名前にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/aab89555-9824-ffdb-d3ae-d188b4db447a.png)

###2.同様の手順でST_CPU_Lowを作成していきます。
ST_CPU_Lowのアラームについては欠落データの処理を[見つかりませんとして処理]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/d4256c45-20f6-5ded-a699-cd45b3b1dd5d.png)
作成後、アラームの一覧へ戻ります。
しばらく待ってアラームの状態が下記画像の状態になっていれば正常です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/2ce0abdd-d287-a999-08dc-47fb74f40fd1.png)

###3.スケーリングポリシーとアラームを紐付ける
左ペインからAuto Scalingグループの画面に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/920db77a-0e15-b5ed-b59e-991d59b4767f.png)
作成したAuto Scalingグループを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/c86290b9-ea43-3861-285c-6de380e829d8.png)
スケーリングポリシーを追加してアラームを紐付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/98e423e4-590f-f877-a541-5a2b5c619c33.png)
スケーリングポリシーを追加します。
[シンプルなスケーリング]を選択、ポリシー名はST_CPU_addとしておきます。
CloudWatchアラームはST_CPU_Highを選択、
アクションは、[追加][1][キャパシティユニット]として、30秒待機する設定にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/c18806cd-d486-b979-bae2-6dc0f2bbfcb5.png)

####同様の手順でポリシー(ST_CPU_remove)を追加していきます。
ポリシー名はST_CPU_removeとして、
アラームはST_CPU_Lowを選択、
アクションは、[削除][1][キャパシティユニット]、30秒待機する設定にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/804b2d19-262b-d240-76f5-811d8f3a8028.png)

##EC2インスタンスに負荷をかけて動きを検証

稼働しているEC2インスタンスを選択し、インスタンスに接続。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/681f5983-af3e-7f75-c455-873725cff4d5.png)
接続したEC2インスタンスで以下のコマンドを４回実行してCPU負荷をかけていきます。

```terminal:EC2
# yes >> /dev/null &
# yes >> /dev/null &
# yes >> /dev/null &
# yes >> /dev/null &
```

その後topコマンドでCPUを確認して70%を超えていることを確認します。

```terminal:EC2
 # top
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/49af4f55-4e38-3634-59a3-7fe946c359f5.png)

同様の手順でもう一方のEC2インスタンスでもCPU負荷をかけていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/1b96f864-a69d-694b-eb94-548918697fb8.png)

###CPU高負荷でインスタンスが立ち上がっているかを確認
しばらくすると先ほどまでは2の構成て稼働していましたが、
2インスタンス追加され最大４の構成となっていることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/ee3bb268-67d5-8ad5-b3cf-e4b50dc92c5c.png)

###EC2で起動したプロセスを終了させる
最後にプロセスを終了させます。
再度topコマンドでPIDを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/ed3a3c32-dbd9-0a55-f5b1-8173c861231e.png)
killコマンドでプロセスを終了します。

```terminal:EC2
# kill 4226
PIDが連番であれば波括弧を使って一括で終了できます。
# kill {4226..4229}
```

なお、CPUなどのメトリクスの値についてはCloudWatchの画面の左ペイン、
[メトリクス]でグラフ表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/d276300d-0b35-ff5e-fb4f-30f0ec524010.png)

プロセスを終了させCPUが30%より低くなると、スケーリングポリシーにより
不要となったインスタンスはシャットダウンされていることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637321/0c20c3c9-a6a5-e7d8-5ddb-ca6ef9ca837b.png)

***

この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com

***