CLI で Lightsail の WordPress を 5.7 に Update してみた。

2021-04-11

 Wordpress 5.7 がリリースされたのでアップデートしてみるのですが、今回は全ての作業を CLI (コマンドライン)でやってみようと思います。GUI (管理画面)からやったほうが直感的で分かりやすいのは確かですが、CLI だとなんかカッコいいじゃないですか。冗談に聞こえるかもしれませんが割と冗談ではないです。カッコいいのは重要です。これは独身奇族的な感想ですが、一般的な CLI の利点は作業を自動化しシステムに組み込めるところでしょう。update を自動で行うかどうかはまた別の話ですが、ここでは update 作業を CLI で行えるか検証してみます。

画像に alt 属性が指定されていません。ファイル名: matrix-356024_640.webp
マトリックス的なね

 作業は 「Lightsail でスナップショットを作成」 → 「Wordpress の Update」 という流れで行きます。使うツールは AWS CLI と WP CLI になります。では詳しく見ていきます。

前提条件

 以下のような条件で進めていきます。

$ aws --version
aws-cli/2.1.2 Python/3.7.4 Darwin/19.6.0 exe/x86_64
$ wp --version
WP-CLI 2.4.0
$ wp core version
5.6.2

Lightsail でスナップショットの取得

 まずは Lightsail のスナップショットを取得します。バックアップの方法は色々ありますが、サーバーのイメージごと取得する方法で実施します。バックアップは作業するレイヤーの低レイヤーで取得するようにしています。今回であれば、作業するレイヤーは MW レイヤーなので、その OS レイヤーをバックアップします。

$ aws lightsail create-instance-snapshot \
--instance-snapshot-name doc-sin.life_wp5.6.0_update_wp57 \
--instance-name doc-sin.life_wp5.6.0

 スナップショット作成をリクエストしてから数分でスナップショットが利用可能になります。願わくば使いたくはありませんが….

$ aws lightsail get-instance-snapshot \
--instance-snapshot-name doc-sin.life_wp5.6.0_update_wp57 \
--query 'instanceSnapshot.state'
"available"

WordPress の Update

 ここから update 作業です。まずはサーバーに SSH ログインします。

$ ssh bitnami@XX.XX.XX.XX

 そして現状のチェックです。現在のバージョンは 5.6.2 です。

$ wp core version
5.6.2

 現在 5.7 のアップデートが控えています。今回はこれを適用していきます。

$ wp core check-update
+---------+-------------+--------------------------------------------------------------+
| version | update_type | package_url                                                  |
+---------+-------------+--------------------------------------------------------------+
| 5.7     | major       | https://downloads.wordpress.org/release/ja/wordpress-5.7.zip |
+---------+-------------+--------------------------------------------------------------+

 いよいよアップデートを実行します。

$ wp core update

 エラーが出ました。大抵の場合一発でうまくいかない。

Updating to version 5.7 (ja)...
PHP Warning:  Declaration of WP_CLI\Core\CoreUpgrader::download_package($package, $check_signatures = true) should be compatible with WP_Upgrader::download_package($package, $check_signatures = false, $hook_extra = Array) in phar:///opt/bitnami/apps/wordpress/bin/wp-cli.phar/vendor/wp-cli/core-command/src/WP_CLI/Core/CoreUpgrader.php on line 30
Warning: Declaration of WP_CLI\Core\CoreUpgrader::download_package($package, $check_signatures = true) should be compatible with WP_Upgrader::download_package($package, $check_signatures = false, $hook_extra = Array) in phar:///opt/bitnami/apps/wordpress/bin/wp-cli.phar/vendor/wp-cli/core-command/src/WP_CLI/Core/CoreUpgrader.php on line 30
https://downloads.wordpress.org/release/ja/wordpress-5.7.zip から更新をダウンロード中...
更新を展開しています…
Error: ディレクトリを作成できませんでした。

 デバックモードで再実行をしてみます。

$ wp core update --debug
(...)
Debug (bootstrap): Adding deferred command: google-site-kit reset (parent: google-site-kit, callable: object, args: {"is_deferred":true}) (0.992s)
Debug (commands): Adding command: reset in google-site-kit Namespace (0.992s)
Debug (bootstrap): Running command: core update (0.993s)
Updating to version 5.7 (ja)...
PHP Warning:  Declaration of WP_CLI\Core\CoreUpgrader::download_package($package, $check_signatures = true) should be compatible with WP_Upgrader::download_package($package, $check_signatures = false, $hook_extra = Array) in phar:///opt/bitnami/apps/wordpress/bin/wp-cli.phar/vendor/wp-cli/core-command/src/WP_CLI/Core/CoreUpgrader.php on line 30
Warning: Declaration of WP_CLI\Core\CoreUpgrader::download_package($package, $check_signatures = true) should be compatible with WP_Upgrader::download_package($package, $check_signatures = false, $hook_extra = Array) in phar:///opt/bitnami/apps/wordpress/bin/wp-cli.phar/vendor/wp-cli/core-command/src/WP_CLI/Core/CoreUpgrader.php on line 30
Using cached file '/home/bitnami/.wp-cli/cache/core/wordpress-5.7-ja.zip'...
更新を展開しています…
Error: ディレクトリを作成できませんでした。

 何の役に立たないデバックモードです。何も情報は増えていません。
 ログを見る限りファイルのダウンロードは出来ており、それを展開するところで失敗しているようです。ではどこに展開しようとしているのでしょうか。wp-content 配下にそれらしきディレクトリがありました。名前は upgrade で、オーナーも daemon で、実行ユーザー bitnami にディレクトリの作成権限がありません。

