AWS の CloudFront で独自 SSL 証明書を利用する
はじめに
こんばんは、 yosida95 です。
昨 6 月 30 日の 2 時から 5 時の間に、さくら VPS の一部ホストマシンでハードウェア交換のメンテナンスがありました。 運の悪いことに、見てるなう などを提供しているインスタンスがこのメンテナンスの影響を受け、サービスの提供を一時的に停止しました。
twitter では事前に予告したのですが、ありがたいことに見てるなう は多くの方にご利用いただいており、もちろんその中にはぼくのフォロワーさんでない方もいらっしゃるので、これだけでは周知が不十分です。
そこで、 Route53 の Health Check 機能とこれに連動した Failover 機能を使って、サーバーが止まっている間だけ A レコードを書き換え、影響を受ける全てのサービスの全てのパスで CloudFront にホストしたメンテナンスを知らせるメッセージを表示できるようにしてみました。
Route53 を使った Failover 先として一般的に使われる先は Amazon S3 です。 Amazon Web Services の公式ブログにも Failover 先として S3 を利用する方法が紹介されています。
今回、なぜ CloudFront を利用したかというと、それは 独自の SSL 証明書を利用する必要があった ためです。 見てるなう を始めとするぼくが提供している Web サービスをご利用頂いている方はお気づきかもしれませんが、全ての通信を SSL に乗せて暗号化しています。 障害を検知して Failover に成功したとしても、 SSL 証明書の検証に失敗してユーザーに警告画面が表示されるようでは意味がありませんので、今回は独自の SSL 証明書を使える CloudFront を利用しました。
証明書を IAM にアップロードする
awscli のインストール
まずは、 CloudFront で利用する証明書を Amazon Web Services の IAM にアップロードする必要があります。 証明書のアップロードについては、 API が用意されているものの Web コントロールパネルからはその操作ができません。 そのため、今回は Python で書かれたコマンドラインツールであるAWS コマンドラインインターフェース (awscli) をインストールし、コマンドラインから証明書のアップロードを行います。
Homebrew を使ったインストール
Mac OS X で Homebrew を利用している方は以下のコマンドで簡単にインストールすることができます。
brew install awscli
pip を使ったインストール
awscli は PyPI に登録されていますので、 pip によってもインストールすることができます。
pip install awscli
Homebrew を利用していない方、または /usr/local/lib/pythonX.X/site-packages を汚したくない方は、この方法でインストールすることをおすすめします。
証明書のアップロード
awscli のインストールが完了したら、次に示すコマンドによって証明書のアップロードを実行します。
$name="name of certificate"
$certificate=/path/to/server-certificate.pem
$privkey=/path/to/server-private-key.pem
$certchain=/path/to/intermediate-certificate-chain.pem
aws iam upload-server-certificate --path /cloudfront/ --server-certificate-name $name --certificate-body "file://$certificate" --private-key "file://$privkey" --certificate-chain "file://$certchain"
CloudFront に独自 SSL 証明書を適用する
証明書のアップロードが完了したら、最後に CloudFront にアップロードした証明書を適用します。
- Amazon Web Service の Web コントロールパネルを開きます
- CloudFront のコントロールパネルに移動します
- Distributions の中から Failover 先の Distribution を選択し、 Distribution Settings に移動します
- General タブの Edit ボタンを押します
- 以下のスクリーンキャプチャを参考に設定します
以上です。 あとは Distribution の Status が Deployed に変わったら、独自のドメインで SSL 通信ができることを確認して完了です。
ありがとうございました。