ELBの設定とトラフィック検証

#はじめに
AWS試験勉強の備忘録です。
# ELB（Elastic Load Balancing）とは
マネージド型のロードバランシングサービスです。
複数のサーバーによる冗長化構成を構築し、それらのサーバーに対して負荷分散を行います。
マネージドサービスなのでELBが稼働しているサーバー自体の管理はいりません。

# 特徴
- ヘルスチェック
- 負荷分散
- SSL/TLSサポート
- スティッキーセッション
- Connection Draining
- アクセスログの記録

# ELBの種類
以下の３つのタイプが存在する。

- __CLB（Classic Load Balancer）__

- __ALB（Application Load Balancer ）__

- __NLB（Network Load Balancer）__

それぞれの違いについては[こちら](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/load-balancer-types.html#clb)を参考にしてください。

# CLBとALBの違い
大きな違いはALBのみコンテントベースルーティングがあることです。
どんな機能かというとURLに含まれるURI文字列によって判定を行い、
事前に設定された振り分け先にルーティングします。

ALBはパスルーティングによりCLBより容易にバランシング構成が可能ということです。

##CLBだと
２つのURLにわけた場合にELBが２つ必要になリます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/e15fae87-8fef-b7ee-6dda-904f58348a09.png)

##ALBだと
パスルーティングにより１つのELBでバランシングが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/2939ad46-00ea-946e-76f2-fae4bd70bf48.png)

#ELBの検証
マルチAZ構成で２つのwebサーバーにELBを使用して
実際にどのようなトラフィックになるのか検証してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/1011c186-a812-ab47-f915-e231c10f5327.png)

#手順
##1.VPC、パブリックサブネットの作成
VPCダッシュボード画面から[VPCの作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/c85f45df-6132-93d9-d467-a8fd401e68cd.png)

下記を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/f1200bcc-e953-a031-4134-638e858d0176.png)

任意のVPC名を付けます。
AZは`ap-northeast-1a`を選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/98c5bf68-4057-8291-e55a-385435e8f62a.png)
これで[VPCの作成]をクリックします。

完成するとパブリックサブネットが一つ作成されていることが確認できます。
今度は先程とは違うAZにパブリックサブネットをもう１つ追加していきます。

コンソールのサブネット画面から[サブネットの作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/f499ac9d-dfd5-63b2-af2f-3352c43250a9.png)

作成したVPCを選択して、
AZを今度は`ap-northeast-1c`にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/e974f38c-0446-3a23-8e69-fd8a9794c4c9.png)

ルートテーブルにインターネットゲートウェイを付与していきます。
[ルートテーブルの関連付けの編集]をクリックして、
インターネットゲートウェイがあるルートテーブルIDにして保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/f6dac944-6052-3d7b-229f-eafe05219a6e.png)


これで２つのパブリックサブネットが完成しました。

## 2.インスタンスの構築
それぞれのパブリックサブネットにEC2インスタンスを構築していきます。

インスタンスのコンソール画面から
[インスタンスの作成]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/0fc40c36-79d1-4087-8618-f25a5fd99c7e.png)

AMIは一番上のを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/03ed2381-f9a2-9d70-dd2f-668fe2d04f8e.png)

インスタンスタイプはデフォルトのままにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/e2c11407-c792-80d5-77ff-84f2a45dd68f.png)

インスタンスの詳細の設定ではVPCは作成したものにし、
サブネットに関しては、最初にAZが`ap-northeast-1a`のものを選択します。

自動割り当てパブリックIPも有効にしておきます。
それ以外はデフォルトのまま次に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/dece713e-f6b0-43bb-433f-63d27bac46a6.png)

ストレージの追加はデフォルトのまま進み
タグは任意でnameなどを付けてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/38ce2cf8-8a2a-9412-77d1-bba6ec702f80.png)

セキュリティグループの設定画面では
新しいセキュリティグループを作成してください。
タイプの方では`HTTP`と`HTTPS`を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/9f3c8130-d8c7-af25-62cc-d1f4a1116967.png)

この状態でインスタンスを作成します。

作成されたことを確認したら
今度はAZが`ap-northeast-1c`の所に上記の流れでインスタンスを作成します。
変更箇所は以下になります。

