ネットワーク作成からスケーラブルな仮想サーバー構築までをクラウドで行う【AWS編】

# はじめに

このアカウントで初めてのQiita投稿になります。2021年2月から株式会社MIERUNEに参画しています。ここ最近、弊社の社員教育の一環としてAWSとGC（旧GCP）について学ばせてもらえる機会がありました。ずっと興味のあったAWSとGCでのスケーラブルな仮想サーバー構築のノウハウを学ぶことができたので、双方の構築方法を備忘も兼ねてアウトプットとさせていただきます。こちらの記事ではAWSについて記載します。GCについての記事は[こちら](https://qiita.com/selfsryo/private/c8728129da76a6917f43)



# 対象

- AWSとGCでスケーラブルなサービスを構築したい方
- クラウドサービスにあまり触れたことのない方

自分自身クラウドは初心者に近いので、そういった目線から結構細かめに書いてみようと思います。



# スケーラブルとは

その前にスケーラビリティとは・・・（以下 [IT用語辞典 - スケーラビリティ](https://e-words.jp/w/%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3.html) を参照）

> 機器やソフトウェア、システムなどの拡張性、拡張可能性のこと。スケーラビリティの高いことを「スケーラブルな」（scalable）と表現することもある。

この記事においてスケーラブルとは、リソースを拡張/縮小できるという意味で使っています。利用状況に応じて自由にリソースをスケーリングできるのは、クラウドサービスの強みの1つでもあります。

# 前提

この記事ではキャプチャを交えてオートスケーリングの設定方法を書いていきます。現在は2021年8月時点の情報です。UIやサービスの名称がちょくちょく変わっちゃうので注意が必要です。（そもそもGCP→GCに名称が変わっちゃったぐらいなので・・）

記事の中で設定している値は適当なので任意に変更していただいて構いません。

# 構成図

以下のような構成にします。異なるAvailability Zoneにインスタンスを配置し、ロードバランサで負荷分散を行います。またインスタンスをグループで括ってオートスケーリングの設定を行います。

![aws1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/9477282e-9ab6-9201-1ca7-3059ad12cc33.png)



# 方法

以下からキャプチャを交えて設定の方法を書いていきますが、UIやサービスの名称がちょくちょく変わっちゃうので注意が必要です。（そもそもGCP→GCに名称が変わっちゃったぐらいなので・・）この記事は2021年8月時点の情報です。



# ネットワーク構築

まずは、土台となるVPC作成とサブネット切り分け、インターネットゲートウェイの引き込みを行います。

ログイン後に右上のメニューからリージョンを設定します。今回は`アジアパシフィック（東京）ap-northeast-1`を指定しました。

## VPC

その後サービスから「VPC」を選択し、左メニュー「VPC」 >  右上の「VPCを作成」を押下します。
名前とIPv4 CIDRを設定して、その他はデフォルトにします。今回は以下のようにしました。

| 名前               | IPv4 CIDRブロック |
| ------------------ | ----------------- |
| AutoScalingTestVPC | 10.0.0.0/16       |

## サブネット

続いてサブネットを切っていきます。サービス「VPC」の左メニュー 「サブネット」 > 右上の 「サブネットを作成」 を押下します。VPCは先ほど作成した`AutoScalingTestVPC`を選択し、サブネットの設定ではサブネット名、アベイラビリティーゾーン（AZ）、IPv4 CIDRを設定します。今回は2つのEC2を異なるAZに配置するので、サブネットを2つ切ります。以下のようにしました。

| サブネット名                 | アベイラビリティーゾーン                    | IPv4 CIDR ブロック |
| ---------------------------- | ------------------------------------------- | ------------------ |
| AutoScalingTestPublicSubnet1 | アジアパシフィック (東京) / ap-northeast-1a | 10.0.1.0/24        |
| AutoScalingTestPublicSubnet2 | アジアパシフィック (東京) / ap-northeast-1c | 10.0.2.0/24        |

## インターネットゲートウェイ

続いて、VPCにインターネットゲートウェイを設定します。サービス「VPC」の左メニュー 「インターネットゲートウェイ」 > 右上の「インターネットゲートウェイの作成」に進みます。名前タグを設定し、「インターネットゲートウェイの作成」を押下します。今回は`AutoScalingTestIG`という名称にしました。
作成後、インターネットゲートウェイ一覧画面から、作成した`AutoScalingTestIG`の左にチェックを入れ、「アクション」 > 「VPCにアタッチ」を押下します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/9f55ef5c-c179-a6c0-0f96-fa68af7ec055.png)


ここでVPCにアタッチすることができるので、先ほど選択した`AutoScalingTestVPC`を選択して「インターネット」ゲートウェイのアタッチ」を押下します。これで、VPCにインターネットゲートウェイが設定されました。

## ルーティング

最後に、ルーティングの設定をします。サービス「VPC」の左メニュー 「ルートテーブル」> 右上の「ルートテーブルを作成」に進みます。名前とVPCを設定しますが、今回は`AutoScalingTestRouteTable`、VPCは先ほど作成した`AutoScalingTestVPC`を選択し、「ルートテーブルを作成」を押下します。
その後、作成したルートテーブルを選択し、下部メニューの「サブネットの関連付け」> 右側の「サブネットの関連付けを編集」をクリックします。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/703d02ef-aa89-cf9c-89c3-027dbcfb6e2f.png)


