【NLB】Network Load Balancer - 誰でも分かる構築手順

#1.はじめに
AWSの提供する負荷分散サービスであるELBの中で、レイヤー4に対応し、TCP/UDPトラフィックの負荷分散を行うNLBの構築手順について解説します。
ELBの構築手順はAWSサービスの中でも簡単な方ですが、やはり一度構築を経験しておくことは、業務等で素早くELBを立てなければならない場合にとてもスムーズに構築できるようになるのでおすすめです。
では、早速構築手順について解説していきたいと思います。

#2.概要

《本記事の流れ》
手順１：ターゲットグループの作成
手順２：NLBの作成
手順３：動作確認

前提事項：最低限インターネットと通信できるEC2インスタンスを2, 3つ作成しておくこと

《本記事の目標》
NLBを構築し、複数のEC2インスタンスへのトラフィックを負荷分散する
また、あくまでNLBを使用しての負荷分散の動作確認までを目的としているため、NLB、及びターゲットグループへの設定は必要最低限のみとする

#3.ターゲットグループの作成
NLBの作成前にまずはNLBに紐付けるターゲットグループを作成します。

AWSマネジメントコンソールの上部検索窓にて、『EC2』と検索します。
サービスの下に表示される『EC2』をクリックし、EC2マネジメントコンソールを開きます。
![EC2検索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/b0076ef0-5b3a-2f29-535d-df2a7990b0b3.png)

EC2マネジメントコンソールの左ペインを下にスクロールし、『ロードバランシング』＞『ターゲットグループ』をクリックし、ターゲットグループマネジメントコンソールを開きます。
ターゲットグループマネジメントコンソールにて、右上の『Create Target Group』をクリックし、TG作成画面に進みます。
![TG作成するとこ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/d4c0949b-0e3f-817c-175f-54bda6f54c58.png)

<b>【グループの詳細を指定する】</b>

《基本構成》
負荷分散するターゲットの基本構成を設定します。
以下のパラメータを設定してください。
'**************************************************
・ターゲットタイプを選択してください ⇒ 『インスタンス』
・ターゲットタイプグループ名 ⇒ ※任意の名前を入力してください
・プロトコル：ポート ⇒ HTTP：80
・VPC ⇒ ※ターゲットのインスタンスが所属するVPCを選択して下さい
・プロトコルバージョン ⇒ HTTP1
'**************************************************
![TG_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/f01ae54f-a620-f7d4-7b8d-d7094f0df7df.png)
![TG_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/c944ec8e-a1df-b982-cd83-58e99691f2b4.png)


《ヘルスチェック》
デフォルトのままで問題ありません。

《タグ》
デフォルトのままで問題ありません。

<b>【ターゲットを登録する】</b>

《利用可能なインスタンス》
ターゲットへ登録可能なインスタンスの一覧が表示されるので、負荷分散させるインスタンスにチェックを入れ、『Include as pending below』ボタンをクリックしてください。
![利用可能インスタンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/e89f1a73-ec3a-a115-5d43-5eca5f7ed82d.png)

《Targets (*)》
ターゲットへ登録するインスタンス一覧が表示されます。
確認し、問題がなければ右下の『Next』をクリックし、ターゲットグループを作成します。
![ｔｇ一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/8a97d17e-cae4-e1a0-6c42-106568b05bd7.png)

#4.NLBの作成
ではNLBの作成に入ります。

