静的なIPアドレスを持つNLBがTLS Terminationに対応してアクセスログも出力可能に!
大栗です。
Network Load Balancer(NLB)はIPアドレスが固定で、秒間数百万リクエストでも簡単にスケーリングするロードバランサーですがTCPのバランシングを行うだけでTLSのTerminationは行なえませんでした。アップデートによりTLSのTerminationが可能になり、アクセスログも出力可能になりました。
- New – TLS Termination for Network Load Balancers
- Network Load Balancer Now Supports TLS Termination
- TLS Listeners for Your Network Load Balancer
NLBのTLS Termination
TCPに対するTLS Terminationは旧世代のロードバランサーであるClassic Load Balancer(CLB)では可能でしたが、現行世代のALB/NLBでは対応していませんでした。今回のアップデートによりCLBしかサポートしていなかった重要な機能が移行されたことになります。
TLS Terminationは元々Application Load Balancer(ALB)にもありますが、NLBの場合は以下のような利点があります。
- X-Forwarded-Forヘッダを見ずにアクセス元IPアドレスが分かる。(ターゲットがインスタンスの場合)
- 大規模なトラフィックでも暖気が不要
- アクセスするIPアドレスが固定
IPアドレスの固定化はALBを使った場合でもAWS Global Acceleratorで可能でしたが、別途料金がかかり機能過多でした。
料金
NLBの料金は以下の通り(東京リージョンの場合)で変更はありません。
- 0.0243USD/Network Load Balancer 時間 (または 1 時間未満)
- 0.006USD/LCU 時間 (または 1 時間未満)
しかしTLS Terminationの場合のLCUの定義が異なっているのでご注意下さい。
- 今までの場合(非TLS)
- 1 秒あたり 800 個の新しい非TLS接続またはフロー
- 100,000 個のアクティブな非TLS接続またはフロー (1 分あたりのサンプル)
- 毎時1GB
- TLSの場合
- 1 秒あたり 50 個の新しいTLS接続またはフロー
- 3,000 個のアクティブなTLS接続またはフロー (1 分あたりのサンプル)
- 毎時1GB
やってみた
東京リージョンを前提として実際に動作確認してみます。
基本的な作業は、初期のリリースと変わっていません。変わっている部分にポイントを絞って解説します。
以下の流れで実施します。
- Elastic IPの割り当て
- TLS証明書(ACM)の発行
- アクセス先Webサーバの準備
- ターゲットグループの作成
- NLBの作成
- DNSの設定
- アクセス確認
Elastic IPの割り当て
事前にElastic IPを2個割り当てておきます。
TLS証明書(ACM)の発行
TLSを利用するために証明書をCertificate Manager(ACM)を使って発行します。今回はDNSでドメイン認証を行いました。ACMでの証明書発行の詳細は以下のリンクを参照下さい。
アクセス先Webサーバの準備
アクセス先のWebサーバを用意します。ここではAmazon Linux 2でEC2を起動してApache HTTP Serverを動作させます。
まずはEC2を起動します。ここで、設定するセキュリティグループに注意します。NLBはセキュリティグループを設定できず、ターゲットとなるEC2でアクセス制御を行います。そのためEC2に設定するセキュリティグループでNLBのアクセス元IPアドレスについて開放します。しかしTLS Terminationの場合NLBが受けるポートとEC2が受けるポートが異なるため設定がややこしくなります。
以下のように、受け付けるポートとIPアドレスの設定が異なるので混乱しそうですので注意して下さい。
- プロトコル/ポート範囲: EC2が受け付けるポート(443/tcpではなくは80/tcp)
- ソース: NLBが受けるIPアドレス(クライアントのIPアドレス)
EC2にログインしてApacheをインストールします。
$ sudo yum install -y httpd
アクセスするページを作成します。ここではプライベートIPアドレスを表示します。
$ curl -s http://169.254.169.254/latest/meta-data/local-ipv4 | sudo tee /var/www/html/index.html $ cat /var/www/html/index.html 172.31.2.131 $ sudo systemctl start httpd
ターゲットグループの作成
EC2を登録するターゲットグループを作成します。ターゲットグループの画面でターゲットグループの作成
をクリックします。
ここではEC2を普通に登録するので、以下のように設定します。ここのプロトコル
はEC2が受けるプロトコルなのでTLSではなくTCPを設定します。
項目 | 内容 | 備考 |
---|---|---|
ターゲットグループ名 | 任意 | |
ターゲットの種類 | インスタンス | |
プロトコル | TCP | |
ポート | 80 | |
VPC | 任意 | |
ヘルスチェックの設定 プロトコル | TCP |
ターゲットグループを作成したらターゲットとして作成したEC2を登録しましょう。
NLBの作成
NLBを作成します。ロードバランサーの画面でロードバランサーの作成
をクリックします。
Network Load Balancerの作成
をクリックします。Network Load Balancerの部分の表示が地味に変わっており、「TCP」だけの表示だったものが「TCP TLS」となっています。
リスナーでTLS (セキュアTCP)
を選択します。これでTLSが受けられます。
対象のVPCを選択して、割り当てておいたElastic IPを選択します。タグは適切に設定します。
今回はTLS証明書にACMを使うのでACM から証明書を選択する
を選びます。証明書の名前では発行したACMを選びましょう。セキュリティポリシーは以下の7種類から選択可能ですが今回はデフォルトのELBSecurityPolicy-2016-08
としました。各セキュリティポリシーの詳細はこちらのドキュメントを御覧ください。
- ELBSecurityPolicy-2016-08
- ELBSecurityPolicy-TLS-1-2-2017-01
- ELBSecurityPolicy-TLS-1-1-2017-01
- ELBSecurityPolicy-TLS-1-2-Ext-2018-06
- ELBSecurityPolicy-FS-2018-06
- ELBSecurityPolicy-2015-05
- ELBSecurityPolicy-TLS-1-0-2015-04
項目 | 内容 | 備考 |
---|---|---|
ターゲットグループ | 既存のターゲットグループ | |
名前 | <作成したターゲットグループの名前> | |
プロトコル | TCP | |
ポート | 80 | |
ヘルスチェック プロトコル | TCP | |
ヘルスチェックの詳細設定 間隔 | 10秒 |
NLBにセキュリティグループの設定は無いので次に進みます。
設定した内容を確認して作成
をクリックします。
NLBが作成されます。
作成したNLBを見ると属性にアクセスログ
という項目が増えているのが分かります。ここで属性の編集
をクリックします。
アクセスログを有効にしてS3を選択します。今回は新規にバケットを作成しています。設定したら保存
をクリックします。S3を手動で設定する場合は、こちらのドキュメントを確認して下さい。
しばらくするとターゲットのEC2がhealthy
になります。
DNSの設定
作成したNLBをDNSに登録します。今回はRoute 53を使用します。AレコードをAliasで登録しました。
アクセス確認
アクセスを確認します。Chromeでアクセスしましたが、鍵マークが付いています。
TLS証明書を確認するとAmazon Root CA 1を使って発行されたものと分かります。
アクセスログも確認しましょう。ログ項目の詳細はドキュメントを確認して下さい。
tls 1.0 2019-01-24T22:00:45 net/tls-nlb/12ab34cd56ef78gh ab12cd45ef67gh8 203.0.113.32:29043 172.31.8.68:443 7240 9 454 329 - arn:aws:acm:ap-northeast-1:123456789012:certificate/12345678-fc94-abcd-efgh-123abc456def - ECDHE-RSA-AES128-GCM-SHA256 tlsv12 - tls.example.com
さいごに
ようやくCLBを撤廃できそうです。(まだCLBにしかできない機能としてアプリケーションのcookieを利用したスティッキーセッションがありますが。。。)