🐾

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「わーい!」
→ 接続成功

実験で確かめてみた手順 🧪

想像だけじゃつまらないので、実験してみました。

実験手順

  1. キャッシュをクリア

    FLUSH PRIVILEGES;
    
  2. APIをテスト → エラー発生 ❌

  3. PHPMyAdminで何かクエリ実行

    SELECT 1;
    
  4. 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