Load Balancerの仕組み、構成

# TL;DR
https://www.kanzennirikaisita.com/posts/aws-alb-concepts
![スクリーンショット 2022-08-21 18.05.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276522/37bcc219-a27e-2fb8-2486-c4126b9a4abf.png)

# ロードバランサー

負荷分散システム。トラフィックを複数のターゲット（EC2 インスタンス、コンテナ、IP アドレス、Lambda 関数、仮想アプライアンスなど）に分散させることで以下のメリットがある

## 特徴
### 高可用性
多数のAZに配布したEC2インスタンスなどにトラフィックを分散するので、一つのAZがダウンしてもユーザーのアプリケーションは問題なく使える。

### 統合性

　ELBはいろんなAWSサービスと一緒に使用できる

- Auto Scaling：拡張性管理及びワークロード分散業務を効率的に可能。
- Route 53：一緒に使うことでDNS失敗に対応できる。
### 安全性
- 統合認証管理、SSL復号化、ポートフォワーディングなど多数のセキュリティ機能を提供
- ELB用セキュリティグループを生成して流入·流出するトラフィックを効果的にコントロール可能


# リスナー

プロトコルやポートを設定することでロードバランサーへの接続リクエストをチェックするもの

> A listener is a process that checks for connection requests, using the protocol and port that you configure.
> 

リスナーに対して定義したルールにより、ロードバランサーが登録済みのターゲットにルーティングする方法が決まる。

１つのリスナーに対して複数のターゲットグループを指定することが可能

```
Protcol: HTTP
Port: 80
DefaultAction:
  Type: forward
  TargetGroupArn: !Ref TargetGroup

上記の設定であれば、「HTTPプロトコル & ポート番号80」でのロードバランサーへのリクエストは、
「!Ref TargetGroup」へ転送される
```

