【AWS】Application Load Balancerを解説【サービス解説】

## はじめに
AWSにはロードバランサーと呼ばれるサービスがいくつかありますが、今回はその中のApplication Load Balancer(ALB)について解説します。
## ELBの特徴
・書くELBの特徴についてはここでは省略しますが、AWSのコンソールにとてもよくまとまっているページがありましたので、その画面キャプチャを載せておきます
![ELBの特徴.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/391feb28-b0b2-dc42-26f2-3fa0478c5afd.png)


## Application Load Balancer(ALB) の主な特徴
### レイヤー7のロードバランシング
ALBはアプリケーション層での負荷分散を提供します。これはHTTPおよびHTTPSトラフィックに対応しており、トラフィックを複数のターゲットに分散させることができます。
### 柔軟なリスナールールとアクションの設定が可能
パスベースおよびホストベースのルーティングをサポートし、リクエストのパスやホストに基づいて異なるターゲットグループにトラフィックを分散させることができます。これにより、マイクロサービスアーキテクチャをサポートできます。
### SSL/TLS終端
ALBはSSL/TLS終端をサポートし、クライアントとの間で暗号化を行います。AWS Certificate Manager (ACM)を使用してSSL/TLS証明書を管理できます。
### セッションの保持
スティッキーセッションを有効にして、同じクライアントが常に同じターゲットに接続されるようにします。これにより、セッションアフィニティが必要なアプリケーションで利用できます。
### コンテナおよびLambdaのサポート
ALBはAmazon ECS、EKS、およびAWS Lambdaと連携して、コンテナとサーバーレスなアプリケーションにトラフィックをルーティングできます。
### ヘルスチェック
ターゲットのヘルスを監視するためのカスタムヘルスチェックを設定できます。ヘルスチェックが失敗した場合、ALBは自動的に健康でないターゲットをバックエンドから削除します。
### Auto Scalingの統合
ターゲットグループとの統合により、Auto Scalingグループを使用して動的にターゲット数を変更できます。これにより、負荷の変動に柔軟に対応できます。
### ログとモニタリング
ALBはアクセスログを取得し、CloudWatch Metricsを使用してトラフィックのモニタリングが可能です。

## ALBの基本コンポーネント
・ALBには以下のコンポーネントで構成されています

|ルール  |説明  |
|---|---|
|リスナー|クライアントからのリクエストを受け取り、設定されたルールをもとにどのターゲット対してどのようなアクションを行うかを決定する|
|リスナールール|リクエストのプロトコルやヘッダーの内容、IPアドレスなどをもとにどのアクションを行うかを設定する|
|リスナーアクション|ルールに合致したリクエストに対してリダイレクトやレスポンスを返したりする|
|ターゲット|アクションが行われる先でEC2インスタンスやLambda関数が該当する|


