話題の記事

静的なIPアドレスを持つNLBがTLS Terminationに対応してアクセスログも出力可能に!

NLBがTLS Terminationをサポートしました!またアクセスログの取得可能になっています!

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大栗です。

Network Load Balancer(NLB)はIPアドレスが固定で、秒間数百万リクエストでも簡単にスケーリングするロードバランサーですがTCPのバランシングを行うだけでTLSのTerminationは行なえませんでした。アップデートによりTLSのTerminationが可能になり、アクセスログも出力可能になりました。

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

やってみた

東京リージョンを前提として実際に動作確認してみます。

基本的な作業は、初期のリリースと変わっていません。変わっている部分にポイントを絞って解説します。

[新機能]静的なIPを持つロードバランサーNetwork Load Balancer(NLB)が発表されました!

以下の流れで実施します。

  1. Elastic IPの割り当て
  2. TLS証明書(ACM)の発行
  3. アクセス先Webサーバの準備
  4. ターゲットグループの作成
  5. NLBの作成
  6. DNSの設定
  7. アクセス確認

Elastic IPの割り当て

事前にElastic IPを2個割り当てておきます。

TLS証明書(ACM)の発行

TLSを利用するために証明書をCertificate Manager(ACM)を使って発行します。今回はDNSでドメイン認証を行いました。ACMでの証明書発行の詳細は以下のリンクを参照下さい。

Certificate Manager (ACM) がDNSの検証をサポートしました

アクセス先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を使って発行されたものと分かります。

アクセスログも確認しましょう。ログ項目の詳細はドキュメントを確認して下さい。

Access Log Entries

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を利用したスティッキーセッションがありますが。。。)