CloudFrontとElasticBeanstalkを使った際のHTTPS化


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でリダイレクト設定します。

.ebextensions/force_host_redirect.config
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への通信がグローバルなインターネット経由であるという認識がなかったですが、理解したら早かったです。