CloudFrontの独自ドメインSSL証明書対応を試してみた

よく訓練されたアップル信者、都元です。先日AWSにおける静的コンテンツ配信パターンカタログ(アンチパターン含む)というエントリを書いたのですが、「独自ドメインSSLだとCloudFront使えないから横綱無理だよねー」というコメントを数カ所から頂き、密かに悔し涙で枕を濡らしておりました。

が、もう2週間ほど前の話になりますが *1Amazon CloudFrontが独自SSL証明書をサポートしたことが発表されました。 独自ドメインSSLでも横綱パターンが使えるようになったわけです。

というわけで、試してみました。

準備

仕様決め

まずは今回のサンプル仕様を整理しておきます。

  • オリジンバケット名はxxxxxxxxtest
  • 使う独自ドメインはawscftest.classmethxxxxxxxx
  • コンテンツは/logo.png

S3バケットの作成とコンテンツのアップロード

まずは、S3バケットを作り、配信コンテンツを用意してアップロードしておきましょう。また、CloudFrontがこのバケットを参照できるように、バケットポリシーを設定して、匿名アクセスに対してファイル取得を許可しておきます。

{
  "Version":"2008-10-17",
  "Statement":[{
    "Sid":"AddPerm",
    "Effect":"Allow",
    "Principal": {
      "AWS": "*"
    },
    "Action":["s3:GetObject"],
    "Resource":["arn:aws:s3:::xxxxxxxxtest/*"]
  }]
}

証明書のアップロード

SSL証明書をAWSに登録します。登録先は、S3でもCloudFrontでもなく、実はIAMになります。しかも、証明書のアップロードについてはManagement Consoleによるインターフェイスが用意されていないため、コマンドラインツールを使うことになります。もし、手元のマシンにツールがインストールされていない場合は、適宜インストールします。MacOSXでbrewを使っている場合は、以下のコマンドでインストール可能です。APIキー等のクレデンシャルはツールのドキュメントに従って適宜設定・配置してください。

$ brew install aws-iam-tools

続いて、証明書のアップロードです。カレントディレクトリに以下の3つのファイルを用意し、以下のコマンドを実行します。ファイル名が違う場合は、コマンドラインを適宜修正してください。

  • SSL証明書 public.crt
  • 秘密鍵 private.key
  • 中間証明書 certchain.crt
$ iam-servercertupload \
    -s awscftest.classmethxxxxxxxx \
    -k private.key \
    -c certchain.crt \
    -b public.crt \
    -p "/cloudfront" \
    -v
arn:aws:iam::XXXXXXXXXXXX:server-certificate/cloudfront/awscftest.classmethxxxxxxxx

これでアップロード完了です。ポイントは-pのオプションです。これに/cloudfrontと指定してある証明書が、次に出てくる証明書の選択肢として出て来ます。この指定を忘れると、ドロップダウンリストに出て来ませんので注意してください。

CloudFront Distributionの作成

2013-06-20_1519-cfnssl-create

これで、あとは普通にCloudFrontのDistributionを作りに行きます。オリジンにxxxxxxxxtestバケットを指定し、SSL Certificateの項で、上でアップロードした証明書のドメインawscftest.classmethxxxxxxxxを選択します。

さて、いざ作成 Create Distribution ボタンを押下すると…、以下のエラーが発生してしまいました。

Processing your request will cause you to exceed the maximum number of certificates allowed.

どうやら、CloudFrontで独自ドメイン用証明書を利用するためには申請が必要なようです。申請ページから必要事項を記入して申請しましょう。ちなみに、今回の場合、許可が降りるまで2日ほど掛かりました。いつかこの申請の手間も無くなると良いですね〜。

2013-06-20_1526-cfnssl-submit

さて、気を取り直して。今回は Create Distribution が通りました。

2013-06-24_1136-cfnssl

StatusがInProgressからDeployedになる間に、Route53の設定をしてしまいましょう。awscftest.classmethxxxxxxxxのCNAMEエントリに、上記で作成中のCloudFront Distributionに割り当てられたドメイン名xxxxxxxx.cloudfront.netを設定します。

2013-06-24_1140-cfnssl-r53

さて、準備は整いました。DNS情報のプロパゲーションと、CloudFront Distributionの構築のため、充分時間をとりましょう。その上で、HTTPSとしてhttp://awscftest.classmethxxxxxxxx/logo.pngにアクセスしてみて、きちんとSSLが機能していることを確認します。

2013-06-24_1617-cfnssl-result

問題ありませんね。ちなみに、CloudFrontに割り当てられたドメイン名xxxxxxxx.cloudfront.netからアクセスしてみると、下記のように、証明書のドメイン名と一致しない旨のエラーが表示されます。こちらも想定通りの挙動です。

2013-06-24_1618-cfnssl-result2

以上、独自ドメイン+SSLの静的コンテンツの配信でも、CloudFrontが使えるようになりました。静的コンテンツ配信の横綱パターンです。是非活用していきましょう。

脚注

  1. 適当に書き始めたら、思わず「1ヶ月ほど前になりますが」と書いていました。AWSの進化の流れが早過ぎて、コレが発表されてからもう1ヶ月以上経っている感覚です…。