NLB → ALB → EC2 の構成でHTTPS通信を設定してみた(2023年版)

設定でつまづきやすい NLB → ALB → EC2 のHTTPS通信を、分かりやすく手順にしてみました。
2023.10.30

アノテーション テクニカルサポートのShimizuです。

ELB を構築する際、NLB の利点(IPアドレスの固定等)と ALB の利点(リスナールール等)を両方利用するため「NLB→ALB→EC2」の構成をご検討される方は多いと思います。
しかしながら、この構成にHTTPS通信を設定する過程には解りにくいポイントが多く、弊社サポートデスクにもよくお問い合わせをいただきます。

そこで今回は「NLB→ALB→EC2」の構成でHTTPS通信を設定する手順を、できるだけ分かりやすくご紹介します。

前提

ここでは説明を省略しますが、すでに以下が用意されている前提で解説しています。

  • HTTPSでアクセスするための独自ドメイン名(例:example.co.jp)を取得済みで、Route 53 等のDNSサービスで管理している。
  • 取得したドメインのSSL証明書を ACM(Amazon Certificate Manager)で発行済みである。

手順は、構築中のトラブルシューティングがしやすいように以下の順番で実施します。

  • EC2→ALB→NLB の順番で構築する
  • 各行程でブラウザから表示確認をする
  • セキュリティグループの制限は最後に行う

それでは、いってみましょう!

手順1. EC2 インスタンスの起動と表示確認

まずはバックエンドのWebサーバー(EC2 インスタンス)を用意します。
今回は下記の記事を参考に「Hello AWS!」という最小限のwebページを表示する EC2 インスタンスを作成します。

【小ネタ】EC2作成時にユーザーデータでApacheをインストールしてドキュメントルートにindex.htmlを生成する方法 | DevelopersIO

インスタンスにアタッチするセキュリティグループでは、インバウンドルールでポート80を許可します。ソース(送信元)は一旦「0.0.0.0/0(全許可)」にしておきます。

インスタンスを起動したら、ブラウザで「http://EC2インスタンスのIPアドレス」へアクセスしてみましょう。
※ インスタンスをプライベートサブネットに作成した場合は、踏み台などを経由してインスタンスのプライベートIPへアクセスしてください。

下記のように、webページが正常に表示されればOKです。

それでは次に、この EC2 インスタンスをターゲットにした ALB の構築を行ないます。

手順2. ALB の構築と表示確認

まずは ALB の転送先となるターゲットグループを作成します。

以下のようにターゲットの種類はインスタンス、プロトコル:ポートは HTTP:80 に設定し、手順1で用意した EC2 インスタンスをターゲットに登録します。
※まだ ALB が無いので、この時点ではヘルスステータスが "unused" と表示されますが、問題ありません。

ターゲットグループを作成したら、次は ALB を新規作成します。 下記のように設定しましょう。

  • VPC/サブネットは先ほど EC2 インスタンスを起動したサブネットを含めます。
  • リスナーには HTTP:80 と HTTPS:443 を設定し、いずれも先ほど作成したターゲットグループへ転送する設定にします。
  • HTTPS リスナーには、事前準備で用意した ACM のSSL証明書を関連付けます。

ALB にアタッチするセキュリティグループには、インバウンドルールで HTTP:80 と HTTPS:443 を許可します。ソース(送信元)は一旦「0.0.0.0/0(全許可)」にしておきます。

ALB の作成が完了したら、まずはブラウザから「http://ALBのデフォルトDNS名」でアクセスしてみましょう。 ALB を通してバックエンド EC2 上のテストページが表示されればOKです。

次は独自ドメイン名を使用して、HTTPS でアクセスできるように設定します。

ここでは Route 53 でドメインを管理している前提で、以下のように「webtest.ドメイン名」というサブドメインを作成し、エイリアスレコードで ALB を紐づけます。
※ Route 53 以外のDNSサービスを利用している場合は、適宜読み換えてください。

サブドメインを紐付けたら、今度はブラウザから「https://独自ドメイン名」でアクセスしてみましょう。 HTTPS でも正常に表示されれば、まず ALB → EC2 のHTTPSの設定はOKです。

ここまでできたら、最後に ALB の前段に設置する NLB を構築します。

手順3. NLB の構築と表示確認

まずは NLB の転送先となるターゲットグループを作成します。

以下のようにターゲットの種類は Application Load Balancer、プロトコル:ポートは TCP:443 に設定して、手順2で作成した ALB をターゲットに登録します。
※まだ NLB が無いので、この時点ではヘルスステータスが "unused" と表示されますが、問題ありません。

ターゲットグループを作成したら、次は NLB を新規作成します。 以下のように設定しましょう。

  • VPC とサブネットは先ほど作成した ALB と一致させます。
  • リスナーは TCP:80 と TCP:443 を作成し、いずれも転送先を先ほど作成した ALB ターゲットグループにします。(TLSリスナーではないことに注意)

NLB にアタッチするセキュリティグループも ALB と同様、インバウンドで HTTP:80 と HTTPS:443 を許可します。ソース(送信元)は「0.0.0.0/0(全許可)」にしておきます。

NLB の作成が完了したら、前の手順で ALB に紐づけたサブドメインを、NLB への紐付けに変更します。Route 53 で下記のように設定しましょう。
※ Route 53 以外のDNSサービスを利用している場合は、適宜読み換えてください。

ドメインの紐付けを変更したら、再度ブラウザから「https://独自ドメイン名」でアクセスしてみましょう。 正常に表示されれば、NLB → ALB → EC2 を経由してHTTPS通信する設定は完了です!

これでHTTPS通信の設定はできましたが、次にセキュリティグループでよりセキュアにする設定を行います。

手順4. セキュリティグループでよりセキュアに設定する

ここまでの手順ではセキュリティグループのインバウンドルールを全許可(ソース:0.0.0.0/0)に設定しましたが、本運用では ALB や EC2 への直接アクセスを禁止し、NLB→ALB→EC2 の経路のみにアクセスを制限することが多いと思います。

その場合は以下のように設定しましょう。

  • EC2 のセキュリティグループ設定:
    前段にある ALB にアタッチされたセキュリティグループのIDからのみ HTTP:80 へのインバウンドアクセスを許可する。
  • ALB のセキュリティグループ設定:
    前段にある NLB にアタッチされたセキュリティグループのIDからのみ HTTP:80 / HTTPS:443 へのインバウンドアクセスを許可する

このように設定することで、トラフィックの経路が NLB→ALB→EC2 に制限され、よりセキュアになります。
(構築途中で原因切り分けをしやすいよう、まずはセキュリティグループを全許可で構築を行い、最終的に表示確認ができてから制限するのがオススメです)

おわりに

弊社のサポートデスクでは、ELB の多段構成でHTTPS通信を設定する際、下記のようなお困りごとでよくお問い合わせをいただきます。

  • Webページがうまく表示されないが、NLB、ALB、EC2 のどの箇所に問題があるか切り分けしにくい(セキュリティグループか、その他の設定か)
  • 最終的に「ドメイン名を紐づけるのは NLB で、SSL証明書を紐づけるのは ALB」といった独特の制約があり、分かりにくい

このような場合、本記事でご紹介した以下のポイントに気をつけて構築を行うとトラブルシューティングがしやすく、つまづきが少ないかと思います。

  • EC2→ALB→NLB の順番で構築する
  • 各行程でブラウザから表示確認をする
  • 原因切り分けがしやすいよう、セキュリティグループの制限は最後に行う

この情報がどなたかのお役に立てば幸いです!

参考記事

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。