[AWS]ロードバランサーの作成とその役割

# ロードバランサーの作成

プライベートサブネット内に作成したWebサーバーはまだインターネットに公開されていないため、公開する設定を行い、Webブラウザ上で実際に接続できたか確認していきます。


## ロードバランサーの役割
私たちが日々利用しているWebサービスには、毎日多くのユーザーがサーバーにアクセスしてきます。よって１台のWebサーバーでは、ユーザーからのたくさんのリクエストに耐えられなくなり、サーバーの故障の原因となります。そこで、AWSにはWebサーバーを増やしアクセス数に応じて最適なサーバー台数を確保するスケールアウトと呼ばれる機能が備わっており、このスケールアウトを実現するのがロードバランサーと呼ばれるサービスです。

このロードバランサーには3つの役割が存在します。

### ① リクエスト分散機能
Webサーバーへのリクエストを均等に分散させて、一つのサーバーにアクセスが集中しないようにすることができます。サーバーへの負荷分散行うことで、故障を防ぐだけでなく故障が疑われるサーバーには接続せずに、正常なサーバーへの接続をするなど、可用性を実現しています。

### ② SSL処理
SSL(Secure Sockets Layer)は送受信しているデータを暗号化する技術です。よくWebブラウザのURLにある"https://~"で始まるWebサイトが、SSLを利用して通信が暗号化されています。ブラウザとサーバーのデータは、暗号化されているため、第三者からデータの傍聴と改ざんを防ぐことができます。また、暗号化や複合といった複雑な処理をWebサーバー自身でやると負荷がかかりますが、ロードバランサーには高速に処理できる機能が備わっているので、高速通信も実現できます。

### ③ 不正リクエスト対策
Webサーバーに正しいリクエストが来て、適切にユーザーとサーバー間のやりとりが行われるとは限りません。中には、悪意あるユーザーや予期せぬリクエストによってサーバーが乗っ取られることや、故障に繋がることもあります。しかしこれを解決するためにWebサーバーに不正なアクセス検知をして防ぐ処理を施しても、これはこれで負荷をかけることになり、故障の原因やサーバーからのレスポンスを悪くするなどあまり良くありません。しかし、ロードバランサーには、これらの不正なアクセス検知する機能が備わっているため、サーバーごとにセキュリティ対策を行わなくとも、効率的に不正なアクセスから守ることができます。

## AWSコンソール画面
今回は、AWSが提供しているHTTPやHTTPS通信によるアクセス分散に最適なALB(Application Load Balancer)を利用していきます。また、インフラの動作確認としてRubyを使用するため、ポート番号は3000を使います。


### ALBの作成

| 名前  | VPC | Mapping | セキュリティグループ |
|:---:|:---:|:---:|:---:|
|sample-elb|sample-vpc|subnet-(public01, 02)|default,sample-sg-elb|

![ELB作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/f1f975a1-7001-a7ce-7669-bc8804415c3b.png)

![スクリーンショット 2023-02-17 19.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/2eba59b5-c5f7-d110-1530-5e3a0f3cd052.png)

![スクリーンショット 2023-02-17 19.21.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/48726280-78ca-77be-cfac-bf181674bb49.png)

### ターゲットグループの作成

| 名前  | プロトコル | ポート | Available instances |
|:---:|:---:|:---:|:---:|
|sample-tg|HTTP|3000|sample-ec2-(web01, web02)|

ターゲットグループは、ロードバランサーからWebサーバーにアクセスする時に関係する設定を行います。ターゲットグループは複数作成することができるため、条件によってWebサーバーへのアクセスの振り分けを行うことが可能です。

リスナーの設定画面より、"Create target group"を押して、実際に作成していきます。

![ELBターゲットグループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/1db8f609-5b6e-b125-029c-3978449fb6be.png)

![スクリーンショット 2023-02-17 19.50.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/ca6e70b9-e24c-400b-c053-b0bb59a45293.png)

![ELB ターゲット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/3f65f57d-ba5e-7401-9ba3-8835f694c19e.png)

上記のように"inlude as pending below"を押して、最後に"Register pending targets"を押します。
最後に先ほど作成した"sample-tg"を選択して完了です。

# 動作確認
まずは、ターミナルを２つ開きそれぞれ以下のコマンドを入力しサーバーに接続します。

```
$ ssh web01

$ ssh web02
```
そして、それぞれにvimコマンドでindex.htmlファイルを作成します。作成したWebサーバーのAmazon Linux2には、あらかじめインストールされているPythonでHTTPサーバーを立て、まずはヘルスチェックを行います。

```
$ vim index.html(index.htmlファイルを作成)
```

```index.html
<html>
  <body>
    Sample site
  </body>
</html>
```

```
$ python -m SimpleHTTPServer 3000
```
その後、Webサーバーにヘルスチェックを断続的に行われます。ヘルスチェックとは特定のサーバー上のサービスに、作業を正常に実行できるかどうかを確認する方法です。ロードバランサーは、各サーバーにこの質問を定期的に行い、トラフィックを転送しても安全なサーバーを判断します。

コンソール画面上のターゲットグループの詳細画面で、Health statusが"healthy"になるまで、ヘルスチェックを行います。"healthy"になれば、対象のWebサーバーへリクエストがルーティングされることを意味しています。

次に、ロードバランサーの詳細画面からDNS名をコピーしブラウザに入力すると、index.htmlファイルの内容が出力されるのが確認できます。

# 参考
AWSではじめるインフラ構築入門 翔泳社出版

https://www.onamae.com/server/bepossible/ssl/

https://office110.jp/security/knowledge/technology/secure-sockets-layer

https://techmania.jp/blog/aws0005/