ALB-EC2構成のhttps接続を構築

2019-09-16

ALB-EC2構成にACM+Route 53を使用したhttps接続を構築

概要

はじめに

  • 今回はALB(Application Load Balancer)にEC2を組み合わせたポピュラーなシステム構成の構築方法をご紹介します。
  • ALBはInternet-facingとし、クライアントからhttpsで接続します。そのため、ACM(AWS Certificate Manager)でSSL証明書を取得し、ALBにSSL証明書をセットします。
  • ドメインはRoute 53で登録しましたので、Route 53についても合わせてご説明します。

システム構成

  • 以下にシステム構成のイメージを図示しました。ALBはInternet-facingとなるため、Public Subnetに配置します。EC2はPrivate Subnetとします。EC2には、Webサーバー(Nginx)が動作しています。
  • 重要なポイントはクライアントからインターネット経由のALBまではhttps接続(443)であり、ALBから各ターゲット間はhttp接続(80)であることです。この後ALBやターゲットグループを構築する際にリスナーやヘルスチェックのプロトコルを指定するため、各パートがどのプロトコルで通信しているかの理解が重要な理由です。

前提条件

  • 今回は、ALBおよびACM、Route 53の構築がメインであり、EC2の構築には触れません。
  • すでにRoute 53でドメインを取得しており、ALB DNS名をサブドメインとして追加登録するシチュエーションを想定しています。
 

構築手順

ACMによるSSL証明書の取得

  • 先ずは、ACMからSSL証明書を取得します。Certificate Managerのコンソールを開きましょう。今回は東京リージョンを選択します。
  • 「今すぐ始める」を選択します。
 
  • 「証明書のリクエスト」を選択します。
 
  • Route 53に登録する「ドメイン名」を入力します。「次へ」を押します。
 
  • ドメイン所有者の検証方法は、「DNSの検証」を選択して、「確認」を押します。
 
  • 「確定とリクエスト」を押し、証明書のリクエストを確定します。
 
  • 下記の画面が表示されます。「検証保留中」であることを確認し、「続行」を押します。
 
  • DNS設定(csv)をダウンロードします。Route 53のレコード登録に設定する名前(Record Name)と値(Record Value)を確認しましょう。
 
  • Route 53のコンソールを開き、「レコードセットの作成」を押します。
  • レコードの「名前」、「値」に前述のDNS設定から「Record Name」、「Record Value」をコピーして貼り付けます。タイプに「CNAME」を選択します。内容に問題ばければ、「作成」を押します。
 
  • Certificate Managerの状況が「発行済み」に変わりました。
 

Security Groupの作成

  • 次に、Security Groupを作成します。Security Groupの詳しい手順は省きます。
  • Security Group作成時のポイントは下記の通りです。
    • クライアントからALBに対して、https通信が可能であること。
    • ALBからEC2に対して、http通信可能であること。
  • また、不要な送信元、プロトコルは許可しないように注意して設定します。
 

ターゲットグループの作成

  • 次はターゲットグループを作成します。
  • EC2のコンソールを開き、ターゲットグループを選択します。
  • 「ターゲットグループの作成」を押します。
  • 「ターゲットグループ名」および下記の情報を入力します。なお、ターゲットグループの名前は後から変更できません。
    • ターゲットの種類:インスタンス(EC2のため)
    • プロトコル:HTTP(構成図に記載の通り、ALB-EC2間はhttp通信)
    • ポート:80
    • VPC:ALB,EC2を配置するVPCを選択する
    • ヘルスチェック
      • プロトコル:HTTP
      • パス:/ (EC2のWebサーバー構成による)
 
  • ターゲットグループ作成後、「ターゲット」の「編集」を押し、インスタンスを登録します。
 

ALBの作成

  • 次はロードバランサーを作成します。
  • EC2のコンソールを開き、「ロードバランサー」を選択します。
  • 「ロードバランサーの作成」を押します。
  • 下記画面が表示されます。「Application Load Balancer」の「作成」ボタンを押します。
 
  • ALBの名前を入力します。なお、ALBの名前は後から変更できません。
  • スキームは今回のシステム構成であれば、「インターネット向け」となります。
  • IPアドレスタイプに「ipv4」を選択します。
  • リスナーは、今回のシステム構成に記載した通り、クライアントからインターネット経由のALBまではhttps接続になるため、「ロードバランサーのプロトコル」に「HTTPS」を選択します。
 
  • 続けて、「VPC」、「アベイラビリティゾーン」に対応する「サブネット」を選択します。
  • 重要なポイントであるため、再度記載します。ALBはInternet-facingとなるため、Public Subnetに配置します。選択するサブネットに注意しましょう。
 
  • セキュリティ設定にて、「証明書タイプ」を選択します。「ACMから証明書を選択する」を選びます。
  • 「証明書の名前」にて、先ほどACMで作成した証明書を選びます。
  • 「セキュリティポリシー」は、「ELBSecurityPolicy-2016-08」とします。セキュリティポリシーの説明は、Application Load Balancerのドキュメントを参照ください。
 
  • セキュリティグループの設定にて、「セキュリティグループの割当」で「既存のセキュリティグループを選択する」を選びます。
  • ここで、先ほど作成したSecurity Groupを選びます。
 
  • 次にルーティングの設定にて、「既存のターゲットグループ」を選びます。
  • 「名前」より、前述の手順で作成済みのターゲットグループを選択します。
 
  • ターゲットグループの登録にて、既にターゲットグループにターゲットが登録済みであれば内容を確認し、次の手順に進みます。
 
  • 最後に、下記の確認画面が表示されます。内容を確認して、「作成」ボタンを押します。
   

Route 53のDNSレコード登録

  • 作成したALBのDNS名をコピーします。
 
  • Route 53のコンソールより、ドメイン名に対応するAレコードを入力します。レコードの登録は、ALIASを選択しましょう。
  • Route 53のレコード登録の詳細は、下記の記事を参照ください。
 

ALB-EC2の接続テスト

ヘルスチェックの確認

  • EC2のコンソールより、ターゲットグループを選択します。
  • 先ほど作成したALBに関連付けしたターゲットグループのヘルスチェックが「healthy」に変わったことを確認します。
  • 「unhealthy」の場合は、ALBとターゲットが疎通できていない、あるいはヘルスチェックが合格していません。再度、VPC, サブネットなどのネットワーク設定、Security Groupの設定、ヘルスチェックの設定(プロトコル、パス)を確認しましょう。
   

curlによる疎通確認とトラブルシューティング

  • 無事にELB-EC2の構成が構築できました。
  • クライアントから疎通ができるかを下記のコマンドで確認します(Linuxを想定)。

$ curl https://ドメイン名.com
 
  • curlコマンドの結果エラーがない場合、疎通はOK となります。(以下は出力結果のサンプルです)
 
  • Security Groupでクライアントからのhttps通信が許可されていない場合は、下記のエラーとなります。

curl: (7) Failed to connect to ドメイン名.com port 443: Connection refused
  • その他502(Bad Gateway)のエラーが出力される場合、ALBあるいはALB-EC2間で正しく接続が確立できていません。ALB、ターゲットグループのプロトコル等の設定を再度確認します。