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

本ブログを構築しているLightsailインスタンスの証明書更新に失敗したとのこと。
ちょうどよいネタになりそうなので、原因究明と対策をブログ記事にする。
事象調査・原因究明
とりあえずAWSマネコンからLightsailの画面を開くと、エラーがでてる。

証明書の自動更新に失敗したっぽい?
LightsailではLet’s Encryptを使って証明書を発行しているけど、コマンドの発行にでも失敗したかなぁ…と予想しつつ、何を調べればいいか考える。
メールに記載のあった公式ドキュメント「Lightsail で HTTPS を使用して WordPress サイトを保護する」だとLightsailインスタンスの初期セットアップの方法しか書いておらず。
Lightsailの画面に表示されていた公式ドキュメント「証明書が自動的に更新されませんでした」を基に調査を進める。(こっちの方がパッとわかりやすかったのでw)
取り急ぎ証明書の更新状況と自動更新のための更新タイマーの状態を確認してみる。
$ sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: WebsiteSetupLECert
Serial Number: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Key Type: ECDSA
Identifiers: XXXXXXXXXXXXX.com
Expiry Date: 2026-10-29 23:04:35+00:00 (VALID: 57 days)
Certificate Path: /etc/letsencrypt/live/WebsiteSetupLECert/fullchain.pem
Private Key Path: /etc/letsencrypt/live/WebsiteSetupLECert/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$ systemctl status certbot-renew.timer
● certbot-renew.timer - Monthly Certbot Renewal Timer
Loaded: loaded (/etc/systemd/system/certbot-renew.timer; enabled; preset: enabled)
Active: active (waiting) since Sat 2026-07-04 15:22:33 UTC; 1 month 29 days ago
Trigger: Thu 2026-10-01 00:00:38 UTC; 4 weeks 0 days left
Triggers: ● certbot-renew.service
Jul 04 15:22:33 ip-172-26-11-142 systemd[1]: Started certbot-renew.timer - Monthly Certbot Renewal Timer.
証明書の期限はまだ来てないし、更新タイマーも正常に動作しているように見える。。。
この後公式ドキュメント的にはWebサーバーを止めてから証明書を強制更新せよ、と案内されているけど。
そのまま更新しちゃうと結局何で詰まったのか分からなくなりそうなので一旦保留。
調べてみると証明書の更新を行うためのコマンドcertbotには–dry-runオプションがあり、実際の更新はしないまま疑似的に更新を試行することができる、とのことで試してみた。
$ sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/WebsiteSetupLECert.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for XXXXXXXXXXXXX.com
Failed to renew certificate WebsiteSetupLECert with error: Could not bind TCP port 80 because it is already in use by another process on this system (such as a web server). Please stop the program in question and then try again.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
All simulated renewals failed. The following certificates could not be renewed:
/etc/letsencrypt/live/WebsiteSetupLECert/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
うわーなんかFailedって言ってる。。。
って一瞬身構えたものの、よくよく読んでみると証明書更新に使う80番ポートを別のプロセスが使用中のため、証明書更新出来ませんでした、ってことらしい。
で、本ブログサービスの提供にあたってWebサービス(Apache)が常時稼働してる=80番ポートを占有してるので「それはそうでしょうね」って感想しか出てこないww
暫定対処
ってことでエラー原因がわかったのでとりあえず稼働中のWebサービスを一旦止めてから、証明書更新してみる。
$ sudo systemctl stop apache2
$ sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/WebsiteSetupLECert.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for XXXXXXXXXXXXX.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/WebsiteSetupLECert/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
–dry-runオプションを付けてコマンド実行したところ、succeededって出てきたのでエラー無くコマンドは通った。ってことは–dry-runオプション外しても通るはず。
ってことで実際にちゃんと更新されるか試してみる。
これは公式ドキュメントに従って–force-renewalオプションを付けて実行。
$ sudo certbot renew --force-renewal
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/WebsiteSetupLECert.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Renewing an existing certificate for XXXXXXXXXXXXX.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded:
/etc/letsencrypt/live/WebsiteSetupLECert/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
こっちも通った!
一応証明書情報を確認してみる。。。
$ sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: WebsiteSetupLECert
Serial Number: 6725628ecda0e73ae7bb566d61443369b3b
Key Type: ECDSA
Identifiers: XXXXXXXXXXXXX.com
Expiry Date: 2026-12-01 12:58:29+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/WebsiteSetupLECert/fullchain.pem
Private Key Path: /etc/letsencrypt/live/WebsiteSetupLECert/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ちゃんと有効期限が更新されているので大丈夫そう。
証明書の更新は確認できたので、先程停止したapacheを起動しておく。
(忘れるとWeb公開が停止したままになっちゃう。。。)
$ sudo systemctl restart apache2
恒久対処
とまあここまでやればエラーの対処はできた、ものの。
これで完了にしてしまうとまた数か月後(証明書の期限が切れる前後)に再発する可能性が高い。
そもそも証明書更新時にWebサービスを止めるようにするとか、何かしらの改修をしないといけないじゃん、っていうことで方法を考えてみる。
そもそもcertbotコマンドには動作モードが2種類ある。メリデメは以下の通り。
| 動作モード | 解説 | メリット | デメリット |
|---|---|---|---|
| standalone (現行はこちら) | Certbot内部で接続確認用のWebサーバを立ち上げて証明書の取得を行う | 設定が簡単 | 更新時にWebサービスを停止する必要がある |
| webroot | 既存WebサーバーのWebrootディレクトリを接続テスト用のファイル置き場として証明書の取得を行う | Webサービスは停止させずに更新ができる | 設定が複雑 |
で、どっちの方法を採用するかだが。
お客様に提供するような商用サービスではないし、実際サービスが止まったところで「まあ個人のブログだしなぁ」くらいの感覚にしかならないと思うのでstandalone方式で十分な気がする。
一方で、技術ブログを名乗る以上難しい方をやっておけよ、っていうツッコミも受けそうw
ということで、standalone方式を採用するが、webrootのやり方もまとめて記載しておく。
このブログを見に来た方が好きな方を選べるように…
standalone方式
certbotの設定ファイルを編集して、以下赤字部分を編集・追記する。
$ vi /etc/letsencrypt/renewal/WebsiteSetupLECert.conf
version = 5.6.0
archive_dir = /etc/letsencrypt/archive/WebsiteSetupLECert
cert = /etc/letsencrypt/live/WebsiteSetupLECert/cert.pem
privkey = /etc/letsencrypt/live/WebsiteSetupLECert/privkey.pem
chain = /etc/letsencrypt/live/WebsiteSetupLECert/chain.pem
fullchain = /etc/letsencrypt/live/WebsiteSetupLECert/fullchain.pem
[renewalparams]
account = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
pref_challs = http-01,
authenticator = standalone
server = https://acme-v02.api.letsencrypt.org/directory
key_type = ecdsa
pre_hook = systemctl stop apache2
post_hook = systemctl start apache2
webroot方式
certbotの設定ファイルを編集して、以下赤字部分を編集・追記する。
(webroot_mapのドメイン名やドキュメントルートは適宜修正してください)
$ vi /etc/letsencrypt/renewal/WebsiteSetupLECert.conf
version = 5.6.0
archive_dir = /etc/letsencrypt/archive/WebsiteSetupLECert
cert = /etc/letsencrypt/live/WebsiteSetupLECert/cert.pem
privkey = /etc/letsencrypt/live/WebsiteSetupLECert/privkey.pem
chain = /etc/letsencrypt/live/WebsiteSetupLECert/chain.pem
fullchain = /etc/letsencrypt/live/WebsiteSetupLECert/fullchain.pem
[renewalparams]
account = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
pref_challs = http-01,
authenticator = webroot
server = https://acme-v02.api.letsencrypt.org/directory
key_type = ecdsa
webroot_path = /var/www/html,
post_hook = systemctl reload apache2
[[webroot_map]]
XXXXXXXXXXX.com = /var/www/html
(言うほど難しいこと無くね…?って思ったそこの貴方。Redherringも思いましたw)
(本来証明書のパス管理とかが大変らしいが…Lightsailの場合予め設定されてるから楽って話かな?)
証明書更新の再試行
このstandalone/webrootそれぞれの方式に従って設定ファイルを更新した後、再度証明書更新を試行してみる。
(standaloneの場合ちょっと時間がかかった。apacheの停止/起動があるからかな?)
$ sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/WebsiteSetupLECert.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for XXXXXXXXXXXXX.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/WebsiteSetupLECert/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Webサービス(Apache)を停止させなくても更新のコマンドが通った!
(–dry-runオプション付けたままだけど)
必要に応じて–force-renewalオプションを付けて実行し、正常に証明書が更新されるか確認しておく。
気になる方はブラウザから当該ページへアクセスし、証明書情報を確認して有効期限が更新・延長されていることを確認するとよい。(確認の仕方はブラウザによって異なるため割愛。)
ここまでできれば恒久対処も概ね完了といって良いだろう、ということ一旦様子見。
数か月後に自動更新が走って問題なく更新されればヨシ、異常があればまたここに追記することにする。
(更新されてなかったら正常に動作していると思ってくださいw)
ということで今回はここまで。
Lightsailの画面上に表示されてる警告はいつになったら消えるんだろうか。。。
(証明書更新しても消えない…しばらく残ってるパターンかな)
