【超入門】負荷分散をAWSのロードバランサーを使ってやってみよう

# AWSのロードバランサーを使って負荷分散をする(初級編)

この記事は、AWSのELBを使ったことがないけど、ロードバランサー？負荷分散！？という方向けの記事です。

## ロードバランサーの役割
大きく分けて二つの機能があります。
１、複数台webサーバーを複数台用意し、負荷を分散させることができます。
２、メンテナンスや障害時には切り離しを行うことができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62822/a372eef4-8478-efc9-cd10-b7eaee60c844.png)


## AWSのロードバランサーの種類
- ELB (Classic Load Balancer)
    - ALBより前からあった設定が基本的にしやすいロードバランサー
- ALB (Application Load Balancer)
    - パスベースルーティング機能など豊富になったようなもの
- NLB (Network Load Balancer)
    - 長時間接続やリージョン内とリージョンを跨いだフェイルオーバーが可能になり、さらに進化したみたいな感じ


## 早速利用してみる
- 今回は概念としてわかりやすく、設定しやすいELBを使って見ましょう！

### EC2インスタンスを複数用意する
- 同じアプリケーションサーバーを複数用意します。この時おすすめなのは、現段階で動いているインスタンスのイメージ（AMI）
を作成し、そのAMIから新しいインスタンスを起動するとほぼ同じアプリケーションサーバーを立てることができます。
- このへんの記事がわかりやすいかと思います
    - [Amazon Web Services(AWS) のEC2でインスタンスをコピーする方法
](https://qiita.com/murachi1208/items/8be3cd006d31f1f81ee4) 


### ロードバランサーを作成する
インスタンスを複数起動しましたら、さっそくELBを作成しましょう

- ec2の画面からロードバランサーを選びます

<img width="100" alt="スクリーンショット 2017-10-30 21.20.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/6b292425-9ea7-bd75-a0c0-0d1abd871e36.png">

- **ロードバランサーの作成**を押して、ELBを選びます

<img width="1000" alt="スクリーンショット 2017-10-30 21.28.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/200a4a80-01ce-3e38-c93e-adb9e7fccc3e.png">

- ロードバランサーの名前とプロトコルを選択して次へ進みます。
<img width="1580" alt="スクリーンショット 2017-10-30 21.44.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/012f2185-5874-b6a2-8471-101d55a47a2b.png">

- セキュリティグループの設定を行って次へ進みます。

<img width="1521" alt="スクリーンショット 2017-10-30 21.44.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/71069f67-3ced-169a-5bd2-8632c2497703.png">



### ヘルスチェックの設定をする
- ヘルスチェックというのは、サーバーが生きているか確認してくれる機能のことで、生きているか確認できるパスを指定します。
- 静的サイトであれば/index.htmlでもいいと思いますが、動的サイトなどはDBに負荷がかかるかもしれないので、チェック用のパスを設定するのが良いと思います。

- 高度な設定では、間隔や何回成功・失敗で正常とするか非正常とするかの設定ができます。



<img width="440" alt="スクリーンショット 2017-10-30 21.45.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/d6d7523b-49a9-ddfe-b20b-824812766535.png">

```
ハマりポイント！！

突然サーバーが見えなくなったしエラーも返さない！！
っとなる場合がありますが、おおよそはアプリケーションエラーでヘルスチェックに失敗して自動的に非正常ステータスとなりELBがルーティングを切っている状態になります。
突然サーバーが見えなくなったしエラーも返さない場合は、再起動するのではなくELBを疑って見ましょう！！
```

### その他設定
- instanceの設定
    - ここで先ほど複数作成したEC2インスタンスを登録します。

- tagの設定をする
    - nameに対して適当なLBの名前を入れておきましょう。いつか役に立つ時がきます。
<img width="1294" alt="スクリーンショット 2017-10-30 21.45.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/7dcf344c-59c6-2d2f-a473-27112f273ad8.png">

- 確認して作成しましょう！！
- ロードバランサーが１つ追加されているとおもいます！！


## 動作確認する
- 作成後しばらくは、`unhealthy`（非正常）の状態になっていますが、ヘルスチェックが通り`active`(正常)になるとELBのAレコードでサイトが閲覧できるようになります。

### ロードバランシングされているか確認する
- この作業は大事です、できていると思いきやできてない場合がありますので確認は行いましょう

1. それぞれ全てのEC2インスタンスにSSHする、nginxのaccess.logなどを`tailf`するなどして待機します。
2. 先ほどのELBのAレコードでアクセスし、アクセスからバランシングされているかを確認する

この確認作業を行ったら、EC2インスタンスは８０番ポートは開ける必要がないですので、EC2のセキュリティグループで閉じておきます。また、ELBからのアクセスを許可するようにするため、ELBにつけているセキュリティグループのIDを設定すると良いでしょう。

## おまけ
1台であってもEC2インスタンスの前には ELB を置きましょう

EC2 インスタンスのパブリック IP に CNAME を向けて公開するのはあまりよくないです。
ElasticIPを設定していなければ、システムリブートのメンテナンスの時に、IPが変わってしまうのでDNSも変更しないといけなくなります。
ELB を置いておけば無停止でサーバを入れ替えることができるので、ロードバランサ機能が不要でも使うことがおすすめです。


## 参考記事
- https://www.tetrabit.jp/option/loadbalancer/
- https://blog.manabusakai.com/2014/09/ec2-design-pattern/