そうするとサブネットの選択画面に遷移するので、先ほど作成した`AutoScalingTestPublicSubnet1`と`AutoScalingTestPublicSubnet2`にチェックを入れます。

その後、インターネットゲートウェイの設定をします。下部メニューの「ルート」> 右側の「ルートを編集」をクリックします。


![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/0f614334-f532-a2c3-d651-c1fbed352a7c.png)

するとルート編集画面に進むので、「ルートを追加」を押下します。ここでは以下のように設定しました。

| 送信先    | ターゲット                                              |
| --------- | ------------------------------------------------------- |
| 0.0.0.0/0 | 作成したインターネットゲートウェイ（AutoScalingTestIG） |



ここまでで、以下のネットワークの構築は完了です。以下の部分を設定したことになります。

![aws2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/664c2bba-17c3-1c9f-1d0b-b1e3faed4c66.png)



# インスタンス

仮装サーバーのインスタンスを作成していきます。

## セキュリティグループ

インスタンス作成の前にセキュリティグループを設定します。
サービスから「EC2」を選択し、その後左メニュー 「セキュリティグループ」> 右上の「セキュリティグループを作成」に進みます。セキュリティグループを設定する画面に遷移するので、セキュリティグループ名、説明、VPCを入力します。今回は以下のようにしました。

| セキュリティグループ名 | 説明                  | VPC                               |
| ---------------------- | --------------------- | --------------------------------- |
| AutoScalingTestSG      | for auto scaling test | 作成したVPC（AutoScalingTestVPC） |

その後インバウンドルールを設定します。今回はSSHとHTTPを許可します。ソースは`Anywhere-IPv4`にします。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/19f1c724-f511-c309-b207-eb20b5bf5a92.png)


アウトバウンドルールはデフォルトのままにして、「セキュリティグループの作成」をクリックします。これでセキュリティグループの作成は完了です。



## EC2インスタンス作成

仮装サーバーのインスタンス作成と設定に入っていきます。サービス「EC2」の左メニュー 「インスタンス」 > 右上の「インスタンスを起動」を押下します。

マシンイメージ選択画面に進むので、`Amazon Linux 2 AMI (HVM), SSD Volume Type`を選択します。次画面でインスタンスタイプを`t2.micro`にし、「インスタンスの詳細の設定」に進みます。

詳細設定画面では、VPC、サブネット、自動割り当てパブリックIPを設定します。今回は以下のようにしました。

| VPC                                    | サブネット                                              | 自動割り当てパブリックIP | CloudWatch 詳細モニタリングを有効化 |
| -------------------------------------- | ------------------------------------------------------- | ------------------------ | ----------------------------------- |
| 作成したVPC<br/>（AutoScalingTestVPC） | 作成したサブネット1<br>（AutoScalingTestPublicSubnet1） | 有効                     | チェックを入れる                    |

また、インスタンス起動時にApacheを起動し、任意のページを表示しておきたいので、「高度な詳細」> 「ユーザーデータ」に以下を記載します。

```
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
chown -R $USER:$USER /var/www
echo Hello,AutoScalingTest > /var/www/html/index.html
```

