CloudFrontとElasticBeanstalkを併用する構成の場合にどうやって通信をHTTPS化するを解説します。
ざっくり概要
- CloudFrontだけじゃなく、ElasticBeanstalkの方にもドメイン名を指定しておくと便利です。
- ユーザーとCloudFront間の通信だけではなく、CloudFrontのオリジンとなるとElasticBeanstalk間の通信もHTTPS化します。
- ElasticBeanstalkはCloudFrontを経由しないアクセスを制限するために別途設定を追加します。
ドメイン設定
CloudFrontの方をexample.com、ElasticBeanstalkの方をserver.example.comと設定することにします。
CloudFrontのHTTPS化
CloudFrontのHTTPS化はCertificateManagerから証明書を発行し、それをCloudFrontで利用します。

このときに気をつけることはただ一つだけです。CloudFrontで使う証明書は__バージニア北部リージョン__で作らなくてはいけません。東京リージョンで作ったものは使えませんのでご注意ください。
ElasticBeanstalkのHTTPS化

証明書をElasticBeanstalkの設定画面で設定します。このときの証明書は東京リージョンのElasticBeastalkを使っているのであれば東京リージョンのCertificateManagerで設定した証明書を使います。つまりCertificateManagerとElasticBeanstalkで使う証明書は全く別物になります。
ElasticBeanstalkでリダイレクト設定
リダイレクトの方法は複数考えられると思いますが、今回はApacheのmod_rewriteでリダイレクト設定します。
files:
# ALBを通しているのにHOST名がAPP_URLと一致していなかったらリダイレクト
# healthcheckのためにALBを通していないアクセスはリダイレクトしない
"/tmp/force_host_redirect.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
{
echo "RewriteEngine On"
echo "RewriteCond %{HTTP:X-Forwarded-Proto} !^$"
echo "RewriteCond https://%{HTTP_HOST} !=https://example.com"
echo "RewriteRule (.*) https://example.com%{REQUEST_URI} [R=301,L]"
} > /etc/httpd/conf.d/force_host_redirect.conf
container_commands:
set_up:
command: /tmp/force_host_redirect.sh
HOSTが期待したものと違ったらリダイレクトする、というだけの設定ですが、ElasticBeanstalkのhealthcheckが通るように工夫しています。
まとめ
最初、CloudFrontとElasticBeanstalkで同じ証明書を使わないといけないんじゃないかと思って、だいぶハマってしまいましたが、ElasticBeanstalkに対してCloudFrontがクライアントのように働きHTTPS通信してくれるので、問題なく設定出来るということが分かりました。CloudFrontからElasticBeanstalkへの通信がグローバルなインターネット経由であるという認識がなかったですが、理解したら早かったです。