CloudSQL の接続情報を渡すときは URL エンコードが必要(になることがある)
CloudSQLに限ることではないが、CloudSQLのパスワードポリシーに従っていると無意識にこれを踏み抜くのでタイトルに入れた。
パスワードポリシーでは大文字小文字数字の強制意外にも記号を入れることも強制される。 このルールに従ってパスワード生成機能を使うと、いろんな記号が入ったパスワードが作られる。 このパスワードを使った URI 形式の接続情報は無効になりやすい。 しかもエラーログからわかりづらい。ユーザー名が空、DB文字列が空、なので使っているSDKやマイグレーション機能によってはデフォルト値が使われてしまう。 その結果、接続不良の真の原因が分かりにくかったということが起きた。
なのでURLエンコードしてあげる必要があった。
#!/usr/bin/env python3
"""パスワードをURLエンコードするスクリプト"""
from urllib.parse import quote_plus
import getpass
password = getpass.getpass("パスワードを入力: ")
print(f"\nエンコード結果: {quote_plus(password)}")