その他の項目はデフォルトのままにして、次に「次のステップ：ストレージの追加」（ここはデフォルトのまま次に進む）、「次のステップ：タグの追加」と進み、「タグの追加」からキーと値を設定します。今回はキーに`Name`、値に`AutoScalingTestServer1`と設定しました。「次のステップ：セキュリティグループの設定」に進みます。

セキュリティグループの設定画面では、「セキュリティグループの割り当て」を「既存のセキュリティグループを選択する」にし、先ほど作成した`AutoScalingTestServer1`にチェックを入れます。

ここまで終わったら、「確認と作成」 > 「起動」と進みます。キーペアを選択する画面になるので、「新しいキーペアの作成」を選び、キーペア名を入力します。今回は`AutoScalingKey`としました。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/94931032-72de-8fb6-d66d-0272d714bc0f.png)

「キーペアのダウンロード」からダウンロードし（キーは公開しないよう大事に保管しておいてください）、「インスタンスの作成」をクリックすると、インスタンスの作成が始まります。「インスタンスの表示」からインスタンス一覧画面に進むと、作成したEC2が表示されています。「ステータスチェック」に`2/2 のチェックに合格しました`と表示されるようになると、仮想サーバーが起動されています。

正しく実行されているか確認してみます。インスタンス一覧から作成したインスタンスにチェックを入れ、下部メニューの「詳細」から「パブリックIPv4アドレス」を確認します。このIPをブラウザからアクセスすると、`Hello,AutoScalingTest`と表示されているはずです。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/c361dfb6-2f3d-08b0-c3d5-8c646dbc2e1b.png)


## AMI作成

このApacheインストール済みのインスタンスを、AMI（Amazon マシンイメージ）として作成することで、他でも使いまわせるようになります。インスタンス一覧から作成したインスタンスを右クリックし、「イメージとテンプレート」 > 「イメージを作成」の順に選択します。

イメージ作成画面に進むので、イメージ名とイメージの説明を設定します。今回は以下のようにしました。

| イメージ名         | イメージの説明   |
| ------------------ | ---------------- |
| AutoScalingTestAMI | Installed Apache |

「イメージの作成」をクリックし、インスタンスの画面に戻った後に、左メニューの「AMI」に進みます。ここで作成したAMIが確認できます。ステータス」が`available`になれば完了です。



## 2台目のインスタンス作成

今作成したAMIから、もう一台インスタンスを作成します。サービス「EC2」の左メニュー 「インスタンス」 > 右上の 「インスタンスを起動」 を押下します。

AMI選択画面で、左メニューから「マイAMI」を選びます。すると先ほど作成した`AutoScalingTestAMI`があるので、これを選択します。そのあとは先ほどと同じように作成を進めますが、以下は変えます。

| サブネット                   | 高度な設定のユーザーデータ | タグ追加のName         | キー ペア                               |
| ---------------------------- | -------------------------- | ---------------------- | --------------------------------------- |
| AutoScalingTestPublicSubnet2 | 何も書かない               | AutoScalingTestServer2 | 既存のキー ペアからAutoScalingKeyを選択 |

作成が終わったら、起動の確認をします。先ほどと同じように`AutoScalingTestServer2`のパブリックIPv4アドレスを確認し、ブラウザからアクセスした際に`Hello,AutoScalingTest`の画面が見えたら成功です。



# ロードバランサ

インスタンスが作成できたので、負荷分散のためのロードバランサを設定します。

サービス「EC2」の左メニュー 「ロードバランサ」 > 左上の「ロードバランサーの作成」に進みます。するとロードバランサーの種類の選択画面に遷移するので、Application Load Balancerの「作成」をクリックします。

基本設定画面に進むので、名前とVPC、AZを設定します。今回は以下にしています。それ以外はデフォルトです。

| 名前              | VPC                               | アベリラビリティーゾーン                      |
| ----------------- | --------------------------------- | --------------------------------------------- |
| AutoScalingTestLB | 設定したVPC（AutoScalingTestVPC） | ap-northeast-1a と ap-northeast-1a にチェック |

そのまま「次の手順: セキュリティ設定の構成」 > 「次の手順: セキュリティグループの設定」まで進みます。ここでは先ほど作成した`AutoScalingTestSG`のみ選択します。

「次の手順: ルーティングの設定」をクリックし、ターゲットグループを作成します。名前を`AutoScalingTestTarget`としました。また「ヘルスチェック」 > 「ヘルスチェックの詳細設定」で「間隔」を`10`にします。

