【障害対応】WordPressに画像がアップロード出来なくなりログインも出来なくなった(リダイレクトループ)

以前、WordPressを使ってECサイトを構築し納品した取引先(友人)から「画像がアップロード出来なくなって消えた」という報告があったので見に行ったところ、ログインも出来なくなってました。何があった?






症状は通称「リダイレクトループ」

ログイン出来ないというのがどういうことかというと、ログイン画面は表示されます。







ところが、正しいユーザー名とパスワードを入力してログインボタンを押しても、再びログイン画面に戻ってきてしまうのです。これを通称「リダイレクトループ」と呼ぶらしいのですが、プログラム的に考えるとログイン後のセッション管理に問題が生じていると考えるのが普通です。データベースにセッション情報が保存出来ないか、Cookieに保存出来ないか、キャッシュが残ってしまっていて上手くセッション情報にアクセス出来ないか。

多くの場合は設定の不備によるもののようなのですが、今回のように「今まで普通に使えていたのに急に使えなくなった」場合の通常は対策も次のうちのどれかです。


  1. Cookieを削除する
  2. キャッシュを削除する
  3. プラグインを停止してみる



クッキーもキャッシュも関係なかった

というわけでCookieをキャッシュの削除を繰り返しながら散々ログイン処理を行いましたが、一向に改善する見込みがありません。直前にテーマやプラグインの更新があったようですが、直近の更新と障害発生とで5日ほど間があり直接関係していると考えるのは難しそうです。

かくなる上はプラグインを外しながら試すしかないと考えたのですが、管理画面にアクセス出来ないので難しい。一応、リネームすれば一時的に無効にすることも出来るようですが、それよりもコマンドラインでやった方が良いんじゃね?ということでWP-CLIを使うことにしました。


WordPressをコマンドラインで操作する | Studio947 狩野祐東・狩野さやかの本



コマンドライン1発目でエラー表示

WordPress データベースエラー: Disk full
(/opt/bitnami/mariadb/tmp/#sql_409_0.MAI); waiting for someone to free
some space... (errno: 28 "No space left on device") for query(以下略)







簡単に言えばストレージが満杯になってこれ以上データを保存出来ませんよ、ってことでした。言われてみればそうかって話ですけど車のガス欠みたいなもんで、最初はどっか壊れたかって難しく考えちゃいますよ。なかなか思いつかないですよねー。

ストレージが満杯なのでデータ保存出来ない、だからセッション情報をデータベースに書き込めず、ログイン処理してもログインしていることが保持出来なかったんですね。想定外の理由でしたが、結果的には予想が合ってました。そういうこともあるのか。



対策:料金プランの変更

画像ファイル、音声ファイルを多用するECサイトだったこともあり、想定よりも早く20GBを使い切ってしまったようです。メディアファイルディレクトリを見る限り1ヶ月に3GBずつ使ってちょうど半年。いやあ使いすぎだろう。ひとまず料金プランを変更してログイン出来る状態を確保した上で、ファイルの管理に気をつけるようアドバイスして終わりました。

ちなみにLightsailのアップグレードは超簡単です。スナップショット作ってそのスナップショットから新インスタンスを立ち上げて、静的IPを付け替えるだけ。


Lightsailのアップグレード
以下の手順で驚くほどあっさり移行出来ました。

1. 旧インスタンスを停止する(3分)
2. 旧インスタンスのスナップショットを作成(10分)
3. スナップショットから新しいインスタンスを作成
4. 静的IPから旧インスタンスをデタッチ
5. 静的IPに新インスタンスをアタッチ

実質的なダウンタイムは15分ぐらい。ほとんどはスナップショット作成の時間です。

Amazon Lightsail インスタンスをアップグレードしました。 – NOBODY:PLACE




今後の対策もしっかりね

「気をつけるように」と言ってもWordPressの管理画面にストレージの残容量が表示されるわけでもないので、こちらの記事を参考にCloudWatchで監視する設定を組み込みました。


LightsailではCPU使用率とネットワークに関するメトリクスはデフォルトで取得することができますが、ストレージやメモリ関連のメトリクスが取得できないです。より細かいメトリクスを取得できるように、CloudwatchAgnetを使ってLightsailのインスタンスからカスタムメトリクスを取得し、運用状況が確認できるようにしてみます。

Cloudwatch Agentを使ってLightsailのカスタムメトリクスを取得する – Gattino


で、ストレージの残容量が20%を切ったらメールで通知するように設定しつつ、このダッシュボードを共有して管理者がいつでも閲覧出来るように設定。


選択した特定の E メールアドレスとダッシュボードを共有するには、このセクションのステップを使用します。

CloudWatch ダッシュボードの共有 – Amazon CloudWatch


これで次の障害は未然に防げるでしょう。



やれやれ、直って良かった。静的ファイルは月額料金を押し上げるから地味にコスト要因になるんですよねえ。音楽系のオンラインショップはその辺のやり取りが大変です。皆さんある程度割り切って予算割いてるんだとは思いますけども。