EC2マネジメントコンソールの左ペインを下にスクロールし、『ロードバランシング』＞『ロードバランサー』をクリックし、LBマネジメントコンソールを開きます。
LBマネジメントコンソールにて、左上の『ロードバランサー』をクリックし、LB作成画面に進みます。
![LBの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/33d88213-00dc-8551-a3a5-f6c63fb19133.png)
<b>【ロードバランサーの種類の選択】</b>
この画面では、作成するLBのタイプを選択します。
LBの種類は『Network Load Balancer』を選択します。
![LB_type.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/486e11bb-14f6-e2d1-7244-1dea0c4cf25a.png)
<b>【ネットワークロードバランサーを作成する】</b>
《基本構成》
ロードバランサーの基本構成を設定します。
以下のパラメータを設定してください。
'**************************************************
・ロードバランサー名 ⇒ ※任意の名前を入力してください
・スキーム ⇒ インターネット向け
・IPアドレスタイプ ⇒ IPv4
'**************************************************
![基本構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/07eeccb8-7738-065d-c186-5e4b77cdc062.png)

《ネットワークマッピング》
NLBとどのネットワーク帯をマッピングするかを設定します。
ターゲットグループ作成時にターゲットに追加した対象リソースが所属しているVPC、サブネットを指定してください。
![マッピング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/3cfc1aa0-730c-5b59-2816-5c68641f2b06.png)

《リスナーとルーティング》
ここではターゲットグループを指定します。
先程作成したターゲットグループを指定し、プロトコルとポートはそれに合わせて設定してください。
![リスナーとルーティング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/759f2ee0-22f7-af30-a4c6-1da4bb92bb8f.png)

《概要》
上記手順で設定したパラメータがまとめて表示されますので、今一度間違いがないか確認してください。
確認の結果問題なければ、右下の『ロードバランサーを作成する』をクリックしてください。
ロードバランサーマネジメントコンソールに戻りますので、作成したLBが表示されていることを確認してください。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/ce16bfdb-63f5-4c8f-351d-7753fc515ac1.png)

#5.動作確認
##5-1.NLBの負荷分散アルゴリズムについて
NLBの負荷分散は、トランスポートレイヤーによって行われます。
また負荷分散アルゴリズムにはフローハッシュルーティングアルゴリズムが採用されており、各パラメーターから算出されたハッシュ値に基づいて分散先が決められます。
なので片方のサーバに通信トラフィックが集中したかと思えば、急にもう片方にトラフィックが集中したり、ロードバランサーとしては中々使いづらく感じてしまいます...

##5-2.負荷分散テスト時の注意点
負荷分散においてNLBを使用すると負荷をかけるクライアントでDNSレコードをキャッシュしてしまいますので、テスト時にトラフィック先を変えたい時はブラウザか何かでキャッシュをクリアする必要があります。

##5-2.負荷分散テスト
今回は使用するプロトコルを80番で指定していますので、NLBのDNS名をブラウザで打ち込んでhttpアクセスをして負荷分散を確認してみましょう。

ロードバランサーマネジメントコンソールから先程作成したNLBにチェックを入れ、「基本」から「DNS名」をコピーします。
コピーした「DNS名」をブラウザに打ち込みターゲットグループへ登録したターゲットへhttpアクセスをします。
![LB_DNSName.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/aac90fb0-f5be-441e-17d6-64b2d6d08b02.png)

あらかじめターゲットにAZ-aとAZ-cと分けて設定していたhttpページが表示されました。
![AZ-c_2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/3928b11d-b95c-abb1-fa01-c933d16bcad6.png)


このまま「F5」を連打してもフローハッシュルーティングアルゴリズムによって負荷分散されないので、ブラウザ設定からキャッシュをクリアして再アクセスしてみます。
すると別AZのページが表示されました。
![AZ-A_2021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/66bf4759-f224-966e-2fc5-8dd95f31f5f6.png)


これで無事負荷分散ができていることを確認しました。
※httpページを設定していない場合は、ロードバランサーマネジメントコンソールから「アクセスログ」を有効化し、S3にできたログからアクセス可否を確認してください。

#6.まとめ
以上がNLBの構築手順になります。
大した手順ではないですが、一度構築をしたことがあるのかないのかでは実務での作業において大きな差が出ます。
インフラに身を置くものでしたら数回程度はNLBで遊んでおくことをおすすめします。