NLB (Network Load Balancer)の作成メモ

# 概要

NLB(Network Load Balancer)の作り方を確認した時のメモです。
確認用としてApacheを実行するEC2インスタンスを4つ作成(ap-northeast-1aに2つ、ap-northeast-1cに2つ)し、NLBでリクエストを分散させるようにします。

**参考**

* [AWS ドキュメント » Elastic Load Balancing » Network Load Balancers » Network Load Balancer とは] (https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/introduction.html)
* [AWS ドキュメント » Elastic Load Balancing » Network Load Balancers » Network Load Balancers » Network Load Balancer を作成する] (https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/create-network-load-balancer.html)

# 最終的な構成

図のようにApacheをインストールしたEC2インスタンス(AP1 ~ AP4)はPrivateサブネットに配置して、直接インターネットからアクセスできないようにし、アクセスするにはロードバランサー(NLB)を介するようにします。
Publicサブネットに配置するEC2インスタンス(Bastion)は踏み台サーバとして利用し、ssh接続のみを許可します。

![wa.png](https://qiita-image-store.s3.amazonaws.com/0/22772/abff814b-ab8e-047b-8401-09f413256b30.png)

# VPC

## Elastic IPの割り当て

Privateサブネットに配置するEC2インスタンスがインターネットにアクセスできるようにNAT Gatewayを利用するので、事前にNAT Gateway用にEIPを1つ割り当てます。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ce7429b3-adfa-a572-4c90-30332ca9983f.png)
スコープに”VPC”を選択します。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/7397a0dc-09b5-456e-adde-f5ac0eb48c72.png)
![03.png](https://qiita-image-store.s3.amazonaws.com/0/22772/a6703c44-d7cd-d03c-6d7e-174fc268a909.png)

## VPCの作成

VPCのダッシュボード上の[VPCの作成]ボタンをクリックします。
ここから作成を始めるとウィザード形式でVPCを作成することができます。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/22772/21a1077f-9bee-e0be-fad8-aec64ba155d2.png)
VPCのタイプを選択します。
今回はPublicとPrivateにサブネットを作成したいので2番目を選びます。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/22772/87357013-6e5c-3613-4c81-f742ea642f43.png)
この画面でap-northeast-1aにPublicとPrivateのサブネットを作成しました。（VPC作成後にap-northeast-1cにPublicとPrivateのサブネットを追加します。）
また、NATゲートウェイには先に割り当てたEIPを設定します。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/22772/bd0cd095-e67e-ee97-94c1-39d2a6a90232.png)

## EC2の作成

### 踏み台サーバ

ローカルPCからssh接続するためのEC2インスタンスを、Publicサブネットのap-northeast-1aに作成します。
このEC2インスタンスからPrivateサブネットに作成するApache用のEC2インスタンスにssh接続します。

**セキュリティグループ**