「次の手順: ターゲットの登録」をクリックし、作成した`AutoScalingTestServer1`と`AutoScalingTestServer2`をチェックして「登録済みに追加」を押下します。

「確認」> 「作成」でロードバランサが作成されます。左メニュー「ロードバランサー」から作成したロードバランサの状態が`Active`になるまで待ち、チェックを入れて下メニューから「DNS名」を確認します。
この「DNS名」の値をコピーして、ブラウザからそのままアクセスすると、同じく`Hello,AutoScalingTest`の画面が起動されているはずです。

ここまでで、以下のようにインスタンスをAZごとに作成し、かつロードバランサで負荷分散を行うまでを構築したことになります。

![aws3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/040798ec-6f9e-f93a-bc29-adabe58b852b.png)

### 負荷分散の確認

実際に負荷分散が行われているか確認してみます。いったん、ヘルスチェックが正しく動作しているか確認するために、左メニューの「ターゲットグループ」をクリックします。 作成した`AutoScalingTestTarget`にチェックを入れ、下メニューの「Detail」の中の「Healthy」の値が`2`、「Unhealthy」の値が`0`になっていることを確認します。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/335c1f5e-d5b0-4465-83f1-96d7e71204a9.png)


その後、ロードバランサからのリクエストがインスタンスに均等に届いていることを確認します。まずは、先ほどダウンロードしたキーペアを用いて`AutoScalingTestServer1`にsshでログインします。キーが~/Downloadsにあると仮定して、PCのコンソールから以下のコマンドを実行します。

```
sudo chmod 400 ~/Downloads/AutoScalingKey.pem
ssh -i ~/Downloads/AutoScalingKey.pem ec2-user@AutoScalingTestServer1のパブリックIPv4アドレス
```

「yes」を入力するとインスタンスにログインできます。Apacheのリクエストに対してのログは`/var/log/httpd/access_log`の中にあるので、以下で確認します。

```
sudo cat /var/log/httpd/access_log
```

すると、HealthCheckerからのリクエストのログがたくさん作成されているはずです。これは、ターゲットグループが10秒ごとにヘルスチェックを行なっているからです。

ここで、先ほどアクセスした、ロードバランサの「DNS名」に対して、再度ブラウザからアクセスし、ブラウザのリロードを10回行ってみます。その後に、再度コンソールから`sudo cat /var/log/httpd/access_log`を実行してログを確認すると、先ほどとは違いHealthChecker以外からのリクエストのログが5行分確認できるはずです。

いったんコンソールの別タブを立ち上げて、`AutoScalingTestServer2`にも同様にログインしてみます。

```
ssh -i ~/Downloads/AutoScalingKey.pem ec2-user@AutoScalingTestServer2のパブリックIPv4アドレス
```

同じようにして`/var/log/httpd/access_log`を確認すると、こちらにもHealthChecker以外からのリクエストのログが5行分確認できます。（もし先程のリロードから時間が経っていたら少しログを遡る必要があります）

このことから、ロードバランサによってリクエストが`AutoScalingTestServer1`と`AutoScalingTestServer2`に均等に分けられていることがわかります。



# オートスケーリング

最後に、この記事のテーマであるオートスケーリングの設定に入ります。設定が多く、かなりテキストベースの内容になってしまいますがすみません。



## 起動テンプレート作成

サービスから「EC2」を選択し、左メニュー 「テンプレートの起動」> 「起動テンプレートを作成」に進みます。ここの「起動テンプレート名と説明」において、起動テンプレート名、テンプレートバージョンの説明を入力し、AutoScalingのガイダンスにチェックを入れます。今回は以下のように入力しました。

| 起動テンプレート名      | テンプレートバージョンの説明 | AutoScalingのガイダンス |
| ----------------------- | ---------------------------- | ----------------------- |
| AutoScalingTestTemplate | for AutoScalingTest          | チェック                |

それ以下の項目は以下のように設定します。この他の項目はデフォルトにしました。

| Amazon マシンイメージ (AMI) | インスタンスタイプ | キーペア(ログイン) | ネットワーク設定のセキュリティグループ | 高度な設定                                |
| --------------------------- | ------------------ | ------------------ | -------------------------------------- | ----------------------------------------- |
| AutoScalingTestAMI          | t2.micro           | AutoScalingKey     | AutoScalingTestSG                      | 「CloudWatch モニタリングの詳細」を有効化 |

