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設定
CloudFrontとオリジンの間の通信にHTTPSを利用する場合、オリジンがS3であれば特に意識する必要はないが、カスタムオリジンとしてEC2を利用する場合、そのオリジンの設定で「Origin Domain Name」で設定されるドメイン名でSSLアクセスできるようにしておく必要がある。
CloudFrontとEC2のオリジン間の通信にHTTPSを使用しない場合は、同じくオリジンの設定の「Origin Protocol Policy」を「HTTP Only」にしておけば良い。
カスタムオリジンのアクセス制限
カスタムオリジン側はCloudFrontからのアクセスのみ受け付けるようにし、それ以外のアクセスは除外したい場合、EC2のセキュリティグループでインバウンドの制限を付加する必要がある。残念ながらセキュリティグループの設定では、CloudFrontからのアクセスのみを許可するような便利な設定は無いので、AWSが公開しているIPアドレスのレンジを確認して設定する。
セキュリティグループをAWSの対象リソースのARNで制御できるようになると便利なんだけどなー。