heroku にデプロイした環境をLet’s EncryptでSSL化して、自動更新までしたいの

Overview

herokuにデプロイしたサービスをSSL化するのに、Let’s Encryptを使いたいけど
なかなか面倒に感じてしまうところがあると思います。
そこで、herokuにデプロイするアプリにはLet’s Encryptのチャレンジレスポンス用のエンドポイントだけを作り
そのエンドポイントに環境変数でキーを渡すようにすれば、ある程度外部から自動化出来るのではないかと思い試してみました。
環境はRuby on Railsです。

今回使うツール

今回試してみた事

RailsのプロジェクトにLet’s Encryptのチャレンジレスポンス用のエンドポイントを作成

routes.rb に以下の行を追加します。
#config/routes.rb
controllerを作成します。
#app/controller/letsencrypt_controller.rb
これで、アプリ側の対応は終わりました。
マージしてデプロイしておきます。

certbotのインストール

certbotのインストールをします。
基本的には https://certbot.eff.org/ に従ってインストールすると入ります。

certbot-herokuのインストール

certbot-herokuは、heroku用に作られたcertbotのプラグインになります。
こちらも、基本的には https://github.com/gboudreau/certbot-heroku の内容に従ってインストールします。
インストールが終わったらプラグインが入ったかを確認します。

herokuコマンドのインストール

こちらも基本的に https://devcenter.heroku.com/articles/heroku-cli の内容に従ってインストールします。
入ったら、一応herokuコマンドで環境変数が操作出来ることを確認して置きます。

環境変数の一覧が表示されれば問題ないです。

ログインを催促されたりしたら、herokuのアカウントでログインしておいてください。

certbotコマンド実行


このコマンドで実行されること

  • ドメインの認証開始
  • ワンタイムトークン取得
  • herokuの環境変数[LETS_ENCRYPT_CHALLENGE]にワンタイムトークンを設定
  • ワンタイムトークン認証
  • 証明書の発行
  • heroku certsで証明書の設定

heroku上でドメインの設定

herokuのDomain Nameのリストに今回のドメインを追加してします。

確認


こんな感じに設定されていれば、OKです。

DNS設定

DNSにCNAMEで今回のドメインを設定します。
どのエンドポイントを設定するかというのは
以下のコマンドで確認します。

ここの、EndpointというところをDNSに設定します。

ここまで作業したところで、実際にSSL化した状態で参照出来るかを確認します。

SSLの自動更新について

Let’s Encryptは、有効期限が短く、3ヶ月で切れてしまうため、更新作業を自動化しておくことが重要となります。

とはいえ、ここまでの作業を全て自動化する必要はなく、更新だけされれば良いので、certbotをcronなどで叩ける環境が構築出来れば問題ないです。

ということで、cronで実行するコマンドですが

を実行すれば良いです。

自動的にheroku certs:updateをしてくれます。

まとめ

今回はheroku上では完結しないやり方となりましたが

heroku上のアプリのSSLを自動更新させる方法としては

ありなのではないかと思います。

自宅などに、更新用のVMをどこかに立ち上げて、cronを仕込んでおくだけで

あとはheroku上のSSLが更新されるとか

素直に、年間10000円くらいのSSL買ってしまう方が管理の手間は省けるのかもしれないですが、それでも更新の手間はあったりするので、個人の環境はしばらくはこのやり方で対応しようかと思っています。

herokuでMemory Quota Exceededと言うのが出るようになったので、puma_worker_killerを入れた話

最近、herokuで稼働させているRailsのアプリが「Memory Quota Exceeded」と言われる事が多くなり、定期的にワーカーの再起動をしたいと思ってました。

memory_quota_exceeded

見る限り、swapも出てしまい、レスポンスも遅くなっているようです。

このような場合、heroku以外だと、unicornを使うので、unicorn_worker_killerを入れるのですが

herokuだとpuma推薦なのでpuma使っていました。

で、pumaもuniconのようにworker killer系の物があるのかな?と探してたところ

puma_worker_killerがあるようなので、使ってみました。

https://github.com/schneems/puma_worker_killer

herokuでの使い方は、「Turn on Rolling Restarts」というのを使うのが推薦のようなので

その設定で行ってみました。

デフォルトだと6時間ごとに再起動ということになるので、ひとまず様子見で3時間に設定してみます。

以下が、3時間でリスタートがかかるようにした設定になります。

こちらを設定したところ

memory_quota_exceeded_after_config

ピーク時は少しswapが出る時もあるものの、割と落ち着いたのかなと思います。

しばらくはこの状態で様子見をし、アラートがまた増えるような感じであれば再度調整という事にしようと思います。