🐾
PHPMyAdminにログインしないとAPIエラーになる怪奇現象を解決した話 🕵️♂️
PHPMyAdminにログインしないとAPIエラーになる怪奇現象を解決した話 🕵️♂️
なにこれ?謎すぎる☺️!
システム開発をしていると、時々「なんで???」という現象に遭遇しますよね。
今回もそんな謎現象の一つでした。
ちょっとたのしかったので、ブログ書きました。
現象:
- APIを叩く → エラーになる 😭
- PHPMyAdminにログインする → APIが正常動作する ✨
- 「は?なんで?☺️」
環境情報 🛠️
まずは環境から。
- フロントエンド: Angular(S3 + CloudFront)
- バックエンド: Python + AWS Chalice(Lambda)
- データベース: MySQL 8.0(研究開発&節約の観点で EC2 上で運用。)
- DB接続: PyMySQL
一見普通の構成。
PHPMyAdminについては、データ確認・操作がしやすいようにと、EC2にいれて動かしてました。
エラーの内容 💥
Lambda関数のCloudWatchログには、こんなエラーが出ていました。
RuntimeError: 'cryptography' package is required
for sha256_password or caching_sha2_password auth methods
「cryptographyパッケージが必要」というエラー。
普段なら、なーんだ、パッケージ不足かーでおわるのですが。。
PHPMyAdminにログインするとこのエラーでない。
なんで???
原因を探る旅 🔍
仮説:同じユーザーの認証キャッシュ?
最初に考えたのは、「PHPMyAdminとAPIが同じDBユーザーを使ってるのかな?」でした。
調べてみると、両方とも同じユーザー。
MySQL 8.0の認証の仕組み
MySQL 8.0から、デフォルトの認証方式が変わったっぽ。
-
古い方式:
mysql_native_password
-
新しい方式:
caching_sha2_password
新しい方式の特徴:
- より安全な暗号化
- 初回接続時にRSA暷号化が必要
- 認証成功後はキャッシュを使用 (←あ。
実際の流れ(超簡易)
1. APIの初回接続(失敗)
Lambda関数 → MySQL
API「接続したい!」
MySQL「RSA暗号化して!」
PyMySQL「cryptographyパッケージがない...無理...」
→ エラー
2. PHPMyAdminログイン(成功)
PHPMyAdmin → MySQL
わたし「接続したい!」
MySQL「RSA暗号化して!」
PHPMyAdmin「OK!」(適切なライブラリを持っている)
→ 認証成功
→ MySQLがキャッシュに保存
3. APIの再接続(成功)
Lambda関数 → MySQL
API「今度は接続したい!」
MySQL「あ、このユーザー認証済みだわ。OK!」
PyMySQL「わーい!」
→ 接続成功
実験で確かめてみた手順 🧪
想像だけじゃつまらないので、実験してみました。
実験手順
-
キャッシュをクリア
FLUSH PRIVILEGES;
-
APIをテスト → エラー発生 ❌
-
PHPMyAdminで何かクエリ実行
SELECT 1;
-
APIを再テスト → 成功! ✅
解決方法 🎯
原因がわかれば解決は簡単。
cryptographyパッケージを追加
requirements.txt
に以下を追加:
cryptography>=3.4.8
学んだこと 📚
1. MySQL 8.0の認証変更は要注意
MySQL 8.0から認証方式が変わったのはなんとなく知ってましたが、まさかこんな現象を引き起こすとは。
2. エラーメッセージは正直
'cryptography' package is required
エラーメッセージは正直でした。
必要なパッケージがないって言ってるんですから。
ただ、「なぜPHPMyAdminログインで直るのか」がわからなくて混乱しました。
まとめ 🎉
怪奇現象の正体は MySQL 8.0 の認証キャッシュ。
問題:
- PyMySQLにcryptographyパッケージがない
- MySQL 8.0のcaching_sha2_password認証で必要
- PHPMyAdminログインで一時的に回避されてしまう
解決:
- cryptographyパッケージを追加
皆さんも似たような現象に遭遇したら、認証周りを疑ってみてください!
この記事が誰かのお役に立ったらうれしいです 🤝
Discussion