AWSは現在SSLの証明書を無料で発行していますが、まだいくつかの制約があります。
例えば、
- 証明書を適用できるのはCloudFrontとELBに対してのみ
- さらにELBの場合、リージョンがバージニア北部でないといけない (バージニア北部だと、日本からのアクセスの場合東京リージョンと比べて300msほどレスポンスが遅くなるらしい)
今回httpsはどうしても必要だったので、最悪300msのレイテンシを我慢してでもELBに証明書を適用させるか、
もしくはAWS以外で証明書をとるか考えていましたが、どうやらELBの手間にCloudFrontを挟んで、
CloudFrontからELBにhttpでつなぐようにすればhttps化を実現できることがわかりました。
つまり、
クライアント <---- https ----> CloudFront <---- http ----> ELB <---- http ----> EC2
ということですね。
クライアントからサーバーのエンドポイントへの通信がhttpsであれば、URLとしてはhttpsとしてアクセスが可能のようです。
上記の、
CloudFront <---- http ----> ELB
の部分を実現するには、CloudFrontの設定で
Origin Protocol Policy (CloudFront ⇔ ELBのProtocol)をHTTP Onlyにすれば良いです。
そして、
クライアント <---- https ----> CloudFront
の部分を実現し、httpでURLアクセスされたリクエストもhttpsに飛ばすためには、
Viewer Protocol Policy (クライアント ⇔ CloudFrontのProtocol)をRedirect HTTP to HTTPS
にしておくと実現できました。
ちなみに、CloudFrontはAWSサービスの中でも更新したときの反映が遅いので注意が必要です。
また、CloudFront、ELB、EC2にはそれぞれ固有のIPアドレスやAWSが発行するURLが振られているので、DNSを変える前に一度それぞれのURLで問題なく動くことをテストすることが可能です。