production.log

株式会社リブセンスでエンジニアをやっている星直史のブログです。

SnapmartのブログサーバーのSSL証明書をLet's EncryptからAWS Certificate Manager (ACM)に移管しました

概要

先日、SnapmartのブログサーバーのSSL証明書が有効期限切れになってしまい、アクセスすることができなくなってしまいました。

これまでSnapmartのブログサーバーではLet's Encrypt という証明書を無料で発行しているサービスを使っていました。
しかし、このLet's Encryptで発行される証明書は有効期限が90日間で設定されているため、それに気づかず失効してしまいました。

Let's Encryptの使用による90日ごとに証明書の更新を行うのは今回のようなトラブルの元になることや、運用負荷が高まってしまうため、このタイミングでSnapmartのブログサーバーのSSL証明書をLet's EncryptからAWS Certificate Manager (ACM)に移管しました

当初の構成と運用

当初のシステム構成と、運用はこのような感じでした。

f:id:watasihasitujidesu:20190812155930p:plain

  • オリジンをEC2(WordPress)としたCloudFrontを使用
  • 証明書の発行はLet's Encryptが行う
  • CloudFrontに設定する証明書はACMで管理しているが、Let's Encryptで発行した証明書インポートしている

「CloudFrontを設置し、負荷対策と高速化はできているが、証明書の発行と運用まで手が回っていなかった」という状態です。

あるべき姿

「Let's Encryptからの脱却し、運用負荷(考えるべきこと)を減らす」を目的に、代替手段を考えます。

メリット デメリット
証明書を代理店から購入し、失効までの期間を伸ばす 失効までの期間が延長される 数年に一度は更新作業をしなければならない
Let's Encryptの証明書更新、ACMインポート、CloudFrontの設定を自動化する 目の前の課題は自動化により解決される プラットフォームの変化に弱い
証明書の管理にACMを使う 証明書の更新や設定はAWSが管理してくれる EC2に証明書をもたせることができない

これらを比較検討した結果、「証明書の管理にACMを使う」が有力だろうと考えました。
しかし、デメリットを挙げた通り、EC2はACMが発行した証明書を持つことができないため、CloudFrontとEC2インスタンスの間にELBをかます必要があります。

移行手順

大まかな手順は下記の通りです。

  • ACMでSSL証明書を発行
  • ALBを設置し、ターゲットをEC2インスタンス(既存のブログサーバー)に設定
  • CloudFrontのオリジンにALBを設定
  • CloudFrontのSSLをACMで発行したSSL証明書に設定

ACMでSSL証明書を発行

何はともあれ、SSL証明書が必要です。
今回は、faq.snapmart.jpとinfo.snapmart.jpの2つのドメインが必要であったため、ワイルドカードを使った証明書を作る必要があります。

発行自体は非常に簡単で、 AWS ACMのマネコンにアクセス => Request a certificate => Request a public certificateと画面を進み、Domain nameにワイルドカードを使ったドメイン名(今回の例だと*.snapmart.jp)を設定するだけです。

f:id:watasihasitujidesu:20190812201302p:plain

ALBを設置し、ターゲットをEC2インスタンス(既存のブログサーバー)に設定

ALBの設定は特筆する点がありませんので、公式のドキュメントを参考に作成します。

docs.aws.amazon.com

CloudFrontのオリジンにALBを設定

対象のオリジンを選択 => Origins and Origin Groups => Editから「Origin Domain Name」に上記で作成したALB名を指定します。

CloudFrontのSSLをACMで発行したSSL証明書に設定

最後に、CloudFrontのSSL証明書を変更します。
対象のオリジンを選択 => General => Editから、
Custom SSL Certificateを編集します。
テキストボックスに、Focus Inすると、ACMで作成した証明書名が表示されるので、それを選択します。

f:id:watasihasitujidesu:20190814105211p:plain

以上で設定は終わりです。

まとめ

最終的には下記の構成図となりました。

f:id:watasihasitujidesu:20190814110944p:plain

Let's Encryptは手軽にSSL証明書を取得できる便利なサービスです。
しかし、証明書の期限が90日であるため、こまめに更新を行わなければならず、運用が煩わしくなったり、更新漏れが発生しWebサイトにアクセスができなくなってしまいます。

今回は、SSL証明書の運用から解放されるために、証明書の管理をAWS Certificate Manager (ACM)に移管しました。
また、EC2をオリジンにしたCloudFrontを使用している場合は、EC2は直接ACMの証明書を使えないため、CloudFrontとEC2の間にALBを置く必要があります。