## リスナーとアクション
ALBのコンポーネントの中には「リスナー」というものがあり、これに対してルール(受け取るリクエストの分類)やアクション(リクエスト受信後に何をするか)を設定することで柔軟なリスナールールとアクションが可能です
### リスナールール
リスナールールには以下のような設定が可能です
|ルール  |説明  |
|---|---|
|host-header(ホストベース)  |ホスト名によってアクションを設定する。例えば、example.com のリクエストを一つのターゲットグループに、subdomain.example.com のリクエストを別のターゲットグループに転送する。各文字の最大サイズは128文字。  |
|path-pattern(パスベース)  |パスに一致するリクエストを異なるターゲットグループに転送する条件を指定できます。例えば、/api/* のパスに一致する場合はAPIサービスのターゲットグループに転送するなどが考えられます。  |
|http-header(ヘッダーベース)  |特定のカスタムヘッダーが存在する場合やその値が一致する場合に、異なるターゲットグループに転送する。  |
|http-request-method(HTTPメソッドベース)  |HTTPメソッド（GET、POSTなど）によってルールを作る。例えば、GETメソッドのリクエストを一つのターゲットグループに、POSTメソッドのリクエストを別のターゲットグループに転送する。  |
|query-string(クエリ文字ベース)  |キー/値のペアまたはクエリ文字列内の値に基づいてリクエストを別のターゲットグループに転送する。(*および?)のワイルドカード文字がサポートされている。最大サイズは128文字。  |
|source-ip(送信元IPベース)  |リクエスト元のIPアドレスに基づいて異なるターゲットグループに転送する。  |
### アクション
リスナーアクションには以下のような設定が可能です
|ルール  |説明  |
|---|---|
|forward (転送)  |リクエストを指定されたターゲットグループに転送します。これは通常、アプリケーションの実際のサーバーまたはサービスにリクエストを送信するために使用されます。  |
|redirect (リダイレクト)  |リクエストを別の場所にリダイレクトします。これは、HTTPSへのリダイレクトや異なるドメインへのリダイレクトなど、クライアントを異なる場所に誘導するために使用されます。  |
|authenticate-cognito (Cognito認証)  |Amazon Cognitoを使用して認証を行います。リクエストが認証されていない場合、ユーザーをCognitoのログインページにリダイレクトします。  |
|authenticate-oidc (OIDC認証)  |プロバイダを使用して認証を行います。OIDC認証が必要な場合、ユーザーをOIDCプロバイダの認証フローに誘導します。  |
|fixed-response (固定レスポンス)  |固定のレスポンスを返します。これは、特定のエラーに対する固定のエラーページや、特定の条件下での固定の応答を提供するために使用されます。  |

## ターゲット
ターゲットには以下のターゲットが選択可能です
※選択肢にALBが入っていますが、これはNLBからのターゲット指定に選択できますが、ALBからALBをターゲットには指定できません。
![ターゲットグループ１.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/ce3b1e84-be1c-e6e6-9f29-a9ca0e77d353.png)

## ALBを利用したアーキテクチャのパターン
### ①NLBと組み合わせたアーキテクチャ
#### <構成①インターネットからのアクセスに利用したパターン>
・上記の通り、ALBは柔軟なリスナールールとアクションの設定が可能である一方で大量のリクエストの処理にはNLBの方が向いています。
・NLBのターゲットとしてALBを指定することで大量のリクエストをNLBで処理しつつ、ALBの柔軟なルールとアクションの設定ができます。
![NLB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/26905647-a766-6914-5b72-95f74d7574bd.png)

#### <構成②プライベートなアクセスに利用したパターン>
・ALBではIPアドレスが固定できない一方で、NLBでは固定IPが実現できます。NLBをALBの前に置くことで実質的にALBでもIPが固定された状態が実現できます。
・VPCエンドポイントではIPアドレス指定でサービスにアクセスするためNLB+ALBの構成を利用することでインターネットからのアクセスがないプライベートリンクでALBのターゲットのサービスを利用できます。
![NLB2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/42336e45-844e-f5fe-5236-aea7d5a57405.png)

#### ＜この構成のその他の特徴＞
|利点  |説明  |
|---|---|
|アプリケーションのレイヤーごとの負荷分散|ALBはアプリケーションレイヤーで負荷分散を行います。HTTPやHTTPSトラフィックを理解し、リクエストのヘッダーやコンテンツに基づいてルーティングを実行できます。一方で、NLBはTCPやUDPレベルで動作し、IPアドレスやポートに基づいて負荷分散を行います。これにより、異なるプロトコルや要件に対応できます。|
|マイクロサービスアーキテクチャ|ALBを使用して各マイクロサービスへのトラフィックを分散し、NLBを使用してバックエンドのマイクロサービス間の通信を処理することができます。このような構成では、アプリケーション層での柔軟な負荷分散と、ネットワーク層での高効率な通信が可能です。|
|TLS終端の分離|ALBがTLS終端を行い、クライアントとのセキュアな通信を処理します。NLBは非常に高いスループットで動作し、バックエンドのサーバーとの間で安全で高速な通信を提供します。このような構成では、TLSの処理負荷を分散し、バックエンドでの通信性能を最適化できます。|
|異なるプロトコルの利用|ALBはHTTP/HTTPSプロトコルをサポートしていますが、NLBはTCP/UDPプロトコルをサポートしています。特定のアプリケーションやサービスがHTTP/HTTPS以外のプロトコルを必要とする場合、ALBとNLBを組み合わせて使用することが適しています。|
### ②GlobalAccerelatorと組み合わせたアーキテクチャ
・世界中にグローバルなサービスを提供している場合で高レイテンシーを求められている場合、GlobalAccerelatorがよく使われます
・GlobalAccerelatorは静的IPアドレスもしくは独自IPアドレスの持ち込み (BYOIP) が可能であるため、NLBと同じくALBへの固定IPの提供が可能になります。
![GlobalAccerelator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/fae7cc7f-c28b-0c04-49b2-9818255b6465.png)


#### ＜この構成のその他の特徴＞
|利点  |説明  |
|---|---|
|高可用性と冗長性|AWS Global Acceleratorは複数のAWSリージョンにわたってトラフィックを配信し、ALBは各リージョン内で冗長な構成を提供します。これにより、特定のリージョンでの障害が発生した場合でもトラフィックが他のリージョンに自動的に切り替わります。|
|グローバル負荷分散|Global Acceleratorは、クライアントからのリクエストを最適なAWSリージョンに転送することができます。これにより、ユーザーにとって最適な応答時間を提供し、負荷を分散します。ALBは各リージョン内でリクエストを適切なターゲットに分散します。|
|ダウンタイムの最小化|ALBがあるリージョンで障害が発生した場合でも、Global Acceleratorは他の正常なリージョンにトラフィックを自動的に切り替えることができます。これにより、ダウンタイムが最小化され、サービスの可用性が向上します。|
|地域ごとのルーティングの制御|Global Acceleratorを使用することで、異なる地域またはクライアントに対して異なるALBエンドポイントを割り当てることができます。これにより、地域ごとに異なるバージョンのアプリケーションを提供するなど、ルーティングを柔軟に制御できます。|
|セキュリティ|Global Acceleratorは、DDoS攻撃からの保護やTLS終端をサポートするなど、セキュリティ機能も提供します。ALBはセキュリティグループやネットワークACLを使用してセキュリティを確保します。このように、両者を組み合わせることで包括的なセキュリティ対策が可能です。|