ALB-EC2構成のhttps接続を構築
ALB-EC2構成にACM+Route 53を使用したhttps接続を構築
Contents
概要
はじめに
- 今回は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設定(csv)で確認した「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、ターゲットグループのプロトコル等の設定を再度確認します。