NLBのターゲットとしてALBを指定する

# 概要

ターゲットグループのタイプとして ALB を指定できるようになったことで、ALB のプライベート IP アドレスの変化への対応がマネージドになりました。この記事ではリソースの作成方法を記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/c50f3023-8e3d-73fc-afae-1b3b23c011f8.png)

注意点としては、この構成では ALB で SSL を終端させることはできないということです。ALB で HTTP リスナーを HTTPS リスナーにリダイレクトするように設定しても、NLB を経由した場合トラフィックは ALB の HTTPS ポートに到達しません。したがって TLS 暗号化をロードバランサーにオフロードしたい場合、NLB の TLS 終端を使用する必要があります。

ただし NLB に TLS:443 ではなく TCP:443 リスナーを設定することで、ALB で TLS 終端させることができます。このことに関する記事を書きました。

https://qiita.com/quryu/items/05a7dabf021fac06ab53

# ALB を作成する

ロードバランサー名を入力し、スキーム、IP アドレスタイプを選択します。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/156d7687-b464-4dcf-f217-afd3f06559bd.png)

サブネットは最低 2 つ選択する必要があります。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/c2970e01-723e-f475-2ddb-65a21b6d5afa.png)

セキュリティグループを選択します。画像中のセキュリティグループ「nlb-alb-sg」は以下の通りです。

|インバウントルール|アウトバウンドルール|
|---|---|
|ポート：80, ソース：0.0.0.0/0|ポート：すべて, ソース：0.0.0.0/0|

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/05a238fc-1b39-3449-84cd-2a1a2b55abd0.png)

リスナーとルーティングの設定は以下の通りです。転送先にはインスタンスタイプのターゲットグループを選択し、ターゲットには Web サーバを指定します。この記事ではここで指定するターゲットグループの作成方法については記述しませんが、以下に設定情報を記載します。

|ターゲットタイプ|プロトコル|ポート|ヘルスチェックプロトコル|ヘルスチェックパス|プロトコルバージョン|
|---|---|---|---|---|---|
|インスタンス|HTTP|80|HTTP|/|HTTP1|

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/dae94fa1-611e-c1cb-8519-4c91f8f94280.png)

設定を確認します。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/ffe37656-b7f4-ea26-7a23-dc573555284c.png)

作成後、リダイレクト用のリスナーを追加します。これにより、HTTP リクエストを 443 ポートに転送し、その後の通信は HTTPS で行うことができます。作成した ALB を選択し、「リスナーの追加」をクリックします。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/671ddb17-ac87-5751-568c-c22282c3ef39.png)

以下のようにリダイレクト先を指定します。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/f724e317-a464-0658-6314-6cf463b9fa33.png)

最後にログを有効化するために、「アクション」→「属性の編集」→「アクセスログの有効化」の順にクリックします。

## 動作確認

ブラウザを開き、以下を URL 欄に貼り付けます。`alb-897482902.ap-northeast-1.elb.amazonaws.com` は ALB の DNS 名です。

`http://alb-897482902.ap-northeast-1.elb.amazonaws.com/`

以下にログの一部を記載します。HTTP リクエストが HTTPS にリダイレクトされていることがわかります。（172.31.25.134 は ALB のプライベート IP アドレス）

type|client:port|target:port|elb_status_code|target_status_code|request
---|---|---|---|---|---
http|xxx.xxx.xxx.xxx:60225|-|301|-|GET http:\//alb-897482902.ap-northeast-1.elb.amazonaws.com:80/ HTTP/1.1
h2|xxx.xxx.xxx.xxx:60234|172.31.25.134:80|200|200|GET https:\//alb-897482902.ap-northeast-1.elb.amazonaws.com:443/ HTTP/2.0

ALB のログに関しては以下に詳細が載っています。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format

以下は Wireshark のキャプチャです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/e339b2ac-4af7-078d-e9be-53266738f6ae.png)

# ターゲットグループを作成する

ターゲットタイプが ALB であるターゲットグループを作成します。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/a5562211-7203-b093-39b6-c09712a51a4a.png)

ヘルスチェックについては以下のように設定します。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/a1b890c4-1303-2bdb-dba2-02b2d4c335dc.png)

先ほど作成した ALB を選択します。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/8b73270e-0de7-b935-94c3-475682ed91fc.png)

# NLB を作成する

NLB を選択します。

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/dac6f8f1-45e3-480c-be6c-9a82c5788bce.png)

NLB では最低 1 つの AZ を選択します。インスタンスが存在するサブネットを選択する必要があります。

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/f87ec1f3-4e48-4693-21e0-a438e1757546.png)

リスナー、ルーティングは以下のように設定します。転送先には先ほど作成した ALB タイプのターゲットグループを選択します。

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/17603d1f-be9a-2c55-ed66-26233983162d.png)

設定を確認します。

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/764b77e0-27fc-3e3c-90a6-78aabc4c3407.png)

## 動作確認

ブラウザを開き、以下を URL 欄に貼り付けます。`nlb-dae1232ee0feabdb.elb.ap-northeast-1.amazonaws.com` は NLB の DNS 名です。

`http://nlb-dae1232ee0feabdb.elb.ap-northeast-1.amazonaws.com`

以下は ALB のログです。ALB の HTTPS リスナーには到達していないことがわかります。

type|client:port|target:port|elb_status_code|target_status_code|request
---|---|---|---|---|---
http|xxx.xxx.xxx.xxx:60921|-|-|301|GET http:\//nlb-dae1232ee0feabdb.elb.ap-northeast-1.amazonaws.com:80/ HTTP/1.1

# ALB のリスナーを変更する

以下のように、ALB の HTTP リスナーのルールをリダイレクトではなくインスタンスのターゲットグループに変更します。

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/cd2b98f8-45b9-e6ec-59dc-fe4ecb35dc28.png)


その後、NLB の 40 番ポートにアクセスすると、ALB タイプのターゲットグループに転送され、最終的にインスタンスのターゲットグループに転送されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/c4a06044-22e7-a1c0-f128-310c8b987ceb.png)

ログは以下の通りです（172.31.25.134 は ALB のプライベート IP アドレス）。

type|client:port|target:port|elb_status_code|target_status_code|request
---|---|---|---|---|---
http|xxx.xxx.xxx.xxx:61358|172.31.25.134:80|200|200|GET http:\//nlb-dae1232ee0feabdb.elb.ap-northeast-1.amazonaws.com:80/ HTTP/1.1


# NLB で TLS 終端を設定する

ここではインスタンスタイプのターゲットグループを作成し、NLB の TLS リスナーに指定します。

![nlb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/1b1db376-e2f6-712a-4975-7d7805788da7.png)

## 動作確認

NLB の DNS 名に HTTPS でアクセスし、Web コンテンツを取得できることを確認します。

![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/e59caf8c-df90-afd5-3f09-1d768ae8076d.png)

以下は Wireshark のキャプチャです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/6dcb0671-b300-0c23-6dde-14e51cc5afd8.png)


# 参考記事

https://aws.amazon.com/jp/blogs/news/application-load-balancer-aws-privatelink-static-ip-addresses-network-load-balancer/

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/application-load-balancer-target.html

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format