AWS Lightsailの証明書更新エラーを直してみた

ブログを初めて2か月弱。
次は何を書こうかと考えていたら、AWSからこんなメール通知が来た。

本ブログを構築しているLightsailインスタンスの証明書更新に失敗したとのこと。
ちょうどよいネタになりそうなので、原因究明と対策をブログ記事にする。

事象調査・原因究明

とりあえずAWSマネコンからLightsailの画面を開くと、エラーがでてる。

証明書の自動更新に失敗したっぽい?
LightsailではLet’s Encryptを使って証明書を発行しているけど、コマンドの発行にでも失敗したかなぁ…と予想しつつ、何を調べればいいか考える。

メールに記載のあった公式ドキュメント「Lightsail で HTTPS を使用して WordPress サイトを保護する」だとLightsailインスタンスの初期セットアップの方法しか書いておらず。

Lightsailの画面に表示されていた公式ドキュメント「証明書が自動的に更新されませんでした」を基に調査を進める。(こっちの方がパッとわかりやすかったのでw)

取り急ぎ証明書の更新状況と自動更新のための更新タイマーの状態を確認してみる。

証明書の期限はまだ来てないし、更新タイマーも正常に動作しているように見える。。。

この後公式ドキュメント的にはWebサーバーを止めてから証明書を強制更新せよ、と案内されているけど。
そのまま更新しちゃうと結局何で詰まったのか分からなくなりそうなので一旦保留。

調べてみると証明書の更新を行うためのコマンドcertbotには–dry-runオプションがあり、実際の更新はしないまま疑似的に更新を試行することができる、とのことで試してみた。

うわーなんかFailedって言ってる。。。
って一瞬身構えたものの、よくよく読んでみると証明書更新に使う80番ポートを別のプロセスが使用中のため、証明書更新出来ませんでした、ってことらしい。

で、本ブログサービスの提供にあたってWebサービス(Apache)が常時稼働してる=80番ポートを占有してるので「それはそうでしょうね」って感想しか出てこないww

暫定対処

ってことでエラー原因がわかったのでとりあえず稼働中のWebサービスを一旦止めてから、証明書更新してみる。

–dry-runオプションを付けてコマンド実行したところ、succeededって出てきたのでエラー無くコマンドは通った。ってことは–dry-runオプション外しても通るはず。

ってことで実際にちゃんと更新されるか試してみる。
これは公式ドキュメントに従って–force-renewalオプションを付けて実行。

こっちも通った!

一応証明書情報を確認してみる。。。

ちゃんと有効期限が更新されているので大丈夫そう。

証明書の更新は確認できたので、先程停止したapacheを起動しておく。
(忘れるとWeb公開が停止したままになっちゃう。。。)

恒久対処

とまあここまでやればエラーの対処はできた、ものの。
これで完了にしてしまうとまた数か月後(証明書の期限が切れる前後)に再発する可能性が高い。
そもそも証明書更新時にWebサービスを止めるようにするとか、何かしらの改修をしないといけないじゃん、っていうことで方法を考えてみる。

そもそもcertbotコマンドには動作モードが2種類ある。メリデメは以下の通り。

動作モード解説メリットデメリット
standalone
(現行はこちら)
Certbot内部で接続確認用のWebサーバを立ち上げて証明書の取得を行う設定が簡単更新時にWebサービスを停止する必要がある
webroot既存WebサーバーのWebrootディレクトリを接続テスト用のファイル置き場として証明書の取得を行うWebサービスは停止させずに更新ができる設定が複雑

で、どっちの方法を採用するかだが。

お客様に提供するような商用サービスではないし、実際サービスが止まったところで「まあ個人のブログだしなぁ」くらいの感覚にしかならないと思うのでstandalone方式で十分な気がする。
一方で、技術ブログを名乗る以上難しい方をやっておけよ、っていうツッコミも受けそうw

ということで、standalone方式を採用するが、webrootのやり方もまとめて記載しておく。
このブログを見に来た方が好きな方を選べるように…

standalone方式

certbotの設定ファイルを編集して、以下赤字部分を編集・追記する。

webroot方式

certbotの設定ファイルを編集して、以下赤字部分を編集・追記する。
(webroot_mapのドメイン名やドキュメントルートは適宜修正してください)

(言うほど難しいこと無くね…?って思ったそこの貴方。Redherringも思いましたw)
(本来証明書のパス管理とかが大変らしいが…Lightsailの場合予め設定されてるから楽って話かな?)

証明書更新の再試行

このstandalone/webrootそれぞれの方式に従って設定ファイルを更新した後、再度証明書更新を試行してみる。
(standaloneの場合ちょっと時間がかかった。apacheの停止/起動があるからかな?)

Webサービス(Apache)を停止させなくても更新のコマンドが通った!
(–dry-runオプション付けたままだけど)

必要に応じて–force-renewalオプションを付けて実行し、正常に証明書が更新されるか確認しておく。

気になる方はブラウザから当該ページへアクセスし、証明書情報を確認して有効期限が更新・延長されていることを確認するとよい。(確認の仕方はブラウザによって異なるため割愛。)

ここまでできれば恒久対処も概ね完了といって良いだろう、ということ一旦様子見。
数か月後に自動更新が走って問題なく更新されればヨシ、異常があればまたここに追記することにする。
(更新されてなかったら正常に動作していると思ってくださいw)


ということで今回はここまで。

Lightsailの画面上に表示されてる警告はいつになったら消えるんだろうか。。。
(証明書更新しても消えない…しばらく残ってるパターンかな)