自PCからのみssh接続できる設定にします。
![09.png](https://qiita-image-store.s3.amazonaws.com/0/22772/2245bf46-5045-6ce2-9ae1-7622cdc2b4fb.png)

### httpサーバ

Privateサブネットのap-northeast-1a、ap-northeast-1cにそれぞれ1つずつEC2インスタンスを作成します。(最終的には2つずつ)
このEC2インスタンスは、Public DNS/IPを持たないので、インターネット側からは直接アクセスできません。

**セキュリティグループ**

踏み台サーバからのみssh接続、ロードバランサーからhttp接続できる設定にします。
![10.png](https://qiita-image-store.s3.amazonaws.com/0/22772/72e50f35-a37c-3357-fe7e-6941581eb3dd.png)

踏み台サーバからssh接続し、httpサーバをインストール、起動します。

```bash
$ sudo yum update -y
```

```bash
$ sudo yum install -y httpd
```

```bash
$ sudo systemctl start httpd
```

確認用のページとして/var/www/html/index.htmlを作成します。
{privat ip}には、そのインスタンスのprivate ipを記述しました。

```text
<html>
<head><title>{privat ip}</title></head>
<body>
<div>{privat ip}</div>
</body>
</html>
```

インスタンス内からcurlでアクセスしindex.htmlの内容が取得できることを確認します。

```bash
> curl http://localhost
```

# NLB

ロードバランサーにはNLB(Network Load Balancer)を使用します。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/22772/0a1e5a1c-a1f8-540f-728a-67f5756c76ce.png)
![12.png](https://qiita-image-store.s3.amazonaws.com/0/22772/9ab5a01c-bb2d-e605-d90d-427380603996.png)
ロードバランサーのアベイラビリティーゾーンは、Publicサブネットのap-northeast-1a、ap-northeast-1cを指定します。
![13.png](https://qiita-image-store.s3.amazonaws.com/0/22772/9f7b254b-24d8-497b-6645-fe9a563029b2.png)

## Target Groupの作成

ターゲットの種類は”ip”を選択します。
![14.png](https://qiita-image-store.s3.amazonaws.com/0/22772/628a80e6-5d80-6e60-92d7-a1c720c8ccb5.png)
ターゲット先にApacheをインストールしたEC2インスタンスのprivate ipを設定します。
![15.png](https://qiita-image-store.s3.amazonaws.com/0/22772/7b3b3080-5ada-0e1a-46a9-e8b49c9e318a.png)
ロードバランサーとターゲットグループの作成直後はステータスが"initial"ですが、
![17.png](https://qiita-image-store.s3.amazonaws.com/0/22772/7e0b62f9-b07e-df2d-36a1-6e604fd6c00a.png)
暫く(5,6分くらい)待つと設定が正しければ"healthy"に変わります。
![18.png](https://qiita-image-store.s3.amazonaws.com/0/22772/51e773b6-4fe8-c2b3-6934-0d55b2947fa6.png)

## NLBのDNS

ブラウザからロードバランサーのDNS名でアクセスできることを確認します。
DNS名はロードバランサーの説明欄で確認できます。
![20.png](https://qiita-image-store.s3.amazonaws.com/0/22772/b77ab6b3-120c-cbbc-32de-5bc73b410566.png)

一度アクセスするとDNSがキャッシュされるので、その後はキャッシュが切れるまで同じサーバへアクセスが続きます。
キャッシュをクリアするには、Firefoxの場合<kbd>Ctrl + Shift + Del</kbd>を押します。
![23.png](https://qiita-image-store.s3.amazonaws.com/0/22772/f6b76e4f-56f1-f218-ea57-2e7dcf6c06bb.png)

## httpサーバの追加

Privateサブネットのap-northeast-1aとap-northeast-1cに、それぞれ1つずつEC2インスタンスを作成しhttpdをインストール、起動します。
追加したEC2インスタンスをターゲットグループに登録します。
![19.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d3537299-be34-d943-28df-b8ae8534a4d0.png)


# Route 53

仮にRoute 53で`xxxyyyzzz.com`というドメイン名を登録し、www.xxxyyyzzz.comでアクセスできるようにするには、ドメインのAレコードにNLBのDNS名を登録します。

## NLBのDNSをAレコードで登録

* nameに`www`を入力
* Typeは`A - IPv4 address`のまま
* Aliasに`yes`を選択
* Alias Targetに`NLBのDNS`を選択

この内容で登録します。

![22.png](https://qiita-image-store.s3.amazonaws.com/0/22772/360ed57f-3825-08a4-258a-5d8a77b0ed64.png)

登録が完了すると、すぐに`wwww.xxxyyyzzz.com`でアクセスすることができます。

# 補足

## セッションマネージャー

この記事ではPublicサブネットに踏み台サーバを用意しましたが、AWS Systems Managerのセッションマネージャーを利用すると、ブラウザからPrivateサブネットのインスタンスにログインすることができます。
![24.png](https://qiita-image-store.s3.amazonaws.com/0/22772/3a7f8356-5d5e-09f1-4947-00d3dad2164e.png)
ログインしたいインスタンスを選択し[セッションの開始]ボタンをクリックします。
![25.png](https://qiita-image-store.s3.amazonaws.com/0/22772/b1b7074b-2d03-78dd-72fe-f15b178aedf9.png)

ssm-userというユーザーで開始されますが、ec2-userへスイッチすることもできます。

```bash
sh-4.2$ whoami
ssm-user
sh-4.2$ sudo su - ec2-user
Last login: Mon Sep 24 08:48:46 UTC 2018 on pts/0
Last failed login: Mon Sep 24 08:52:28 UTC 2018 on pts/0
There was 1 failed login attempt since the last successful login.
[ec2-user@ip-10-0-1-201 ~]$
```