[https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#forward-actions](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#forward-actions)

## Listener Configuration

プロトコルにHTTPSを指定することで暗号化および復号の作業をロードバランサーに任せることができる。HTTPSを使用する場合には少なくとも１つのSSLサーバー証明書をリスナーにデプロイする必要がある

## Listener Rles
リスナーはそれぞれデフォルトのルールを持っているが、独自にルールを追加することもできる

ルールは
- 優先度
- １つ以上のアクション
- 1つ以上の条件で構成される

### Default Rules

リスナーを作成するとき、デフォルトのルールのアクションを定義する
デフォルトのルールには条件を付与することはできない
リスナーに設定されたいずれのルールも満たさない場合にデフォルトルールのアクションが実行される

### Rule Priority（優先度）
ルールは優先度をもち、優先度の低い順に評価される（デフォルトルールが最後に評価される）
デフォルトルール以外のルールの優先度はいつでも変更可能

### Rule Actions（アクション）
ルールのアクションはタイプ、順序、アクションを実行するために必要な情報をもつ

[https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#rule-action-types](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#rule-action-types)

### Rule Conditions（条件）

ルール条件はタイプと設定情報をもつ

条件が満たされると、そのアクションが実行される

[https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#rule-condition-types](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#rule-condition-types)

## Rule Action Type
アクションの種類

#### `authenticate-cognito`

Use Amazon Cognito to authenticate users.

#### `authenticate-oidc`

Use an identity provider that is compliant with OpenID Connect (OIDC) to authenticate users.

####  `fixed-response`

ステータスコードを返す

You can use this action to return a 2XX, 4XX, or 5XX response code and an optional message.

The count of successful `fixed-response` actions is reported in the `HTTP_Fixed_Response_Count` metric

#### `forward`
一番良く使うのがこれ

リクエストを１つ以上のターゲットグループにルーティングする
複数のターゲットグループを指定した場合は、各ターゲットグループに重みを指定する必要がある

> If you specify two target groups, one with a weight of 10 and the other with a weight of 20, the target group with a weight of 20 receives twice as many requests as the other target group.
> 

デフォルトでは、セッション情報を維持しない。
セッションが維持されることを保証するためには、ルールに対してターゲットグループのstickinessを有効化する必要がある。

これにより、ロードバランサーが最初にターゲットグループにルーティングする際、AWSALBTGというクッキーを生成し、クライアントへのリスポンスに含める。
このクッキーには、ルーティングされたターゲットグループの情報が含まれており、クライアントがこのクッキーを含めることによってリクエストは Cookie で指定されたターゲットグループにルーティングされる

Application Load Balancer は、URL エンコードされた Cookie 値をサポートしていない

[https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html#forward-actions](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html#forward-actions)

#### `redirect`

Redirect requests from one URL to another.

[https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html#redirect-actions](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html#redirect-actions)

## Rule Condition Type

- `host-header`
- `http-header`
- `http-request-method`
- `path-pattern`
- `query-string`
- `source-ip`

[https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#rule-condition-types](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#rule-condition-types)

1 つのルールにつき最大 5 つの一致評価を指定できる

---

# ターゲットとターゲットグループ

リスナーのルールを作成するときに、ターゲットグループと条件が指定される

> つまり、結局ターゲットにリクエストを送るのは、ロードバランサーであるということ。リスナーやターゲットグループはロードバランサーが受け取ったリクエストをどこに転送するのかを決める時に判断するコンポーネントである。
> 

リスナーで設定されたルールの条件を満たした場合にルールと同時に指定されたターゲットグループへルーティングされる。

ターゲットグループの中には複数のターゲットが含まれる。これらの複数のターゲットにトラフィックが分散される

ロードバランサーのヘルスチェック設定は、ターゲットグループ単位で定義する

リスナーのルールでターゲットグループを指定すると、ロードバランサーは、ロードバランサーで有効なアベイラビリティーゾーンにある、ターゲットグループに登録されたすべてのターゲットの状態を継続的にモニタリングします。

ターゲットグループにターゲットを登録するとデフォルトでは、ロードバランサーはターゲットグループに指定したポートとプロトコルを使用して登録済みターゲットにリクエストを送信する。

ターゲットグループに各ターゲットを登録するときに、このポートを上書き可能！。

## **ルーティング設定**

デフォルトでは、ロードバランサーは**ターゲットグループ**の**作成時**に指定した**プロトコル**と**ポート番号**を使用して、リクエストをターゲットにルーティングする

または、ターゲットグループへの登録時にターゲットへのトラフィックのルーティングに使用されるポートを上書きすることもできる

　

## Target Type

ターゲットグループを作成するとき、そのターゲットの種類を指定する

ターゲットグループを作成した後で、ターゲットの種類を変更することはできない

使用可能なターゲットの種類と `ip` の場合使用可能なIPアドレス

## IP アドレスタイプ

[https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-ip-address-type](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-ip-address-type)

## **プロトコルバージョン**

[https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-protocol-version](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-protocol-version)

## **登録済みターゲット**

ロードバランサーは、クライアントにとって単一の通信先として機能し、正常な登録済みターゲットに受信トラフィックを分散する

ターゲットの登録処理が完了し、最初のヘルスチェックに合格するとすぐに、ロードバランサーは新しく登録したターゲットへのリクエストのルーティングを開始します

ターゲットを登録解除するとターゲットグループから削除されるが、ターゲットにそれ以外の影響は及ばない。登録解除するとすぐに、ロードバランサーはターゲットへのリクエストのルーティングを停止する。ターゲットは、未処理のリクエストが完了するまで `draining`状態になる

[https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#registered-targets](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#registered-targets)

## **ターゲットグループの属性**

[https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-attributes](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-attributes)

## **ルーティングアルゴリズム**

[https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#modify-routing-algorithm](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#modify-routing-algorithm)

## **登録解除の遅延**

ELB は、登録解除するターゲットへのリクエストの送信を停止する。デフォルトでは、ELB 登録解除プロセスを完了する前に 300 秒待って、ターゲットへ処理中のリクエストが完了するのを助ける

登録解除するターゲットの初期状態は `draining`

録解除の遅延が経過すると、登録解除プロセスは完了し、ターゲットの状態は `unused` になる

登録解除するターゲットに未処理のリクエストやアクティブな接続がない場合は、ELB は登録解除の遅延時間が経過するのを待たずに、即時登録解除プロセスを完了する。ただし、ターゲットの登録解除が完了しても、ターゲットのステータスは、登録解除の遅延タイムアウトの期限が切れるまで `draining`と表示される。タイムアウトの期限が切れると、ターゲットは `unused`状態に移行する。

**ターゲットグループに登録解除の遅延という設定項目があります。 ターゲットの登録解除中に未処理のリクエストが完了するまで待つ時間。この時間中、ターゲットの状態はストリーミングになります。 インスタンス切り離し後、ここで設定した時間だけターゲットはdraining状態になります。 初期設定では300秒となっています。 つまり切り離してから300秒間は未処理のリクエストが完了するまで待機します**

[https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#deregistration-delay](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#deregistration-delay)