$ ls -ld apps/wordpress/htdocs/wp-content/upgrade/
drwxrwxr-x 3 daemon daemon 4096 Apr  6 23:14 apps/wordpress/htdocs/wp-content/upgrade/

 以下のようにオーナーを bitnami に変更してみます。

$ sudo chown bitnami apps/wordpress/htdocs/wp-content/upgrade/
$ ls -ld apps/wordpress/htdocs/wp-content/upgrade/
drwxrwxr-x 3 bitnami daemon 4096 Apr  6 23:14 apps/wordpress/htdocs/wp-content/upgrade/
$ wp core update --debug
(...)
Using cached file '/home/bitnami/.wp-cli/cache/core/wordpress-5.7-ja.zip'...
更新を展開しています…
PHP Warning:  copy(/opt/bitnami/apps/wordpress/htdocs/wp-content/languages/ja-7f13c36c641b114bf18cd0bcc9ecc7e0.json): failed to open stream: Permission denied in /opt/bitnami/apps/wordpress/htdocs/wp-admin/includes/class-wp-filesystem-direct.php on line 309
(...)
<p>更新が必要な翻訳が一部あります。更新が終わるまでしばらくお持ちください。</p>
(...)
</div><p>翻訳の更新に失敗しました。</p>
</div>Error: ファイルをコピーできませんでした。 "ja-7f13c36c641b114bf18cd0bcc9ecc7e0.json"

 先程のエラーは無くなりましたが、今度は翻訳ファイルの更新に失敗しているようです。ただ WordPress の更新は成功しているようです。

$ wp core version
5.7

 翻訳ファイルの更新の失敗もパーミッション関係のようです。以下のように翻訳ファイルと思われるファイルのオーナーは全て daemon でした。ただ今回の目的は WordPress の update なのでここでは対応しないでおきます。

$ ls -l apps/wordpress/htdocs/wp-content/languages/ja-*
-rw-rw-r-- 1 daemon daemon  2730 Mar  3 22:27 apps/wordpress/htdocs/wp-content/languages/ja-0cc31205f20441b3df1d1b46100f6b8d.json
-rw-rw-r-- 1 daemon daemon   498 Mar  3 22:27 apps/wordpress/htdocs/wp-content/languages/ja-0ce75ad2f775d1cac9696967d484808c.json
-rw-rw-r-- 1 daemon daemon   750 Mar  3 22:27 apps/wordpress/htdocs/wp-content/languages/ja-0eebe503220d4a00341eb011b92769b4.json

update 後の不具合

不具合1

 Chrome で記事編集画面が真っ白でした。割とよく見る事象のように思えます。サイトの表示に問題はなく、クイック編集からの編集も問題ありませんでした。他のブラウザでは問題なく編集画面が表示されたので、キャッシュが悪さしていたようで、キャッシュを削除したら解消しました。

不具合2(追記)

 こちらはアップデートして後日見つかったもの。Jetpack のサイトヘルスステータスで以下のような問題が出ていた。

ふむ….パーミッション絡みのようです。対象のファイルのパーミッションを確認してみるとやはり daemon ユーザーに更新権限がありませんでした。

$ ls -l apps/wordpress/htdocs/wp-config-sample.php 
-rw-rw-r-- 1 bitnami bitnami 3931 Apr  6 23:14 apps/wordpress/htdocs/wp-config-sample.php

daemon ユーザーと bitnami ユーザーの権限問題はやはりどうにかしないといけなそうです。ここでは以下のようにグループを daemon に変更して解消しました。少し乱暴ですが、全てのファイルのグループを daemon に更新しています。

$ pwd
/home/bitnami/apps/wordpress/htdocs
$ sudo chgrp -R daemon .

まとめ

 概ね問題なく CLI のみで upgate 出来ましたが、wordpress 関連のファイルのパーミッションは整理したほうがいいですね。管理画面からの操作では daemon , CLI の操作では bitnami となるので、どちらかのユーザーを一方のグループに追加するのが妥当なところでしょうか。全体のパーミッションを確認してから方針を決めてみようと思います。

 追記した不具合から以下のようにしようと思います。

方針
  • CLI から update が出来るように bitnami ユーザーを daemon グループに追加する。
  • CLI からの update 後に管理画面からの操作に支障がないように wp 関連のファイルのパーミッションを以下のように修正する。
    • 所有者を bitnami 、所有グループを daemon
    • daemon グループで更新可能

参考サイト

AWS CLI Command Reference (lightsail)

WP-CLI Commands (wp core update)