ここまで設定したら「起動テンプレートの作成」をクリックします。
起動テンプレート作成成功の画面に遷移するので、「テンプレートから Auto Scaling グループを作成」の「Auto Scalingグループを作成」をクリックします。



## Auto Scalingグループ作成

ここまでで、AutoScalingグループ作成画面に遷移しているはずです。最初の画面では、「Auto Scaling グループ名」を設定します。今回は`AutoScalingTestGroup`としました。起動テンプレートは先ほど作成した`AutoScalingTestTemplate`が選択されていることを確認し、「次へ」をクリックします。

次の「設定の構成」画面では、以下のようにします。

| インスタンスの購入オプション | VPC                | サブネット                                     |
| ---------------------------- | ------------------ | ---------------------------------------------- |
| 起動テンプレートに準拠する   | AutoScalingTestVPC | AutoScalingTestSubnet1とAutoScalingTestSubnet2 |

「次へ」をクリックします。

「詳細オプションを設定」画面に遷移するので、そこでは以下のようにします。

| ロードバランシング               | 既存のロードバランサーにアタッチ             | 既存のロードバランサーターゲットグループ | ヘルスチェック                      | その他の設定           |
| -------------------------------- | -------------------------------------------- | ---------------------------------------- | ----------------------------------- | ---------------------- |
| 既存のロードバランサーにアタッチ | ロードバランサーのターゲットグループから選択 | AutoScalingTestTarget                    | 「ヘルスチェックの猶予期間」を120秒 | モニタリングにチェック |

「次へ」をクリックします。

「グループサイズとスケーリングポリシーを設定する」画面に遷移するので、「グループサイズ」を以下のようにします。それ以外はデフォルトにします。

| 希望する容量 | 最小キャパシティ | 最大キャパシティ |
| ------------ | ---------------- | ---------------- |
| 4            | 2                | 4                |

「次へ」 > 「通知の設定」の「次へ」 > 「タグを追加」の「次へ」と進み、「Auto Scaling グループを作成」をクリックします。

この時点でAutoScalingグループが作成され、それと同時に2つのインスタンスが起動します。左メニューの「インスタンス」をクリックすると、新たに2つのインスタンスが一覧に表示されていることがわかります。  



## 既存のインスタンス削除

AutoScalingでインスタンスを作成したので、既存のインスタンスを削除します。インスタンスの中から、`AutoScalingTestServer1`と`AutoScalingTestServer2`にチェックを入れ、右上の「インスタンスの状態」 > 「インスタンスを終了」> 「終了」を押下します。

)![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/af2503d9-b032-6919-696a-6d5b50958dff.png)


これによって、ロードバランサ配下のインスタンスは`AutoScalingTestTemplate`によって作成されたインスタンスのみになりました。

先ほどアクセスしたロードバランサのDNS名に対してブラウザからアクセスすると、今までと同様に`Hello,AutoScalingTest`が表示されているはずです。



## オートスケーリングの確認

インスタンスが自動で作成されるかを確認してみます。先ほど`AutoScalingTestGroup`を作成したときに、「最小キャパシティ」を2にしました。これが正しく動作しているかを確認してみます。インスタンスの一覧を確認すると、現在`AutoScalingTestTemplate`によって起動されたインスタンスは2つあるはずなので、このうち1つを停止してみます。
どちらかのインスタンスにチェックを入れ、「インスタンスの状態」 > 「インスタンスの停止」 > 「停止」をクリックします。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/1d6f8bbf-4526-1c75-7a8c-eead65b74ac4.png)


この状態で少し待ち、再度上部の更新マークをクリックしてみます。そうすると、もう1台インスタンスが新しく立ち上がる様子が確認できます。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1310757/f4611c9e-bbd2-8858-61dc-7a772111b425.png)
また、停止したインスタンスはしばらく待ったら勝手に「終了済み」になります。


# おわりに

今回は基本的な設定について書きましたが、CloudWatchと組み合わせたり、ポリシーを設定したりすることでスケーリングを独自で設定することができます。これらの実践的な設定についてもさらに細かく学んでいきたいです。