「なぜか動かなくなった」の問題を切り分ける
対象読者
- プログラミングなんも分からんという人
- エラーが怖い人
- なぜか動かなくなったと思っている人
例えばこんなとき
あなたは、次のようなエンジニアです
- フロントエンド寄り
- バックエンドはあまり分からない
- Dockerはコピペで
docker compose up -dしている
環境は以下のような形です
- フロントエンド
- バックエンド: JS系
- DB: RDB
- Docker内で実行
発生した問題
「なぜか」ログインができない
「なぜかログインができない...」と思ったとき、今回のような環境では疑うべき点が複数あります。
- パスワードなどの認証情報が間違っている
- フロントエンドの問題
- バックエンドの問題
- DBの問題
このように問題がどこで起きているかを特定することがまず必要です。
そもそもどこまで動いている?
どこまで動いているかを確認することは問題を切り分けるときに使える有効な方法です。
今回の例では、次のような部分を確認するとよいでしょう
- フロントは表示されるのか?
- Dockerは起動しているのか?
- DBコンテナは起動しているのか?
- Backendコンテナは起動しているのか?
- 起動したものは正常に動いているのか?
まずはエラーログが出ていないかを確認しましょう。
- フロントエンド
- Chrome Dev Toolsなどのconsoleタブを見るとエラー(=ヒント)が出ているかもしれません。
- バックエンド, DB
- Dockerの操作に慣れていなければDocker Desktopのログから見てもいいですし、
docker compose upで-dオプションを使わないで起動してみると見やすいはずです。
- Dockerの操作に慣れていなければDocker Desktopのログから見てもいいですし、
ログを確認したら
ログを確認し、エラーが見つかったとします。
このとき、すぐに直そうとしなくても大丈夫です。
- 毎回同じエラーが出ているのか
- 起動時にでているのか、処理の途中でているのか
といった状況の整理が最も大切です。
問題をさらに切り分ける
ログを見ることで「何かがおかしい」ことはわかりました。
しかし、まだ原因は特定できていません。
分かったのは
- フロントエンドの表示はOK
- ログイン処理の途中で失敗している
つまり、問題はフロントエンドではなく、バックエンドかDB周辺にありそうと推測できます。
今回のケースではどうだったか
Dockerのログを確認したところ、Backend, DB双方のコンテナが正常に起動していないことがわかりました。
Backend起動ログに、レコードの挿入に失敗したというエラーログがありました。レコードの挿入はDB操作であるため、アプリケーションのロジックとDB側の状態が不整合な可能性が高いと推測しました。また、他の人は動作していたため、Databaseのtableのmigrationが現行のものと乖離しているのではないかと推測し、確認を開始します。
確認のステップ
- データベースに接続
- テーブル一覧を表示
- 該当テーブル自体が存在しない可能性を確認
- 該当テーブルの定義を確認
- 該当テーブルのcolumnが問題になっている可能性を確認
今回は、3で定義が異なっていることが確認できたため、これが根本的な原因であると判断できました。migrationをdown→upさせることで解決できますね。
さいごに
今回はmigrationでしたが、設定ファイル・環境変数・起動順などでも同じ考え方が使えます。
- どこまで動いているかを確認する
- 動いていない場所を特定する
- 一気に原因を探そうとしない
という考え方でした。
分からないものであっても、「ここはOK」「ここはOKじゃない」を判断することで問題は小さくなっていきます。
Discussion