🔑

.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