Amazon CloudFront・Application Load Balancer(ALB)間の通信をHTTPS化してみた

AWS Certificate Manager(ACM)証明書を発行して、Amazon CloudFrontとApplication Load Balancer(ALB)間の通信をそれぞれHTTPS化します。ACM証明書は、東京とバージニア北部の2リージョン分が必要です。
2024.05.15

HTTPSでApplication Load Balancerにアクセスしたい

おのやんです。

みなさん、Application Load Balancer(以下、ALB)をAmazon CloudFront(以下、CloudFront)のオリジンとして設定する時に、HTTPSで通信したいと思ったことはありませんか?私はあります。

CloudFrontのオリジンとしてALBを設定する際に、クライアント <=> CloudFrontの間や、CloudFront <=> ALBの通信をHTTPSに対応させたい場合があります。そういった際に必要な手順をまとめましたので、本記事ではそちらを紹介します。

目指す構成

今回は、EC2やALBがこちらの構成であらかじめ構築されているものとして進めます。

具体的に言うと、2つのAZにパブリックサブネットとプライベートサブネットを作成し、パブリックサブネットにはALBを、プライベートサブネットにはEC2インスタンスを起動しています。このEC2インスタンスにはApacheのWebサーバーが設定されており、Internat gatewayを通してApacheのページにアクセスできるようになっています。この際、通信はすべてHTTPとなっています。

実際にWebブラウザからALBのドメインにアクセスすると、このようにApacheのデフォルトページが表示されることが分かります。この画像ではWebブラウザとしてChromeを使っているのですが、通信がHTTPSになっていないため、保護されていない通信と表示されているのも確認できます。

この環境に対して、CloudFrontやAmazon Route 53(以下、Route 53)のパブリックホストゾーンを追加で作成します。その後AWS Certificate Manager(以下、ACM)にて証明書を発行し、この証明書を使ってクライアントとCloudFront間、CloudFrontとALB間の通信をHTTPSにします。またこの設定に際して、CloudFrontディストリビューションにドメインを紐付け、独自ドメインでアクセスできるようにします。

ACM証明書の発行

まず初めに、HTTPS化で使用するACMの証明書を発行します。

ここで注意なのですが、ACM証明書は東京リージョン(ap-northeast-1)バージニア北部(us-east-1)2リージョンで作成します。東京リージョンで発行したACMはALBに用いるのですが、バージニア北部リージョンで発行したACM証明書はCloudFrontディストリビューションに使用します。

CloudFront で ACM 証明書を使用するには、米国東部 (バージニア北部) リージョン (us-east-1) の証明書をリクエスト (またはインポート) していることを確認します。

そのため、ACM証明書発行作業は東京リージョンとバージニア北部リージョンの2つで発行します。

まず、東京リージョンにてACM証明書を発行します。リージョン選択部分が東京になっていることを確認した状態で、ACM証明書画面の「リクエスト」ボタンを押下します。

証明書タイプはパブリック証明書のままでOKですので、このまま次に進みます。

ドメイン名の例として、今回はexample.comを例に出します。また、example.comはRoute 53のパブリックホストゾーンにて管理されているとします。

今回はCloudFrontにサブドメインを充てる予定はありませんが、念の為example.comのドメイン名のほかに、サブドメインを許可する*.example.comを追加しておきます。

あとはデフォルトの設定で大丈夫ですので、そのまま証明書をリクエストします。

正常に証明書が発行できれば、このように証明書の詳細画面が確認できるようになります。ここで「ドメイン」セクションの「Route 53でレコードを作成」ボタンを押下します。

パブリックホストゾーンに追加するレコードがあらかじめ作成され選択されている状態のため、このまま「レコードを作成」を押下します。

証明書のステータスが「発行済み」に、ドメインのステータスが「成功」になれば、証明書が有効になっています。

これで東京リージョンでの証明書発行は完了です。同様の手順をバージニア北部リージョンでも実施し、有効な証明書を発行しておきましょう。

CloudFrontディストリビューションの作成

ACMの証明書が発行されたら、次にCloudFrontディストリビューションを作成します。

CloudFrotディストリビューション作成画面にて、ALBをオリジンとして設定します。また、今回はCloudFrontとALBの間の通信はHTTPS化したいので、プロトコルは「HTTPSのみ」を選択します。

またRoute 53で管理しているドメインでアクセスしたいため、代替ドメイン名としてexapmle.comを入力しておきます。

またCustom SSL certificateの部分では、バージニア北部リージョンで発行したACM証明書が選択できますので、そちらを設定します。

その他のキャッシュビヘイビアやキャッシュキー・オリジンリクエストは自由に設定してもらって、CloudFrontディストリビューションを作成します。

このCloudFrontディストリビューションにドメインを設定するRoute 53レコードを作成します。レコード作成時の設定は以下の通りです。

項目 設定値 備考
レコード名 _(空白) ドメインをそのまま使用します
レコードタイプ A
エイリアス 有効
トラフィックのルーティング先 CloudFrontディストリビューションへのエイリアス
上記で作成したCloudFrontディストリビューション

ALBのリスナーを編集

最後に、ALBのリスナーを編集します。ロードバランサー画面でALBを選択すると、画面下部にALBの詳細設が表示されます。ここのリスナーとルールタブからリスナーが選択できます。冒頭で紹介したALBの動作確認からも分かる通り、現在はHTTPでのアクセスがリスナーで設定されています。こちらをHTTPSに変更したいと思います。

リスナー部分の「HTTP:80」を押下して、リスナー詳細画面に移動します。

リスナー詳細画面では「アクション」トグルの「リスナーの編集」から編集できるので、こちらを押下します。

「リスナーの詳細」のセクションにて、プロトコルを設定できます。現在はリスナーのプロトコルがHTTPになっているため、ここをHTTPS・ポート443に変更します。

HTTPSを選択したことにより、セキュアリスナーの設定項目が表示されるようになります。証明書の取得先はACMからに設定して、東京リージョンで発行したACM証明書を選択します。これらの設定が完了したら「変更内容の保存」を謳歌します。

リスナーがHTTPSになったことで、このようにプロトコルが変更されました。

実際にexample.comでWebブラウザからアクセスしてみると、Apacheのテストページが表示されるのが確認できます。またChromeを使用している場合、HTTPSでアクセスしている時は保護されていない通信が表示されなくなります。

HTTPS化には、CloudFrontとALBリスナーにて証明書の設定が必要

CloudFrontとALBでそれぞれ別リージョンのACM証明書が必要ですので、ここは注意するようにしてください。別リージョンのACM証明書を取得できたら、あとはCloudFrontとALBリスナーの両方でそれぞれ証明書を設定すればOKです。

今回の記事が参考になれば幸いです。では!