Google環境に色々な物を置いているけどセキュリティ情報をべた書きしたりするのは嫌なのでSecret Managerを活用するわけだけど、alembicってSQL接続情報をiniファイルに書くスタイルなので何とかならないかなぁと検討。
で、alembicを読んでみると、env.py でiniを読んで接続とかを作っている。
なので、ここで接続情報を上書きしてしまえばOK。
1 2 3 4 5 6 7 8 9 |
# <- ここは最初からあるコード if config.config_file_name is not None: fileConfig(config.config_file_name) # -> # この場所でこんな感じに from google.cloud import secretmanager client = secretmanager.SecretManagerServiceClient() password = client.access_secret_version(name="projects/{}/secrets/{}/versions/latest".format(project_id, secret_name)).payload.data.decode("UTF-8") config.set_main_option("sqlalchemy.url", "mysql+pymysql://{}:{}@{}:{}/{}".format(username, password, host, port, database)) |
ssl接続の場合はファイルから読むしかないのはURLよりも先の問題なので小手先のコードでは対応出来ず。。。
URLの最後に ?ssl_key=privkey.pem&ssl_cert=cert.pem&ssl_ca=ca.pem みたいな感じで追加、オレオレ証明書の場合は更にssl_check_hostname=Falseも追記する。
まぁ、証明書関係はアプリデプロイもマイグレーションもCloud Buildにして、処理中にSecret Managerで取ってきてローカルやコードリポジトリには置かない対応で多少改善するかと。 デプロイ時に取ってきて、外部アクセス出来ないディレクトリに設置する系。
(7)