🔑
.envでpassword authentication failed for userにハマった
はじめに
RDS(Postgres)にアクセスしようところ、password authentication failed for userのエラーから抜け出せずにハマってしまった
やったこと
RDSに接続するため、同じネットワークのEC2のスクリプトから以下の情報でアクセスしようとした(内容は適当)
.env
DB_HOST="foo.bar.ap-northeast-1.rds.amazonaws.com"
DB_NAME="db"
DB_USER="admin"
DB_PORT="5432"
DB_PASSWORD="ABC$def:123"
全ての値をコンソールのRDSの設定やSecrets Managerで確認した上で入れていたが、EC2からアクセスできなかった
試しに踏み台サーバーを立てて、それに対してSQLクライアントソフトで接続を試みたところ、こちらは通った
原因
シェルでダブルクォーテーション内の$以下が変数として展開されていた
echo $def # 何も表示されない=空文字
export DB_PASSWORD="ABC$def:123"
echo $DB_PASSWORD # $defが変数として空文字に展開され、ABC:123が表示される
ABC:123
パスワードをスクリプト上でprintすることで値が違うことに気づきました
解決策
シングルクォーテーションで囲む
.env
DB_PASSWORD='ABC$def:123'
おわりに
direnvという.envを読み取ってシェルの環境変数にセットしてくれるツールを使っていたため、変数が展開されることに気付きづらかった
また、パスワードはprintするべきではないと思っていたため、なかなか気づけなかった(printはデバッグのみにしましょう)
Discussion