CloudFrontで独自ドメインのSSL証明書を使ってコンテンツを公開してみた。
CloudFrontを使用してコンテンツを配信する際に、独自ドメインを利用し、かつSSLで配信したい場合(SNIを利用)、そのドメインのSSL証明書をアップロードする必要がある。

証明書のアップロード

独自ドメインのSSL証明書をCloudFrontで利用するため、証明書をアップロードする。なぜかこの証明書はIAMで管理されるようなのでIAMの証明書ストアへアップロードする。
現時点ではManagement Consoleで証明書をアップロードする機能は無いようなのでCLIを利用する。

aws --profile {プロファイル名} iam upload-server-certificate --server-certificate-name {証明書の名前} --certificate-body file://{アップロードする証明書のパス} --private-key file://{秘密鍵のパス} --certificate-chain file://{中間証明書のパス} --path {任意のパス名}
  • {プロファイル名}
    デフォルトのプロファイルを使用する場合は–profileオプションは不要。
  • {証明書の名前}
    証明書の名前を任意に設定。ここで設定した名前がCloudFrontのコンソールの証明書選択の際に利用される。
  • {アップロードする証明書のパス}
    アップロードするSSL証明書のパスを設定。
  • {秘密鍵のパス}
    証明書のCSRを生成した際に利用したPEM形式のRSA秘密鍵のパスを設定。(パスワードの付与は不可)
  • {中間証明書のパス}
    使用するSSL証明書の中間証明書のパスを設定。
  • {任意のパス名}
    アップロード先のパスの名称を設定。必ず/cloudfront/で始まり最後は/で終わる必要がある。

独自SSL証明書の利用設定

証明書のアップロードができたら、CloudFrontのコンソールで証明書を利用したいディストリビューションの設定画面を開くと、SSL Certificateの部分でCustome SSL Certificateが選択できるようになっており、先ほどアップロードした証明書が選択できる。

ssl

 

 

カスタムオリジンのSSL設定

CloudFrontとオリジンの間の通信にHTTPSを利用する場合、オリジンがS3であれば特に意識する必要はないが、カスタムオリジンとしてEC2を利用する場合、そのオリジンの設定で「Origin Domain Name」で設定されるドメイン名でSSLアクセスできるようにしておく必要がある。

CloudFrontとEC2のオリジン間の通信にHTTPSを使用しない場合は、同じくオリジンの設定の「Origin Protocol Policy」を「HTTP Only」にしておけば良い。

カスタムオリジンのアクセス制限

カスタムオリジン側はCloudFrontからのアクセスのみ受け付けるようにし、それ以外のアクセスは除外したい場合、EC2のセキュリティグループでインバウンドの制限を付加する必要がある。残念ながらセキュリティグループの設定では、CloudFrontからのアクセスのみを許可するような便利な設定は無いので、AWSが公開しているIPアドレスのレンジを確認して設定する。

セキュリティグループをAWSの対象リソースのARNで制御できるようになると便利なんだけどなー。