NLBのターゲットにALBを登録する構成で、HTTPからHTTPSへのリダイレクトをさせる

2022.05.08

いわさです。

半年ほど前のアップデートで、NLB(Network Load Balancer)のターゲットにALB(Application Load Balancer)を指定することが出来るようになりました。

上記ブログ内でも解説されていますが、それまではALBのIPアドレスを静的にしたい場合にGlobal Acceleratorを使うか、NLBを前段に置いた上でLambdaで定期的にALBの動的なIPアドレスを監視する必要がありました。
アップデートによって、細かいこと気にせずにALBの前段にNLBを配置出来るようになったのですが、TLS/SSLをロードバランサーでオフロードする際は少し注意が必要です。

NLBのTLSリスナーは使えない

先程のアップデートブログにも留意事項として記載されていますが、NLBのTLSリスナーを使った際は、ALBのターゲットグループを転送先に選択することは出来ません。

NLBのTLSリスナーはALBのターゲットグループに転送できません

NLBのTLSリスナーを使うと、以下のようにNLBでTLSを終端させることが出来ますが、NLB-ALB-hogeの構成の場合はそれが出来ないということです。

NLBターゲットグループのポートとALBのリスナーポートが一致している必要がある

上記に記載されているのですが、NLBが転送するターゲットグループのポートはALBのリスナーとして登録されているポートと一致している必要があります。

For Listeners, you can create an HTTP or HTTPS listener on any port. However, you must ensure that the port number of this listener matches the port of the target group in which this Application Load Balancer will reside.

TCPリスナーを80と443でそれぞれ用意し、ALBで終端させる

そこで、今回はNLBにTCP80ポートのターゲットグループと、TCP443ポートのターゲットグループをNLBのリスナーからの転送先とし、ALBではHTTP/HTTPSのリスナーを用意する形としました。
ALBのHTTPリスナーはHTTPSへのリダイレクトを行い、HTTPSリスナーはバックエンド(ここではASG内のEC2インスタンス)へ転送するようにしています。

CloudFormationでテンプレートを用意しました。

設定が少し冗長だったので、大部分は割愛しますが、ターゲットにALBを設定するターゲットグループの設定テンプレートがまだ見当たらなかったのでそこだけ抜粋します。
TargetTypealbを指定します。
それ以外はEC2登録時と同じで、IDにALBを指定してターゲットのAZは省略します。

  NetworkLoadBalancerTargetGroup80:
    DependsOn:
      - ApplicationListenerHTTP
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: !Sub ${AWS::StackName}-nlb80-tg
      VpcId: !Ref VPC
      Port: 80
      Protocol: TCP
      HealthCheckPort: traffic-port
      HealthCheckProtocol: HTTP
      HealthCheckPath: "/index.html"
      TargetType: alb
      Targets:
        - Id: !Ref ApplicationLoadBalancer
          Port: 80

Route53ホストゾーンへは、非エイリアスレコードでNLBのIPアドレス用にAレコードを作成しています。

動作確認してみると、期待どおりHTTPリスナーではリダイレクトされ、HTTPSリスナーではバックエンドに転送されていますね。

$ curl -I http://0508nlb.tak1wa.com
HTTP/1.1 301 Moved Permanently
Server: awselb/2.0
Date: Sun, 08 May 2022 08:39:13 GMT
Content-Type: text/html
Content-Length: 134
Connection: keep-alive
Location: https://0508nlb.tak1wa.com:443/

$ curl -I https://0508nlb.tak1wa.com
HTTP/2 200 
date: Sun, 08 May 2022 08:39:18 GMT
content-type: text/html; charset=UTF-8
content-length: 5
server: Apache/2.4.53 ()
last-modified: Sun, 08 May 2022 07:24:41 GMT
etag: "5-5de7afc236596"
accept-ranges: bytes

さいごに

本日はNLBのターゲットにALBを登録した状態でのHTTP/HTTPSリスナーでリダイレクトをさせてみました。
ドキュメントを見て、2本用意すればいけそうかなと思ったのですが動作確認まで出来ました。

TLSリスナーが使えなかったり、ターゲットグループをそれぞれ用意しなければいけない感じですが、やはり以前のようにLambdaでIPアドレスを追跡したりはしなくて済むので良いですね。