- サブネットを`ap-northeast-1c`で作成したものにすること
- セキュリティグループは上で作成したものを使用すること

以上でそれぞれのAZに１つずつインスタンスが構築されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/7b041ace-eaf2-daf7-fcef-5915f03ac7eb.png)

## 3.WEBサーバーに設定
作成したインスタンスをWEBサーバーに設定していきます。

まずは`web-1a`にsshします。
インスタンスの説明からパブリックIPをコピーしていき、
macならターミナル、windowsならteratermを使用して接続してみて下さい。

sshできたら
まず管理者権限に移動します

```
$ sudo su -
```
次にファイルのアップデート状況を確認します。

```
# yum update -y
```
アパッチのソフトウェアをインストールして
WEBサーバーにしていきます。

```
# yum install httpd -y
```
インストールが完了したら
以下のコマンドでアパッチソフトウェアを起動します。

```
# service httpd start
```
htmlファイルを作成していきます。
以下のディレクトリまで移動します。

```
# cd /var/www/html
```

`ls`コマンドで中身を見てみると何もないことが確認できます。
ここにhtmlファイルを作成します。
今回はvimを使用します。

```
vim index.html
```

```index.html
<html><h1>hello A!!</h1></html>
```
入力が完了したら`:wq`で保存します。
保存できたらリスタートさせます。

```
# service httpd restart
```
これで完了しました。

確認のためインスタンスの画面から対象インスタンスのパブリックIPをコピーして
WEBのURLに貼り付けてみて下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/1c9e310f-2967-0874-60a3-524d130cb5ad.png)
htmlで作成した文字が表示されました。

これをもう一つのインスタンスにも同じ流れで、
作業してWEBサーバーとして設定していきます。

一応違いを表すためにhtmlファイルを下記の内容にしておきます。

```index.html
<html><h1>hello C!!</h1></html>
```
インスタンスのパブリックIPから
下記の内容で表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/7d9e7a8b-ae18-8a5d-b045-d3aeb741dac2.png)

## 4.ELBの作成
インスタンス画面の左にロードバランサーの項目があるので、
そこをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/a77353cc-00b1-f4f0-9545-dd0f4c4d8589.png)

[ロードバランサーの作成]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/7634b751-fc56-806d-d19f-14457164cf7b.png)

ALB、NLB、CLBの３つがあります。
今回はALBを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/a29b447e-4140-18ef-c9c3-7bd271084771.png)

名前を入力します。
そのまま下のアベイラビリティーまで進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/2bb44f9e-30e9-0b77-e95c-55ed118cf944.png)

作成したVPC、AZを選択します。
タグ任意で名前などを付けてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/6d156aa2-ee5d-0c21-26b2-8e40b4b25377.png)

セキュリティグループの設定まで進み、セキュリティグループは
インスタンスの作成時に利用したものを選択してください。

ルーティングの設定でターゲットをインスタンスにして、
プロトコルもHTTPにして作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/acf5cbfd-1055-e170-9aad-fd6ad2e97c34.png)

ターゲット登録画面で
作成した２つのインスタンスにチェックを付けて
[登録済みに追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/9322a0d5-0f69-0e9f-4059-c7caf07f4f2c.png)
これで作成します。

## 5.トラフィック検証
ELBの画面から
作成したELBのDNS名をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/d3f9202a-798a-ba65-9b54-1691f737c001.png)

それをURLに貼り付けると
WEBサーバーの設定で確認した画面が出てくると思います。

`このサイトにアクセスできません`というエラーが出た場合は
少し時間を置いてから実行してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/78899215-816f-ea6c-0952-c02462073d4a.png)

何回か更新すると表記が変わってくると思います。
今回だと`hello A!!`と`hello C!!`のようになります。

試しに`hello A!!`を表示させるインスタンスを
停止させてみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/332ffabc-4015-c5c4-0757-9e2e244ad077.png)

この状態でELBのDNS名でアクセスすると
`hello C!!`しか表示されないことがわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510859/3a7a0bf3-5206-9307-5a84-cf07c7bbca19.png)

#まとめ
以上のことからELBがターゲット内のインスタンスの状況を
配慮してトラフィックの制御をしていることが確認できました。